Zeichenfolge zu Binär

19

Dies ist eine Code-Golf-Herausforderung. Schreiben Sie, wie der Titel schon sagt, ein Programm, um eine Folge von ASCII-Zeichen in binäre Zeichen umzuwandeln.

Beispielsweise:

"Hello World!" sollte sich verwandeln in 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Hinweis: Ich interessiere mich besonders für eine Pyth-Implementierung.

ericmarkmartin
quelle
1
Wir hatten umgekehrt gefragt: codegolf.stackexchange.com/questions/35096/…
hmatt1
1
Ich habe bemerkt, dass. Es gibt eine Anekdote, warum ich diese Frage gestellt habe. Ich ermutigte meinen Freund, Programmieren zu lernen, und er nahm letzten Sommer an einem Java-Kurs teil, in dem jeder Schüler ein Projekt auswählen musste. Er sagte mir, er wolle Text ins Binäre übersetzen, was ich dann (zu seinem Entsetzen) in Python 3 in 1 Zeile (einer sehr langen Zeile) tat. Ich finde es unglaublich, dass seine Projektidee auf 8 Bytes reduziert werden kann.
Ericmarkmartin
1
das ist cool, danke fürs teilen! Ich mag einfachere Fragen wie diese, weil dadurch mehr Menschen die Möglichkeit haben, sich zu beteiligen, und viele Inhalte in Form von Antworten generiert werden.
hmatt1
1
Muss es ASCII sein? Wenn also eine Technologie nicht ASCII-kompatibel ist, können die Ergebnisse dies widerspiegeln?
Shaun Bebbers
1
Können wir annehmen, dass ASCII 32-127 druckbar ist? Wenn ja, können binäre Zeichenfolgen aus 7 Zeichen mit Links-Null-Abstand bestehen?
640 KB,

Antworten:

13

CJam, 8 Bytes

l:i2fbS*

Kinderleicht:

l:i           "Read the input line and convert each character to its ASCII value";
   2fb        "Put 2 on stack and use that to convert each ASCII value to base 2";
      S*      "Join the binary numbers by space";

Probieren Sie es hier aus

Optimierer
quelle
13

Python 3, 41 Bytes

print(*[bin(ord(x))[2:]for x in input()])

Wie die Antwort von KSFT , aber ich dachte, ich würde darauf hinweisen, dass raw_input -> inputPython 3 auch hier einen Vorteil hat, weil es für Splat sorgt print.

Sp3000
quelle
8

Pyth, 10 Bytes

jdmjkjCd2z

Python-Mapping und Erklärung:

j           # join(                               "Join by space"
 d          #      d,                             "this space"
 m          #      Pmap(lambda d:                 "Map characters of input string"
  j         #                    join(            "Join by empty string"
   k        #                        k,           "this empty string"
    j       #                        join(        "This is not a join, but a base conversion"
     C      #                             Pchr(   "Convert the character to ASCII"
      d     #                                  d  "this character"
            #                                 ),
     2      #                             2       "Convert to base 2"
            #                            )
            #                        ),
  z         #           z)))                      "mapping over the input string"

Eingabe ist die Zeichenfolge, die ohne Anführungszeichen konvertiert werden muss.

Probieren Sie es hier aus

Optimierer
quelle
10
Ist asdfghjlkl auch ein gültiges Pyth-Programm? Was tut es?
Fehler
@flawr schaden beim versuchen? ;)
Optimierer
2
@flawr Kompiliert zur Python Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), whee d = '' und k = ''. Also nein, es ist überhaupt nicht gültig.
isaacg
12
@ ericmark26 Sieh dich in deinem Zimmer oder Büro um und zerschmettere alles, was du findest, auf deiner Tastatur, um zu sehen, ob es interpretiert wird. Finde heraus, was es tut und wiederhole es dann mit dem nächsten Objekt. Versuchen Sie es mit verschiedenen Drehungen, wenn Sie keine Zeit mehr haben.
Globby
2
@ ericmark26 Ich denke, der beste Weg, sich an Pyth zu gewöhnen, ist, einige einfache Python-Programme zu nehmen und sie in Pyth zu übersetzen.
Isaacg
4

Python 3 - 43 Bytes


print(*map("{:b}".format,input().encode()))

Nicht ganz der kürzeste, aber ein interessanter Ansatz IMO. Es hat den zusätzlichen Vorteil, dass, wenn die Anzahl der signifikanten Bits variiert, EG das Hi!Auffüllen mit Nullen trivial ist (2 weitere Bytes im Gegensatz zu 9 für .zfill(8)):

print(*map("{:08b}".format,input().encode()))
Matsjoyce
quelle
3

Python - 52

print" ".join([bin(ord(i))[2:]for i in raw_input()])

