String para binário

19

Este é um desafio de código de golfe. Assim como o título diz, escreva um programa para ocultar uma sequência de caracteres ascii em binário.

Por exemplo:

"Hello World!" deve se transformar 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Nota: Estou particularmente interessado em uma implementação de pyth.

ericmarkmartin
fonte
11
Pedimos o inverso: codegolf.stackexchange.com/questions/35096/…
hmatt1
11
Eu percebi isso. Há uma história de por que eu fiz essa pergunta. Incentivei meu amigo a aprender programação, e ele teve uma aula de Java no último verão, onde cada aluno teve que escolher um projeto. Ele me disse que queria traduzir texto para binário, o que eu fiz (para sua consternação) em python 3 em 1 linha (uma linha muito longa). Acho incrível que sua ideia de projeto possa ser destilada até 8 bytes.
Ericmarkmartin
11
isso é legal, obrigado por compartilhar! Eu gosto de perguntas mais fáceis como essa, porque isso dá a mais pessoas a chance de participar e gera muito conteúdo na forma de respostas.
precisa saber é
11
Tem que ser ASCII? ou seja, se uma tecnologia não for compatível com ASCII, os resultados poderiam refletir isso?
Shaun Bebbers
11
Podemos assumir 32-127 imprimíveis em ASCII? Nesse caso, as cadeias binárias podem ter 7 caracteres com preenchimento zero à esquerda?
640KB 15/04

Respostas:

13

CJam, 8 bytes

l:i2fbS*

Mole-mole:

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

Experimente aqui

Optimizer
fonte
13

Python 3, 41 bytes

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

Como a resposta do KSFT , mas pensei em apontar que, além de raw_input -> input, o Python 3 também tem uma vantagem aqui devido ao splat for print.

Sp3000
fonte
8

Pitão, 10 bytes

jdmjkjCd2z

Mapeamento e explicação do 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"

Entrada é a sequência que precisa ser convertida sem as aspas.

Experimente aqui

Optimizer
fonte
10
O asdfghjlkl também é um programa de pyth válido? O que isso faz?
flawr
@ flawr algum mal em tentar? ;)
Otimizador
2
@ flawr Isso compila com o python Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), d = '' ek = ''. Então não, não é válido.
Isaacg
12
@ ericmark26 olhe em volta do seu quarto ou escritório e esmague tudo o que encontrar no teclado e veja se ele interpreta. Descubra o que faz e repita com o próximo objeto. Quando acabar, tente rotações diferentes.
globby
2
@ ericmark26 Acho que a melhor maneira de se acostumar com o Pyth é pegar alguns programas simples do Python e traduzi-los para o Pyth.
Isaacg
4

Python 3-43 bytes


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

Não é o mais curto, mas uma abordagem interessante IMO. Tem a vantagem adicional de que, se o número de bits significativos variar, por exemplo Hi!, o preenchimento com zeros é trivial (mais 2 bytes, em oposição a 9 para .zfill(8)):

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

Python - 52

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

Vou trabalhar na tradução para Pyth. Alguém já respondeu Pyth.

Se você não se importa com o programa completo ou com o formato de E / S e usa o Python 3, pode fazê-lo em 23 bytes como este:

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

x é a entrada.

Sei que isso não conta porque o intérprete não foi lançado antes do lançamento do desafio, mas aqui está no KSFTgolf:

oan
KSFT
fonte
3

Ruby, 34 28 24 bytes

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

Recebe entrada via STDIN. 6 bytes salvos obrigado por AShelly e outros 4 graças a britishtea.

Martin Ender
fonte
aparar por 6 com$<.each_byte{|c|$><<"%b "%c}
AShelly
Você pode cortar mais alguns caracteres usando em String#bytesvez de String#each_byte. O formulário do bloco foi descontinuado, mas ainda funciona :) #
221
@britishtea Oh, que bom. obrigado!
Martin Ender
2

Matlab

Esta é uma função anônima

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

uso é f('Hello World').

Como alternativa, se xfor definida como a sequência Hello World!no espaço de trabalho, apenas dec2bin(char(x))funcionará.

David
fonte
Não tenho certeza de como pontuar isso, porque não tenho certeza de como obter a entrada. Algum comentário?
David
Por que char? Eu acho que você quer dizerdec2bin(x)-'0'
Luis Mendo
Porque eu não sou tão inteligente!
David
Meu argumento é:, char(x)quando xjá é uma string, não faz nada. Então você pode removê-lo para economizar espaço. Por outro lado, o resultado dec2biné uma string, e eu acho que a saída deve ser números
Luis Mendo
Eu entendo, e você está certo, é claro. O Matlab facilita às vezes esquecer os tipos de dados.
David
2

J - 9

1":#:3&u:

Não faço ideia de como fazer isso em uma linha sem dobrar o comprimento do código, preciso que os gurus J me digam :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001
swish
fonte
2
Você pode adicionar ".ao início. Ele avalia o resultado para que fique em uma linha e separado por espaços. Ainda mais curto é criar Base10 números com os dígitos base2: 10#.#:3&u:.
randomra 23/01
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 o arquivo completo

