Da stringa a binario


19

Questa è una sfida del codice golf. Proprio come dice il titolo, scrivi un programma per convertire una stringa di caratteri ASCII in binario.

Per esempio:

"Hello World!" dovrebbe trasformarsi in 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Nota: sono particolarmente interessato a un'implementazione Pyth.


1
Abbiamo chiesto al contrario
hmatt1

1
Ho notato che. C'è un aneddoto sul perché ho posto questa domanda. Ho incoraggiato il mio amico a imparare la programmazione e la scorsa estate ha frequentato un corso di java in cui ogni studente doveva scegliere un progetto. Mi ha detto che voleva tradurre il testo in binario, cosa che ho fatto (con suo grande sgomento) in Python 3 in 1 line (una linea molto lunga). Trovo incredibile che la sua idea di progetto possa essere distillata fino a 8 byte.
ericmarkmartin,

1
fantastico, grazie per averlo condiviso! Mi piacciono le domande più semplici come questa perché dà a più persone la possibilità di partecipare e genera molti contenuti sotto forma di risposte.
hmatt1,

1
Deve essere ASCII? cioè, se una tecnologia non è compatibile ASCII, i risultati potrebbero rifletterlo?
Shaun Bebbers

1
Possiamo supporre ASCII stampabile 32-127? In tal caso, le stringhe binarie possono essere 7 caratteri con riempimento zero sinistro?
640 KB

Risposte:


13

CJam, 8 byte

l:i2fbS*

Vai tranquillo:

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";

Provalo qui


13

Python 3, 41 byte

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

Come la risposta di KSFT , ma ho pensato di sottolineare che, oltre a raw_input -> input, Python 3 ha anche un vantaggio qui a causa dello splat per print.


8

Pyth, 10 byte

jdmjkjCd2z

Mappatura e spiegazione di Python:

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"

L'input è la stringa che deve essere convertita senza virgolette.

Provalo qui


10
Asdfghjlkl è anche un programma pyth valido? Che cosa fa?
flawr

@flawr qualche danno nel provare? ;)
Ottimizzatore

2
@flawr che si compila in python Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), whee d = '' e k = ''. Quindi no, non è affatto valido.
isaacg,

12
@ ericmark26 guardati intorno nella tua stanza o in ufficio e distruggi tutto ciò che puoi trovare sulla tastiera e vedi se interpreta. Scopri cosa fa, quindi ripeti con l'oggetto successivo. Quando finisci, prova rotazioni diverse.
globby

2
@ ericmark26 Penso che il modo migliore per abituarsi a Pyth sia prendere alcuni semplici programmi Python e tradurli in Pyth.
Isaacg,

4

Python 3 - 43 byte


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

Non proprio il più breve, ma un approccio interessante IMO. Ha il vantaggio aggiuntivo che se il numero di bit significativi varia, EG Hi!, il riempimento con zeri è banale (2 byte in più, anziché 9 per .zfill(8)):

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

3

Python - 52

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

Lavorerò sulla traduzione di questo in Pyth. Qualcun altro ha già risposto Pyth.

Se non ti interessa che si tratti di un programma completo o del formato I / O e usi Python 3, puoi farlo in 23 byte in questo modo:

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

x è l'input.

So che questo non conta perché l'interprete non è stato rilasciato prima che la sfida fosse pubblicata, ma eccolo qui in KSFTgolf:

oan

3

Rubino, 34 28 24 byte

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

Accetta input tramite STDIN. 6 byte salvati grazie per AShelly e altri 4 grazie a britishtea.


tagliare il 6 con$<.each_byte{|c|$><<"%b "%c}
AShelly il

Puoi radere altri personaggi usando String#bytesinvece di String#each_byte. La forma del blocco è obsoleta, ma funziona ancora :)
britishtea

@britishtea Oh, bello. grazie!
Martin Ender,


2

Matlab

Questa è una funzione anonima

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

l'utilizzo è f('Hello World').

In alternativa, se xè definita come stringa Hello World!nell'area di lavoro, allora dec2bin(char(x))funzionerà.


Non sono sicuro di come segnare questo perché non sono sicuro di come posso ottenere l'input. Qualche commento?
David,

Perché char? Penso che intendidec2bin(x)-'0'
Luis Mendo il

Perché non sono così intelligente!
David,

Il mio punto è: char(x)quando xè già una stringa, non fa nulla. Quindi puoi rimuoverlo per risparmiare spazio. D'altra parte, il risultato di dec2binè una stringa e penso che l'output dovrebbe essere un numero
Luis Mendo,

Capisco, e hai ragione, ovviamente. Matlab rende facile dimenticare a volte i tipi di dati.
David,

2

J - 9

1":#:3&u:

Non ho idea di come farlo di seguito senza raddoppiare la lunghezza del codice, ho bisogno di J guru per dirmelo :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001

2
Puoi aggiungere ".all'inizio. Valuta il risultato in modo che sia su una riga e separato da spazi. Ancora più breve è quello di creare Base10 numeri con le cifre Base2: 10#.#:3&u:.
randomra,

2

Java - 148 byte

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)+" ");}}}

Modificato per includere il file completo


2
Penso che OP voglia un programma completo, non solo uno snippet. Inoltre, si può giocare a golf molto di più, pensa.
Rodolfo Dias,

questo è il programma completo, se lo metti in una classe principale, verrà eseguito. per quanto riguarda il golf migliore, probabilmente ma non sono riuscito a capire come.
Bryan Devaney,

1
Il programma completo include anche la classe principale.
Rodolfo Dias,