Ich werde daran arbeiten, dies in Pyth zu übersetzen. Jemand anderes hat bereits eine Pyth-Antwort gegeben.

Wenn es Ihnen egal ist, ob es sich um ein vollständiges Programm oder ein E / A-Format handelt und Sie Python 3 verwenden, können Sie dies in 23 Bytes tun:

[bin(ord(i))for i in x]

x ist der Eingang.

Ich weiß, dass dies nicht zählt, da der Interpreter nicht veröffentlicht wurde, bevor die Herausforderung veröffentlicht wurde, aber hier ist es in KSFTgolf:

oan
KSFT
quelle
3

Ruby, 34 28 24 Bytes

$<.bytes{|c|$><<"%b "%c}

Übernimmt die Eingabe über STDIN. 6 Bytes gespart danke für AShelly und weitere 4 danke an britishtea.

Martin Ender
quelle
Trimmen um 6 mit$<.each_byte{|c|$><<"%b "%c}
AShelly
Sie können einige weitere Zeichen abschneiden, indem Sie String#bytesanstelle von verwenden String#each_byte. Die Blockform ist veraltet, aber es funktioniert immer noch :)
britishtea
@britishtea Oh, schön. Danke dir!
Martin Ender
2

Matlab

Dies ist eine anonyme Funktion

f=@(x) dec2bin(char(x))

Nutzung ist f('Hello World') .

Alternativ funktioniert nur , wenn xals Zeichenfolge Hello World!im Arbeitsbereich definiert ist dec2bin(char(x)).

David
quelle
Ich bin mir nicht sicher, wie ich dies bewerten soll, da ich nicht sicher bin, wie ich die Eingabe erhalten kann. Irgendwelche Kommentare?
David
Warum char? Ich denke du meinstdec2bin(x)-'0'
Luis Mendo
Weil ich nicht so schlau bin!
David
Mein Punkt ist: char(x)Wenn xschon ein String ist, macht das nichts. Sie können es also entfernen, um Platz zu sparen. Auf der anderen Seite ist das Ergebnis dec2bineine Zeichenfolge, und ich denke, die Ausgabe sollte Zahlen sein
Luis Mendo
Ich verstehe, und Sie haben natürlich Recht. Matlab macht es leicht, Datentypen manchmal zu vergessen.
David
2

J - 9

1":#:3&u:

Keine Ahnung, wie man das hintereinander macht, ohne die Länge des Codes zu verdoppeln, ich brauche J-Gurus, um es mir zu sagen :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001
Swish
quelle
2
Sie können ".am Anfang hinzufügen . Es wertet Ihr Ergebnis so aus, dass es in einer Zeile und durch Leerzeichen getrennt ist. Auch ist kürzer Base10 Zahlen mit den Ziffern base2 zu erstellen: 10#.#:3&u:.
Randomra
2

Java - 148 Bytes

public class sToB{public static void main(String[] a){for(int i=0;i<a[0].length();i++){System.out.print(Integer.toString(a[0].charAt(i) ,2)+" ");}}}

Bearbeitet, um die gesamte Datei einzuschließen

Bryan Devaney
quelle
2
Ich denke, OP will ein volles Programm, nicht nur einen Ausschnitt. Außerdem kann man viel mehr Golf spielen, als man denkt.
Rodolfo Dias
Das ist das vollständige Programm. Wenn Sie es in eine Hauptklasse einordnen, wird es ausgeführt. Zum besseren Golfen, wahrscheinlich, aber ich konnte nicht erkennen, wie.
Bryan Devaney
1
Das gesamte Programm umfasst auch die Hauptklasse.
Rodolfo Dias
könnte kürzer sein mit for(char c:a[0].toCharArray()){oder sogar, for(byte b:a[0].getBytes()){da die Eingabe ascii ist, vorausgesetzt ein nicht-utf-16-Maschinengebietsschema
njzk2
1
Sie können das entfernen publicund den Programmnamen auf ein einzelnes Zeichen verkürzen, um mehr Bytes zu gewinnen. Plus, (String[]a)wird vom Compiler perfekt akzeptiert und bringt Ihnen ein weiteres Byte ein.
Rodolfo Dias
2

JavaScript ES6, 63 65 Bytes

alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))

Dies ist ziemlich lang, dank der langen Funktionsnamen von JavaScript. Das folgende Stack-Snippet ist das grobe ES5-Äquivalent, sodass es in jedem Browser ausgeführt werden kann. Vielen Dank an edc65 für die Golfverbesserungen.

alert(prompt().split('').map(function(e){return e.charCodeAt().toString(2)}).join(' '))

