Chaîne en binaire

19

Il s'agit d'un défi de golf de code. Comme le titre l'indique, écrivez un programme pour convertir une chaîne de caractères ascii en binaire.

Par exemple:

"Hello World!" devrait se transformer en 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Remarque: je suis particulièrement intéressé par une implémentation pyth.

ericmarkmartin
la source
1
Nous avons demandé l'inverse: codegolf.stackexchange.com/questions/35096/…
hmatt1
1
J'ai remarqué ça. Il y a une anecdote pour expliquer pourquoi j'ai posé cette question. J'ai encouragé mon ami à apprendre la programmation, et il a pris un cours de java l'été dernier où chaque étudiant devait choisir un projet. Il m'a dit qu'il voulait traduire du texte en binaire, ce que j'ai ensuite fait (à son grand désarroi) en python 3 en 1 ligne (une très longue ligne). Je trouve incroyable que son idée de projet puisse être distillée jusqu'à 8 octets.
ericmarkmartin
1
c'est cool, merci pour le partage! J'aime les questions plus simples comme celle-ci, car cela donne à plus de gens une chance de participer et génère beaucoup de contenu sous forme de réponses.
hmatt1
1
Doit-il être ASCII? c'est-à-dire, si une technologie n'est pas compatible ASCII, les résultats pourraient-ils refléter cela?
Shaun Bebbers
1
Pouvons-nous supposer que l'ASCII imprimable 32-127? Si c'est le cas, les chaînes binaires peuvent-elles être de 7 caractères avec un remplissage nul à gauche?
640 Ko le

Réponses:

13

CJam, 8 octets

l:i2fbS*

Peasy facile:

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

Essayez-le ici

Optimiseur
la source
13

Python 3, 41 octets

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

Comme la réponse de KSFT , mais je pensais souligner que, en plus de raw_input -> input, Python 3 a également un avantage ici en raison du splat pour print.

Sp3000
la source
8

Pyth, 10 octets

jdmjkjCd2z

Mappage et explication 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'entrée est la chaîne qui doit être convertie sans les guillemets.

Essayez-le ici

Optimiseur
la source
10
Asdfghjlkl est-il également un programme pyth valide? Qu'est ce que ça fait?
flawr
@flawr un mal à essayer? ;)
Optimizer
2
@flawr Qui se compile en python Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), whee d = '' et k = ''. Donc non, ce n'est pas valable du tout.
isaacg
12
@ ericmark26 regardez autour de votre pièce ou bureau, et écrasez tout ce que vous pouvez trouver dans votre clavier et voyez s'il interprète. Déterminez ce qu'il fait, puis répétez avec l'objet suivant. Lorsque vous êtes à court, essayez différentes rotations.
globby
2
@ ericmark26 Je pense que la meilleure façon de s'habituer à Pyth est de prendre quelques programmes Python simples et de les traduire en Pyth.
isaacg
4

Python 3-43 octets


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

Pas tout à fait le plus court, mais une approche intéressante de l'OMI. Il a l'avantage supplémentaire que si le nombre de bits significatifs varie, EG Hi!, le remplissage avec des zéros est trivial (2 octets de plus, contre 9 pour .zfill(8)):

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

Python - 52

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

Je vais travailler sur la traduction de cela en Pyth. Quelqu'un d'autre a déjà fait une réponse Pyth.

Si vous ne vous souciez pas qu'il s'agisse d'un programme complet ou du format d'E / S et que vous utilisez Python 3, vous pouvez le faire en 23 octets comme ceci:

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

x est l'entrée.

Je sais que cela ne compte pas parce que l'interprète n'a pas été libéré avant la publication du défi, mais ici, c'est dans KSFTgolf:

oan
KSFT
la source
3

Rubis, 34 28 24 octets

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

Prend entrée via STDIN. 6 octets enregistrés grâce à AShelly et 4 autres grâce à britishtea.

Martin Ender
la source
couper par 6 avec$<.each_byte{|c|$><<"%b "%c}
AShelly
Vous pouvez raser quelques caractères supplémentaires en utilisant String#bytesau lieu de String#each_byte. Le formulaire de blocage est obsolète, mais il fonctionne toujours :)
britishtea
@britishtea Oh, bien. Merci!
Martin Ender
2

