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.


1

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í


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.


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í


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()))

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

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.


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á.


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

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


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(' '))


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.


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.


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. :)


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.


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)


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


1

JavaScript ES6, 71 bytes

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

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


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!



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
}

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í .


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

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(' ')
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.