Cadena a binario

19

Este es un desafío de código de golf. Tal como dice el título, escriba un programa para convertir una cadena de caracteres ascii en binario.

Por ejemplo:

"Hello World!" debe convertirse en 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Nota: Estoy particularmente interesado en una implementación de Pyth.

ericmarkmartin
fuente
1
Tuvimos la pregunta inversa: codegolf.stackexchange.com/questions/35096/…
hmatt1
1
Me di cuenta que. Hay una anécdota de por qué hice esta pregunta. Animé a mi amigo a aprender programación, y él tomó una clase de Java el verano pasado donde cada estudiante tuvo que elegir un proyecto. Me dijo que quería traducir el texto al binario, lo cual hice (para su consternación) en Python 3 en 1 línea (una línea muy larga). Me parece increíble que su idea de proyecto se pueda destilar a 8 bytes.
ericmarkmartin
1
eso es genial, gracias por compartir! Me gustan las preguntas más fáciles como esta porque le da a más personas la oportunidad de participar y genera mucho contenido en forma de respuestas.
hmatt1
1
¿Tiene que ser ASCII? es decir, si una tecnología no es compatible con ASCII, ¿podrían los resultados reflejar eso?
Shaun Bebbers
1
¿Podemos suponer ASCII imprimible 32-127? Si es así, ¿pueden las cadenas binarias ser 7 caracteres con relleno cero a la izquierda?
640 KB

Respuestas:

13

CJam, 8 bytes

l:i2fbS*

Pan comido:

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

Pruébalo aquí

Optimizador
fuente
13

Python 3, 41 bytes

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

Me gusta la respuesta de KSFT , pero pensé en señalar que, además de raw_input -> input, Python 3 también tiene una ventaja aquí debido al splat para print.

Sp3000
fuente
8

Pyth, 10 bytes

jdmjkjCd2z

Mapeo y explicación de 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"

La entrada es la cadena que debe convertirse sin las comillas.

Pruébalo aquí

Optimizador
fuente
10
¿Asdfghjlkl también es un programa Pyth válido? ¿Qué hace?
flawr
@flawr algún daño al intentarlo? ;)
Optimizador
2
@flawr Eso se compila en la pitón Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), donde d = '' yk = ''. Entonces no, no es válido en absoluto.
isaacg
12
@ ericmark26 mire alrededor de su habitación u oficina, y rompa todo lo que pueda encontrar en su teclado y vea si se interpreta. Averigua qué hace y luego repite con el siguiente objeto. Cuando se te acaba, prueba diferentes rotaciones.
globby
2
@ ericmark26 Creo que la mejor manera de acostumbrarse a Pyth es tomar algunos programas simples de Python y traducirlos a Pyth.
isaacg
4

Python 3 - 43 bytes


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

No es el más corto, sino un enfoque interesante de la OMI. Tiene la ventaja adicional de que si el número de bits significativos varía, EG Hi!, el relleno con ceros es trivial (2 bytes más, en lugar de 9 para .zfill(8)):

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

Python - 52

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

Trabajaré en traducir esto a Pyth. Alguien más ya respondió Pyth.

Si no le importa que sea un programa completo o sobre el formato de E / S y use Python 3, puede hacerlo en 23 bytes de esta manera:

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

x es la entrada

Sé que esto no cuenta porque el intérprete no fue lanzado antes de que se publicara el desafío, pero aquí está en KSFTgolf:

oan
KSFT
fuente
3

Ruby, 34 28 24 bytes

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

Toma entrada a través de STDIN. 6 bytes guardados gracias por AShelly y otros 4 gracias a britishtea.

Martin Ender
fuente
recortar por 6 con$<.each_byte{|c|$><<"%b "%c}
AShelly
Puede eliminar algunos caracteres más utilizando en String#byteslugar de String#each_byte. La forma de bloque está en desuso, pero aún funciona :)
britishtea
@britishtea Oh, bien. ¡gracias!
Martin Ender
2