NinjaBearMonkey
quelle
1
[for of]ist etwas kürzer als [...].mapdie Aufzählung von Zeichen in Zeichenketten:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65
Sie können Golf aus zwei Bytes durch den Ersatz .join(' ')mit .join` ` . Sie können eine Menge Bytes promptalert
abwerfen,
2

Scala - 59 - 55 Bytes

readLine().map(x=>print(x.toByte.toInt.toBinaryString))

Normalerweise sollte man foreach und nicht map verwenden.

Dominik Müller
quelle
2

8088 Maschinencode, IBM PC DOS, 33 31 Bytes *

Auflistung:

D1 EE           SHR  SI, 1          ; point SI to DOS PSP (80H)
AD              LODSW               ; load input string length into AL, SI to 82H 
8A C8           MOV  CL, AL         ; set up loop counter 
49              DEC  CX             ; remove leading space/slash from char count 
            LOOP_CHAR: 
B3 08           MOV  BL, 8          ; loop 8 bits 
AC              LODSB               ; load next char 
            LOOP_BIT: 
D0 C0           ROL  AL, 1          ; high-order bit into low-order bit 
B4 0E           MOV  AH, 0EH        ; BIOS display character function 
50              PUSH AX             ; save AH/AL 
24 01           AND  AL, 1          ; mask all but low-order bit 
04 30           ADD  AL, '0'        ; convert to ASCII 
CD 10           INT  10H            ; write char to display 
58              POP  AX             ; restore AH/AL 
4B              DEC  BX             ; decrement bit counter 
75 F1           JNZ  LOOP_BIT       ; loop next bit      
B0 20           MOV  AL, ' '        ; display a space 
CD 10           INT  10H            ; write space to display 
E2 E8           LOOP LOOP_CHAR      ; loop next char 
C3              RET                 ; return to DOS 

Komplette ausführbare PC-DOS-COM-Datei, Eingabe erfolgt über Kommandozeile.

Mit führenden Nullen:

Bildbeschreibung hier eingeben

Laden Sie ASCBIN.COM herunter und testen Sie es .

Oder 39 Bytes ohne führende Nullen:

Bildbeschreibung hier eingeben

Laden Sie ASCBIN2.COM herunter und testen Sie es .

* Da mir nicht explizit klar war, ob führende Nullen zulässig sind, poste ich Versionen in beide Richtungen.

640 KB
quelle
2

MITS Altair 8800 , 0 Bytes

Die Eingabezeichenfolge befindet sich an der Speicheradresse #0000H( zulässig ). Binäre Ausgabe über E / A-Anzeigen an der Vorderseite D7-D0.

Zum Beispiel tun RESET, dann EXAMINE, um das erste Byte zu sehen, gefolgt von der Wiederholung EXAMINE NEXT, um den Rest zu sehen.

"H" = 01 001 000:

Bildbeschreibung hier eingeben

"e" = 01 100 101:

Bildbeschreibung hier eingeben

"l" = 01 101 100:

Bildbeschreibung hier eingeben

Probieren Sie es online!

Natürlich nicht im Wettbewerb. :)

640 KB
quelle
1

Haskell, 65

m s=tail$do c<-s;' ':do j<-[6,5..0];show$mod(fromEnum c`div`2^j)2

starker Gebrauch der Liste Monade. Es konnte nicht in Listenverständnisse konvertiert werden, da die letzten Anweisungen keine waren return.

stolzer haskeller
quelle
1

C ++ - 119 Bytes

Speicher freigeben? Was ist das?

#include<cstdio>
#include<cstdlib>
int main(int c,char**v){for(*v=new char[9];c=*(v[1]++);printf("%s ",itoa(c,*v,2)));}

(MSVC kompiliert den Code mit Warnung)

BMac
quelle
1
C-Fassung, kürzermain(int c,char**v){char x[9];for(;c=*(v[1]++);printf("%s ",itoa(c,x,2)));}
n̴̖̋h̷͉̃ã̷͉h̷̭̿d̸̡̅ẗ̵̨́
1

Commodore VIC-20 / C64 / 128 und TheC64Mini, 101 tokenisierte BASIC-Bytes

Hier ist die verschleierte Auflistung mit den Schlüsselwortabkürzungen von Commodore BASIC:

 0dEfnb(x)=sG(xaNb):inputa$:fOi=1tolen(a$):b=64:c$=mI(a$,i,1):fOj=0to6
 1?rI(str$(fnb(aS(c$))),1);:b=b/2:nEj:?" ";:nE

Hier zur Erläuterung die nicht verschleierte symbolische Auflistung:

 0 def fn b(x)=sgn(x and b)
 1 input a$
 2 for i=1 to len(a$)
 3 let b=64
 4 let c$=mid$(a$,i,1)
 5 for j=0 to 6
 6 print right$(str$(fn b(asc(c$))),1);
 7 let b=b/2
 8 next j
 9 print " ";