Matlab

Ceci est une fonction anonyme

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

l'utilisation est f('Hello World').

Alternativement, si xest défini comme la chaîne Hello World!dans l'espace de travail, alors dec2bin(char(x))cela fonctionnera.

David
la source
Je ne sais pas comment noter cela parce que je ne sais pas comment obtenir la contribution. Des commentaires?
David
Pourquoi char? Je pense que tu veux diredec2bin(x)-'0'
Luis Mendo
Parce que je ne suis pas si intelligent!
David
Mon point est:, char(x)quand xest déjà une chaîne, ne fait rien. Vous pouvez donc le supprimer pour économiser de l'espace. D'un autre côté, le résultat dec2binest une chaîne, et je pense que la sortie devrait être des nombres
Luis Mendo
Je comprends, et vous avez raison, bien sûr. Matlab permet parfois d'oublier facilement les types de données.
David
2

J - 9

1":#:3&u:

Je ne sais pas comment faire ça en ligne sans doubler la longueur du code, j'ai besoin de gourous J pour me le dire :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001
bruissement
la source
2
Vous pouvez ajouter ".au début. Il évalue votre résultat afin qu'il soit sur une seule ligne et séparé par des espaces. Même plus courte est de créer Base10 nombres avec les chiffres Base2: 10#.#:3&u:.
randomra
2

Java - 148 octets

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

Modifié pour inclure le fichier complet