Matlab

Esta es una función anónima

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

uso es f('Hello World').

Alternativamente, si xse define como la cadena Hello World!en el espacio de trabajo, entonces simplemente dec2bin(char(x))funcionará.

David
fuente
No estoy seguro de cómo calificar esto porque no estoy seguro de cómo puedo obtener la entrada. ¿Algún comentario?
David
¿Por qué char? Creo que te refieresdec2bin(x)-'0'
Luis Mendo
¡Porque no soy tan inteligente!
David
Mi punto es: char(x)cuando xya es una cadena, no hace nada. Para que pueda eliminarlo para ahorrar algo de espacio. Por otro lado, el resultado de dec2bines una cadena, y creo que la salida debería ser números
Luis Mendo
Entiendo, y tienes razón, por supuesto. Matlab hace que sea fácil olvidarse de los tipos de datos a veces.
David
2

J - 9

1":#:3&u:

No tengo idea de cómo hacer esto en una fila sin duplicar la longitud del código, necesito que J gurus me lo diga :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001
silbido
fuente
2
Puedes agregar ".al principio. Evalúa su resultado para que esté en una línea y separado por espacios. Incluso más corta es la creación de Base10 números con los dígitos Base2: 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)+" ");}}}

Editado para incluir el archivo completo

Bryan Devaney
fuente
2
Creo que OP quiere un programa completo, no solo un fragmento. Además, creo que se puede jugar mucho más al golf.
Rodolfo Dias
ese es el programa completo, si lo pones en una clase principal, se ejecutará. En cuanto a un mejor golf, probablemente, pero no pude ver cómo.
Bryan Devaney
1
El programa completo también incluye la clase principal.
Rodolfo Dias
podría ser más corto usando for(char c:a[0].toCharArray()){o incluso for(byte b:a[0].getBytes()){dado que la entrada es ascii, suponiendo una configuración regional de máquina no utf-16
njzk2
1
Puede deshacerse de él publicy acortar el nombre del programa a un solo carácter para ganar más bytes. Además, (String[]a)el compilador lo acepta perfectamente, lo que le otorga otro byte.
Rodolfo Dias
2

JavaScript ES6, 63 65 bytes

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

Esto es bastante largo, gracias a los nombres largos de funciones de JavaScript. El siguiente fragmento de pila es el equivalente aproximado de ES5, por lo que se puede ejecutar en cualquier navegador. Gracias a edc65 por las mejoras en el golf.

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

NinjaOsoMono
fuente
1
[for of]es un poco más corto que [...].mapenumerar caracteres en cadenas:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65
Puede jugar golf de dos bytes reemplazando .join(' ')con .join` ` . Puedes jugar muchos bytes usando una función en lugar de prompt/alert
RamenChef
2

Scala - 59-55 bytes

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

Normalmente, uno debe usar foreach y no el mapa.

Dominik Müller
fuente
2

Código de máquina 8088, IBM PC DOS, 33 31 bytes *

Listado:

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 

Archivo COM ejecutable completo de PC DOS, la entrada es a través de la línea de comando.

Con ceros a la izquierda:

ingrese la descripción de la imagen aquí

Descargue y pruebe ASCBIN.COM .

O 39 bytes sin ceros a la izquierda:

ingrese la descripción de la imagen aquí

Descargue y pruebe ASCBIN2.COM .

* Como no estaba explícitamente claro para mí si los ceros iniciales están permitidos o no, estoy publicando versiones en ambos sentidos.

640 KB
fuente
2

MITS Altair 8800 , 0 bytes

La cadena de entrada está en la dirección de memoria #0000H( permitida ). Salida en binario a través de luces de E / S del panel frontal D7-D0.

Ejemplo, haz RESET, luego EXAMINEpara ver el primer byte, seguido de repetir EXAMINE NEXTpara ver el resto.

"H" = 01 001 000:

ingrese la descripción de la imagen aquí

"e" = 01 100 101:

ingrese la descripción de la imagen aquí

"l" = 01 101 100:

ingrese la descripción de la imagen aquí

Pruébalo en línea!

No competidora, por supuesto. :)

640 KB
fuente
1

Haskell, 65

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

uso intensivo de la lista mónada. no se pudo convertir en comprensiones de listas porque las últimas declaraciones no eran a return.

orgulloso Haskeller
fuente
1

C ++ - 119 bytes

¿Liberando memoria? ¿Que es eso?

#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 el código con advertencia)

BMac
fuente
1
Versión C, más 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 y TheC64Mini, 101 bytes BASIC tokenizados

Aquí está la lista ofuscada usando las abreviaturas de palabras clave 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

Aquí, para fines de explicación, está el listado simbólico no ofuscado:

 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 función fn bdeclarada en la línea cero acepta un parámetro numérico xque se ANDedita con el valor de b; SGN se utiliza para convertir x and ba 1o 0.

La línea uno acepta una entrada de cadena a la variable a$, y el ciclo comienza (indicado con i) a la longitud de esa entrada. brepresenta cada bit del sexto al 0º bit. c$toma cada carácter de la cadena en su posición i.

la línea 5 inicia el bucle para probar cada posición de bit; right$se utiliza en la línea 6 para eliminar un problema de formateo automático cuando Commodore BASIC muestra un número y convierte la salida de fn ba una cadena; asc(c$)convierte el carácter actual a su código ASCII como un valor decimal.

La línea 7 representa el siguiente valor de bit. El ciclo jfinaliza antes de imprimir un espacio, luego ifinaliza el último ciclo .

C64 que convierte PETSCII a binario

Shaun Bebbers
fuente
1

JavaScript ES6, 71 bytes

alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')
thomascorthouts
fuente
Bienvenido a PPCG! Necesita .split('')dividir en la cadena vacía; .split()se convierte "abc"en ["abc"].
Dennis
1

Adelante (gforth) , 45 bytes

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

Pruébalo en línea!

Explicación del código

: 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
fuente
1

Rubí, 24 bytes.

Tenía la esperanza de vencer a Martin Ender , pero solo logré atarlo.

Toma entrada en STDIN; +1 bytes para la -pbandera.

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

Pruébalo en línea!

Jordán
fuente
1

Gaia , 4 bytes

ċb¦ṡ

Bastante feliz con esto

Cómo funciona

ċ   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 

Pruébalo en línea!

EdgyNerd
fuente
0

STATA 158

Usé un enfoque diferente al de la mayoría. Lea a través del indicador display _request () (abreviado a di _r (r)). Escriba la cadena en un archivo llamado b en modo texto. Abra b en modo binario y lea cada carácter como un byte y conviértalo a binario. Técnicamente, el archivo b debe cerrarse al final, pero es un programa válido y se ejecuta con éxito sin él.

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
}
comentarios
fuente
0

Golang - 68

Soy nuevo en Go y tampoco estoy seguro de las reglas para contar caracteres en este idioma aquí.

Importaciones (11 bytes):

import"fmt"

Función (55 bytes):

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

Puedes ejecutarlo aquí .

hmatt1
fuente
0

C # nunca ganará este tipo de preguntas, pero aquí hay una prueba, completamente sin codificación. :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));
Abbas
fuente
Esto podría hacerse mucho más corto usando una función lambda, es decir: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));Sin embargo, tenga en cuenta que, debido al uso .Select(), tanto esta respuesta más corta como su respuesta original, deben incluir los 18 bytes, a using System.Linq;menos que especifique que está usando el compilador interactivo de Visual C # , que importa System.Linq por defecto
Skidsdev
Aquí está la solución de la función lambda usando el compilador interactivo, un total de 55 bytes
Skidsdev
0

Cobra - 64

Como una lambda:

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