Bryan Devaney
fonte
2
Acho que o OP quer um programa completo, não apenas um trecho. Além disso, pode ser jogado muito mais, acho.
Rodolfo Dias
esse é o programa completo; se você o colocar em uma classe principal, ele será executado. quanto ao melhor golfe, provavelmente, mas não consegui identificar como.
Bryan Devaney
11
O programa completo também inclui a classe principal.
Rodolfo Dias
poderia ser mais curto utilizando for(char c:a[0].toCharArray()){ou mesmo for(byte b:a[0].getBytes()){uma vez que a entrada é ASCII, assumindo uma localidade máquina não-utf-16
njzk2
11
Você pode se livrar publice encurtar o nome do programa para um único caractere para obter mais bytes. Além disso, (String[]a)é perfeitamente aceito pelo compilador, ganhando outro byte.
Rodolfo Dias
2

JavaScript ES6, 63 65 bytes

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

Isso é bastante longo, graças aos nomes de funções longos do JavaScript. O snippet de pilha abaixo é o equivalente aproximado do ES5, portanto pode ser executado em qualquer navegador. Agradecimentos a edc65 pelas melhorias no golfe.

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

NinjaBearMonkey
fonte
11
[for of]é um pouco mais curto do [...].mapque enumerar caracteres em strings:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65
Você pode obter dois bytes de golfe substituindo .join(' ')por .join` ` . Você pode golfe fora de um monte de bytes usando uma função em vez de prompt/alert
RamenChef
2

Scala - 59 - 55 bytes

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

Normalmente, deve-se usar foreach e não mapear.

Dominik Müller
fonte
2

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

Listagem:

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 

Arquivo COM executável completo para PC DOS, a entrada é via linha de comando.

Com zeros à esquerda:

insira a descrição da imagem aqui

Faça o download e teste o ASCBIN.COM .

Ou 39 bytes sem zeros à esquerda:

insira a descrição da imagem aqui

Faça o download e teste o ASCBIN2.COM .

* Como não estava explicitamente claro se os zeros à esquerda são permitidos ou não, estou publicando versões nos dois sentidos.

640KB
fonte
2

MITS Altair 8800 , 0 bytes

A sequência de entrada está no endereço de memória #0000H( permitido ). Saída em binário via luzes de E / S do painel frontal D7-D0.

Exemplo, faça RESET, então, EXAMINEpara ver o primeiro byte, seguido pela repetição EXAMINE NEXTpara ver o restante.

"H" = 01 001 000:

insira a descrição da imagem aqui

"e" = 01 100 101:

insira a descrição da imagem aqui

"l" = 01 101 100:

insira a descrição da imagem aqui

Experimente online!

Não competindo, é claro. :)

640KB
fonte
1

Haskell, 65

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

uso intenso da mônada da lista. não pôde ser convertido em compreensões de lista porque as últimas instruções não eram a return.

orgulhoso haskeller
fonte
1

C ++ - 119 bytes

Liberando memória? O que é isso?

#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 o código com aviso)

BMac
fonte
11
Versão C, mais curtamain(int c,char**v){char x[9];for(;c=*(v[1]++);printf("%s ",itoa(c,x,2)));}
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̷̨̰́̀ĥ̷̷̳̰̀ĥ̷̳
1

Commodore VIC-20 / C64 / 128 e TheC64Mini, 101 bytes BASIC tokenizados

Aqui está a lista ofuscada usando as abreviações de palavras-chave do 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

Aqui, para fins de explicação, está a lista simbólica não ofuscada:

 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

A função fn bdeclarada na linha zero aceita um parâmetro numérico do xqual é ANDed com o valor de b; O SGN é então usado para converter x and bpara 1ou 0.

A linha um aceita uma entrada de string para a variável a$e o loop inicia (indicado com i) para o comprimento dessa entrada. brepresenta cada bit do 6º ao 0º bit. c$leva cada caractere da string na posição i.

a linha 5 inicia o loop para testar cada posição de bit; right$é usado na linha 6 para remover um problema de formatação automática quando o Commodore BASIC exibe um número, convertendo a saída de fn bem uma string; asc(c$)converte o caractere atual em seu código ascii como um valor decimal.

A linha 7 representa o próximo valor de bit. O loop jé finalizado antes de imprimir um espaço, e o último loop ié finalizado.

C64 convertendo PETSCII em binário

Shaun Bebbers
fonte
1

JavaScript ES6, 71 bytes

alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')
thomascorthouts
fonte
Bem-vindo ao PPCG! Você precisa .split('')dividir a sequência vazia; .split()se "abc"transforma ["abc"].
Dennis
1

Quarto (gforth) , 45 bytes

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

Experimente online!

Código Explicação

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

Ruby, 24 bytes

Eu esperava vencer Martin Ender , mas só consegui amarrá-lo.

Recebe entrada em STDIN; +1 bytes para -psinalizador.

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

Experimente online!

Jordânia
fonte
1

Gaia , 4 bytes

ċb¦ṡ

Muito feliz com isso

Como 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 

Experimente Online!

EdgyNerd
fonte
0

STATA 158

Eu usei uma abordagem diferente da maioria. Leia através do prompt _request () do display (abreviado para di _r (r)). Escreva a string em um arquivo chamado b no modo de texto. Abra b no modo binário e leia cada caractere como um byte e converta para binário. Tecnicamente, o arquivo b deve ser fechado no final, mas é um programa válido e é executado com sucesso sem ele.

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
}
bmarks
fonte
0

Golang - 68

Eu sou novo no Go e também não tenho certeza das regras para contar caracteres nesse idioma.

Importações (11 bytes):

import"fmt"

Função (55 bytes):

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

Você pode executá-lo aqui .

hmatt1
fonte
0

O C # nunca vencerá esse tipo de perguntas, mas aqui está uma tentativa, completamente sem codificação. :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));
Abbas
fonte
Isso pode ser muito mais curto usando uma função lambda, ou seja: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));No entanto, observe que, devido ao uso de.Select() , tanto a resposta mais curta quanto a resposta original precisam incluir os 18 bytes, a using System.Linq;menos que você especifique que está usando o Visual C # Interactive Compiler , que importa o System.Linq por padrão
Skidsdev
Aqui está a solução da função lambda usando o Interactive Compiler, total de 55 bytes
Skidsdev 15/04
0

Cobra - 64

Como um Lambda:

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
Furioso
fonte