potrebbe essere più breve usando for(char c:a[0].toCharArray()){o anche for(byte b:a[0].getBytes()){dal momento che l'input è ASCII, supponendo una locale della macchina non utf-16
njzk2

1
È possibile sbarazzarsi di publice abbreviare il nome del programma in un singolo carattere per guadagnare più byte. Inoltre, (String[]a)è perfettamente accettato dal compilatore, guadagnandoti un altro byte.
Rodolfo Dias,

2

JavaScript ES6, 63 65 byte

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

Questo è piuttosto lungo, grazie ai nomi lunghi delle funzioni di JavaScript. Lo Stack Snippet di seguito è l'equivalente ES5 approssimativo, quindi può essere eseguito in qualsiasi browser. Grazie a edc65 per i miglioramenti del golf.

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


1
[for of]è leggermente più breve rispetto [...].mapall'enumerazione dei caratteri in stringhe:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65,

È possibile golf due byte sostituendo .join(' ')con .join` ` . Puoi giocare a golf molti byte usando una funzione invece di prompt/alert
RamenChef

2

Scala - 59 - 55 byte

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

Normalmente, si dovrebbe usare foreach e non map.


2

8088 codice macchina, IBM PC DOS, 33 31 byte *

annuncio:

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 

File COM eseguibile PC DOS completo, l'input avviene tramite riga di comando.

Con zeri iniziali:

inserisci qui la descrizione dell'immagine

Scarica e prova ASCBIN.COM .

O 39 byte senza zeri iniziali:

inserisci qui la descrizione dell'immagine

Scarica e prova ASCBIN2.COM .

* Dato che non mi era esplicitamente chiaro se gli zeri iniziali sono consentiti o meno, sto pubblicando le versioni in entrambi i modi.


2

MITS Altair 8800 , 0 byte

La stringa di input è all'indirizzo di memoria #0000H( consentito ). Uscita in binario tramite luci I / O sul pannello frontale D7-D0.

Esempio, RESETquindi, EXAMINEper vedere il primo byte, seguito da una ripetizione EXAMINE NEXTper vedere il resto.

"H" = 01 001 000:

inserisci qui la descrizione dell'immagine

"e" = 01 100 101:

inserisci qui la descrizione dell'immagine

"l" = 01 101 100:

inserisci qui la descrizione dell'immagine

Provalo online!

Non competitiva, ovviamente. :)


1

Haskell, 65 anni

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

uso intenso della monade lista. non può essere convertito in elenchi di comprensione perché le ultime dichiarazioni non erano a return.


1

C ++ - 119 byte

Liberare memoria? Cos'è quello?

#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 compila il codice con un avviso)


1
Versione C, più cortamain(int c,char**v){char x[9];for(;c=*(v[1]++);printf("%s ",itoa(c,x,2)));}
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳





1

Commodore VIC-20 / C64 / 128 e TheC64Mini, 101 byte BASIC tokenizzati

Ecco l'elenco offuscato che utilizza le abbreviazioni delle parole chiave 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

Qui a scopo esplicativo è riportato l'elenco simbolico non offuscato:

 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

La funzione fn bdichiarata sulla riga zero accetta un parametro numerico di xcui è ANDed il valore di b; SGN viene quindi utilizzato per convertire x and bin 1o 0.

La riga uno accetta un input di stringa per la variabile a$e il loop inizia (indicato con i) per la lunghezza di quell'input. brappresenta ogni bit dal 6 ° al 0 ° bit. c$prende ogni carattere della stringa in posizione i.

la linea 5 avvia il loop per testare ogni posizione di bit; right$viene utilizzato nella riga 6 per rimuovere un problema di formattazione automatica quando Commodore BASIC visualizza un numero, convertendo l'output di fn bin una stringa; asc(c$)converte il carattere corrente nel suo codice ASCII come valore decimale.

La riga 7 rappresenta il valore del bit successivo. Il ciclo jtermina prima di stampare uno spazio, quindi l'ultimo ciclo iè terminato.

C64 conversione PETSCII in binario


1

JavaScript ES6, 71 byte

alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')

Benvenuti in PPCG! Devi .split('')dividere la stringa vuota; .split()si trasforma "abc"in ["abc"].
Dennis,

1

Forth (gforth) , 45 byte

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

Provalo online!

Spiegazione del codice

: 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


1

Gaia , 4 byte

ċb¦ṡ

Abbastanza soddisfatto di questo

Come funziona

ċ   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 

Provalo online!



0

STATA 158

Ho usato un approccio diverso rispetto alla maggior parte. Leggere tramite il prompt di visualizzazione _request () (abbreviato in di _r (r)). Scrivi la stringa in un file chiamato b in modalità testo. Apri b in modalità binaria e leggi ogni carattere come byte e converti in binario. Tecnicamente il file b dovrebbe essere chiuso alla fine, ma è un programma valido e viene eseguito correttamente senza di esso.

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
}

0

Golang - 68

Sono nuovo di Go e non sono sicuro delle regole per contare i personaggi in questa lingua.

Importazioni (11 byte):

import"fmt"

Funzione (55 byte):

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

Puoi eseguirlo qui .


0

C # non vincerà mai questo tipo di domande, ma ecco un tentativo, completamente senza codifica. :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));

Questo potrebbe essere molto più breve usando una funzione lambda, ovvero: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));Tuttavia nota che, a causa dell'uso .Select(), sia questa risposta più breve, sia la tua risposta originale, devono includere i 18 byte per a using System.Linq;meno che non specifichi che sta usando il compilatore interattivo Visual C # , che importa System.Linq per impostazione predefinita
Skidsdev,

Ecco la soluzione della funzione lambda che utilizza Interactive Compiler, per un totale di 55 byte
Skidsdev il

0

Cobra - 64

Come una Lambda:

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.