10 next i

Die Funktion fn bder Linie erklärt Null annimmt einen numerischen Parameter von xdem ANDmit dem Wert von ed b; SGN wird dann zum Konvertieren x and bin 1oder verwendet 0.

Zeile eins akzeptiert eine Zeichenfolgeeingabe für die Variable a$, und die Schleife beginnt (bezeichnet mit i) mit der Länge dieser Eingabe. brepräsentiert jedes Bit vom 6. bis zum 0. Bit. c$Nimmt jedes Zeichen der Zeichenfolge an der Positioni .

Zeile 5 startet die Schleife, um jede Bitposition zu testen; right$wird in Zeile 6 verwendet, um ein Problem mit der automatischen Formatierung zu beheben, wenn Commodore BASIC eine Zahl anzeigt und die Ausgabe von fn bin eine Zeichenfolge konvertiert . asc(c$)konvertiert das aktuelle Zeichen in seinen ASCII-Code als Dezimalwert.

Zeile 7 repräsentiert den nächsten Bitwert. Die Schleife jwird beendet, bevor ein Leerzeichen gedruckt wird. Dann wird die letzte Schleife ibeendet.

C64-Konvertierung von PETSCII in Binary

Shaun Bebbers
quelle
1

JavaScript ES6, 71 Byte

alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')
thomascorthouts
quelle
Willkommen bei PPCG! Sie müssen .split('')an der leeren Zeichenfolge teilen; .split()verwandelt sich "abc"in ["abc"].
Dennis
1

Viertens (gviertens) , 45 Bytes

: f 0 do dup i + c@ 2 base ! . decimal loop ;

Probieren Sie es online!

Code-Erklärung

: f           \ start a new word definition
  0 do        \ start a loop from 0 to string length - 1
    dup i +   \ duplicate the address and add the loop index to get addr of current character
    c@        \ get the character at that address
    2 base !  \ set the base to binary
    .         \ print the ascii value (in binary)
    decimal   \ set the base back to decimal
  loop        \ end the loop
;             \ end the word definition
reffu
quelle
1

Ruby, 24 Bytes

Ich hatte gehofft, Martin Ender schlagen zu können , aber ich habe es nur geschafft, ihn zu binden.

Übernimmt die Eingabe für STDIN; +1 Byte für -pFlag.

gsub(/./){"%b "%$&.ord}

Probieren Sie es online!

Jordan
quelle
1

Gaia , 4 Bytes

ċb¦ṡ

Ziemlich zufrieden damit

Wie es funktioniert

ċ   Get a list of all the code points in the input string
b¦  Convert every number in that list to binary
ṡ   Joins the element of the list with spaces
Implicit Output 

Probieren Sie es online!

EdgyNerd
quelle
0

STATA 158

Ich habe einen anderen Ansatz gewählt als die meisten anderen. Einlesen über die Eingabeaufforderung display _request () (verkürzt auf di _r (r)). Schreiben Sie die Zeichenfolge im Textmodus in eine Datei mit dem Namen b. Öffnen Sie b im Binärmodus und lesen Sie jedes Zeichen als Byte und konvertieren Sie es in Binär. Technisch sollte die b-Datei am Ende geschlossen werden, aber es ist ein gültiges Programm und läuft erfolgreich ohne es.

di _r(r)
file open a using "b",w
file w a "$r"
file close a
file open a using "b",b r
file r a %1bu t
while r(eof)==0 {
loc q=t
inbase 2 `q'
file r a %1bu t
}
Markierungen
quelle
0

Golang - 68

Ich bin neu in Go und bin mir nicht sicher, nach welchen Regeln Charaktere in dieser Sprache gezählt werden.

Importe (11 Bytes):

import"fmt"

Funktion (55 Bytes):

func c(s string){for _,r:=range s{fmt.Printf("%b ",r)}}

Sie können es hier ausführen .

hmatt1
quelle
0

Niemals wird C # diese Art von Fragen gewinnen, aber hier ist ein Versuch, völlig ohne Codierung. :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));
Abbas
quelle
Dies könnte durch die Verwendung einer Lambda-Funktion erheblich verkürzt werden. x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));Beachten Sie jedoch, dass aufgrund der Verwendung .Select()dieser kürzeren Antwort und Ihrer ursprünglichen Antwort die 18 Bytes eingeschlossen werden müssen using System.Linq;, es sei denn, Sie geben an, dass der Visual C # Interactive Compiler verwendet wird , die standardmäßig
System.Linq
Hier ist die Lambda-Funktion Lösung mit Interactive Compiler, insgesamt 55 Bytes
Skidsdev
0

Cobra - 64

Als Lambda:

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
Οurous
quelle