Bryan Devaney
la source
2
Je pense qu'OP veut un programme complet, pas seulement un extrait. De plus, il peut être joué beaucoup plus au golf, je pense.
Rodolfo Dias
c'est le programme complet, si vous le mettez dans une classe principale, il s'exécutera. quant à un meilleur golf, probablement mais je n'ai pas pu voir comment.
Bryan Devaney
1
Le programme complet comprend également la classe principale.
Rodolfo Dias
pourrait être plus court en utilisant for(char c:a[0].toCharArray()){ou même for(byte b:a[0].getBytes()){puisque l'entrée est ascii, en supposant un environnement local de machine non-utf-16
njzk2
1
Vous pouvez vous débarrasser de publicet raccourcir le nom du programme en un seul caractère pour gagner plus d'octets. De plus, (String[]a)est parfaitement accepté par le compilateur, vous gagnant un autre octet.
Rodolfo Dias
2

JavaScript ES6, 63 65 octets

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

C'est assez long, grâce aux longs noms de fonctions de JavaScript. L'extrait de pile ci-dessous est l'équivalent approximatif d'ES5, il peut donc être exécuté dans n'importe quel navigateur. Merci à edc65 pour les améliorations apportées au golf.

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

NinjaBearMonkey
la source
1
[for of]est légèrement plus court que [...].mappour énumérer les caractères dans les chaînes:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65
Vous pouvez jouer au golf sur deux octets en remplaçant .join(' ')par .join` ` . Vous pouvez jouer au golf sur beaucoup d'octets en utilisant une fonction au lieu de prompt/alert
RamenChef
2

Scala - 59-55 octets

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

Normalement, il faut utiliser foreach et non map.

Dominik Müller
la source
2

Code machine 8088, IBM PC DOS, 33 31 octets *

Référencement:

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 

Fichier COM exécutable PC DOS complet, l'entrée se fait via la ligne de commande.

Avec des zéros non significatifs:

entrez la description de l'image ici

Téléchargez et testez ASCBIN.COM .

Ou 39 octets sans zéros non significatifs:

entrez la description de l'image ici

Téléchargez et testez ASCBIN2.COM .

* Comme il n'était pas clairement clair pour moi si les zéros en tête sont autorisés ou non, je publie des versions dans les deux sens.

640 Ko
la source
2

MITS Altair 8800 , 0 octets

La chaîne d'entrée est à l'adresse mémoire #0000H( autorisée ). Sortie en binaire via les voyants d'E / S du panneau avant D7-D0.

Exemple, faites RESET, puis EXAMINEpour voir le premier octet, puis répétez EXAMINE NEXTpour voir le reste.

"H" = 01 001 000:

entrez la description de l'image ici

"e" = 01 100 101:

entrez la description de l'image ici

"l" = 01 101 100:

entrez la description de l'image ici

Essayez-le en ligne!

Non compétitif, bien sûr. :)

640 Ko
la source
1

Haskell, 65

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

utilisation intensive de la liste monade. il n'a pas pu être converti en liste de comprehentions car les dernières instructions n'étaient pas un return.

fier haskeller
la source
1

C ++ - 119 octets

Libérer de la mémoire? Qu'est-ce que c'est?

#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 compile le code avec avertissement)

BMac
la source
1
Version C, plus courtemain(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 et TheC64Mini, 101 octets BASIC à jeton

Voici la liste masquée à l'aide des abréviations des mots clés 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

Voici à des fins d'explication la liste symbolique non masquée:

 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 fonction fn bdéclarée à la ligne zéro accepte un paramètre numérique xdont ANDla valeur est ed b; SGN est ensuite utilisé pour convertir x and ben 1ou 0.

La première ligne accepte une entrée de chaîne dans la variable a$et la boucle démarre (indiquée par i) à la longueur de cette entrée. breprésente chaque bit du 6e au 0e bit. c$prend chaque caractère de la chaîne en position i.

la ligne 5 démarre la boucle pour tester chaque position de bit; right$est utilisé à la ligne 6 pour supprimer un problème de mise en forme automatique lorsque Commodore BASIC affiche un nombre, convertissant la sortie de fn ben chaîne; asc(c$)convertit le caractère actuel en son code ascii sous forme de valeur décimale.

La ligne 7 représente la valeur de bit suivante. La boucle jest terminée avant d'imprimer un espace, puis la dernière boucle iest terminée.

C64 conversion PETSCII en binaire

Shaun Bebbers
la source
1

JavaScript ES6, 71 octets

alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')
thomascorthouts
la source
Bienvenue chez PPCG! Vous devez .split('')diviser la chaîne vide; .split()se transforme "abc"en ["abc"].
Dennis
1

Forth (gforth) , 45 octets

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

Essayez-le en ligne!

Explication du code

: 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
la source
1

Rubis, 24 octets

J'espérais battre Martin Ender , mais je n'ai réussi qu'à l'attacher.

Prend entrée sur STDIN; +1 octet pour l' -pindicateur.

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

Essayez-le en ligne!

Jordan
la source
1

Gaia , 4 octets

ċb¦ṡ

Assez content avec ça

Comment ça fonctionne

ċ   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 

Essayez-le en ligne!

EdgyNerd
la source
0

STATA 158

J'ai utilisé une approche différente de la plupart. Lisez-le via l'invite display _request () (raccourci à di _r (r)). Écrivez la chaîne dans un fichier appelé b en mode texte. Ouvrez b en mode binaire et lisez chaque caractère sous forme d'octet et convertissez-le en binaire. Techniquement, le fichier b doit être fermé à la fin, mais c'est un programme valide qui s'exécute correctement sans lui.

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
la source
0

Golang - 68

Je suis nouveau sur Go et je ne suis pas sûr des règles de comptage des caractères dans cette langue ici non plus.

Importations (11 octets):

import"fmt"

Fonction (55 octets):

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

Vous pouvez l'exécuter ici .

hmatt1
la source
0

Jamais C # ne gagnera ce genre de questions mais voici un essai, complètement sans encodage. :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));
Abbas
la source
Cela pourrait être rendu beaucoup plus court en utilisant une fonction lambda, c'est-à-dire: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));Cependant, notez qu'en raison de l'utilisation .Select(), cette réponse plus courte et votre réponse d'origine doivent inclure les 18 octets pour, using System.Linq;sauf si vous spécifiez qu'elle utilise le compilateur interactif Visual C # , qui importe System.Linq par défaut
Skidsdev
Voici la solution de fonction lambda utilisant Interactive Compiler, total de 55 octets
Skidsdev
0

Cobra - 64

En tant que Lambda:

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