Ciąg do binarnego

19

To wyzwanie dla golfa. Tak jak mówi tytuł, napisz program, który ukryje ciąg znaków ascii w formacie binarnym.

Na przykład:

"Hello World!" powinien zamienić się w 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Uwaga: Szczególnie interesuje mnie implementacja Pyth.

ericmarkmartin
źródło
1
Poprosiliśmy o odwrócenie: codegolf.stackexchange.com/questions/35096/…
hmatt1
1
Zauważyłem to. Istnieje anegdota, dlaczego zadałem to pytanie. Zachęciłem mojego przyjaciela do nauki programowania, a on zeszłego lata wziął udział w zajęciach java, gdzie każdy uczeń musiał wybrać projekt. Powiedział mi, że chce przetłumaczyć tekst na binarny, co zrobiłem (ku jego konsternacji) w pythonie 3 w 1 linii (bardzo długa linia). Uważam, że to niesamowite, że jego pomysł na projekt można sprowadzić do 8 bajtów.
ericmarkmartin
1
to świetnie, dziękuję za udostępnienie! Lubię takie łatwiejsze pytania, ponieważ daje to większej liczbie osób szansę na udział i generuje wiele treści w formie odpowiedzi.
hmatt1
1
Czy to musi być ASCII? tzn. jeśli technologia nie jest kompatybilna z ASCII, czy wyniki mogą to odzwierciedlać?
Shaun Bebbers
1
Czy możemy założyć ASCII do wydruku 32-127? Jeśli tak, to czy ciągi binarne mogą składać się z 7 znaków z dopełnieniem lewego zera?
640 KB

Odpowiedzi:

13

CJam, 8 bajtów

l:i2fbS*

Bułka z masłem:

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

Wypróbuj tutaj

Optymalizator
źródło
13

Python 3, 41 bajtów

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

Podobnie jak odpowiedź KSFT , ale pomyślałem, że zwrócę uwagę na to, że raw_input -> inputPython 3 ma tutaj również przewagę ze względu na splat print.

Sp3000
źródło
8

Pyth, 10 bajtów

jdmjkjCd2z

Mapowanie i objaśnienie Pythona:

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"

Dane wejściowe to ciąg, który należy przekonwertować bez cudzysłowów.

Wypróbuj tutaj

Optymalizator
źródło
10
Czy asdfghjlkl jest również prawidłowym programem pytowym? Co to robi?
flawr
@flawr szkoda próbować? ;)
Optymalizator
2
@flawr Kompiluje się do pytona Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), whee d = '' i k = ''. Więc nie, to wcale nie jest ważne.
isaacg
12
@ ericmark26 rozejrzyj się po pokoju lub biurze i rozbij wszystko, co możesz znaleźć na klawiaturze i sprawdź, czy to interpretuje. Dowiedz się, co robi, a następnie powtórz z następnym obiektem. Kiedy zabraknie, spróbuj różnych obrotów.
globby
2
@ ericmark26 Myślę, że najlepszym sposobem na przyzwyczajenie się do Pyth'a jest wzięcie prostych programów w Pythonie i przetłumaczenie ich na Pyth.
isaacg
4

Python 3 - 43 bajty


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

Nie najkrótsza, ale ciekawe podejście IMO. Ma tę dodatkową zaletę, że jeśli liczba znaczących bitów jest różna, EG Hi!, wypełnianie zerami jest trywialne (2 dodatkowe bajty, w przeciwieństwie do 9 dla .zfill(8)):

print(*map("{:08b}".format,input().encode()))
matsjoyce
źródło
3

Python - 52

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

Popracuję nad przetłumaczeniem tego na Pyth. Ktoś inny już odpowiedział na pytanie Pyth.

Jeśli nie obchodzi Cię, że jest to pełny program lub format I / O i korzystasz z Python 3, możesz to zrobić w 23 bajtach, takich jak:

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

x jest wejściem.

Wiem, że to się nie liczy, ponieważ tłumacz nie został zwolniony przed opublikowaniem wyzwania, ale tutaj jest w KSFTgolf:

oan
KSFT
źródło
3

Rubin, 34 28 24 bajtów

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

Pobiera dane wejściowe przez STDIN. 6 bajtów zaoszczędzonych dzięki za AShelly i kolejne 4 dzięki Britishtea.

Martin Ender
źródło
przyciąć o 6 z$<.each_byte{|c|$><<"%b "%c}
AShelly
Możesz ogolić więcej postaci, używając String#byteszamiast String#each_byte. Forma bloku jest przestarzała, ale nadal działa :)
britishtea
@britishtea Och, miło. Dziękuję Ci!
Martin Ender
2

Matlab

To anonimowa funkcja

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

użycie jest f('Hello World').

Alternatywnie, jeśli xjest zdefiniowany jako ciąg znaków Hello World!w obszarze roboczym, po prostu dec2bin(char(x))będzie działać.

David
źródło
Nie jestem pewien, jak to zdobyć, ponieważ nie jestem pewien, jak mogę uzyskać wkład. Jakieś komentarze?
David
Dlaczego char? Myślę, że masz na myślidec2bin(x)-'0'
Luis Mendo,
Ponieważ nie jestem taki sprytny!
David
Chodzi mi o to: char(x)gdy xjest już ciągiem, nic nie robi. Możesz go usunąć, aby zaoszczędzić miejsce. Z drugiej strony wynikiem dec2binjest ciąg znaków i myślę, że wynikiem powinny być liczby
Luis Mendo
Rozumiem i oczywiście masz rację. Matlab ułatwia czasem zapomnienie o typach danych.
David
2

J - 9

1":#:3&u:

Nie mam pojęcia, jak zrobić to z rzędu bez podwojenia długości kodu, potrzebuję J guru, aby mi powiedzieć :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001
śmigać
źródło
2
Możesz dodać ".na początek. Ocenia twój wynik, więc będzie w jednym wierszu i będzie oddzielony spacjami. Jeszcze krótsza jest stworzenie Base10 liczb z cyfr base2: 10#.#:3&u:.
randomra
2

Java - 148 bajtów

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

Edytowane w celu włączenia pełnego pliku

Bryan Devaney
źródło
2
Myślę, że OP chce pełnego programu, a nie tylko fragmentu. Co więcej, można grać w golfa o wiele więcej, uważa.
Rodolfo Dias
to jest pełny program, jeśli umieścisz go w klasie głównej, uruchomi się. co do lepszego golfa, prawdopodobnie, ale nie mogłem tego dostrzec.
Bryan Devaney
1
Pełny program obejmuje także klasę główną.
Rodolfo Dias
może być krótszy przy użyciu, for(char c:a[0].toCharArray()){a nawet for(byte b:a[0].getBytes()){ponieważ dane wejściowe są ascii, przy założeniu, że ustawienia regionalne maszyny są inne niż utf-16
njzk2
1
Możesz pozbyć się publici skrócić nazwę programu do jednego znaku, aby wygrać więcej bajtów. Plus (String[]a)jest doskonale akceptowany przez kompilator, dzięki czemu zyskujesz kolejny bajt.
Rodolfo Dias
2

JavaScript ES6, 63 65 bajtów

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

Jest to dość długie, dzięki długim nazwom funkcji JavaScript. Poniższy fragment stosu jest przybliżonym odpowiednikiem ES5, więc można go uruchomić w dowolnej przeglądarce. Dzięki edc65 za ulepszenia gry w golfa.

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

NinjaBearMonkey
źródło
1
[for of]jest nieco krótszy niż [...].mapwyliczenie znaków w ciągach:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65
Możesz zagrać w golfa o dwa bajty, zastępując .join(' ')je .join` ` . Możesz promptalert
zagrać
2

Scala - 59 - 55 bajtów

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

Zwykle należy używać foreach, a nie map.

Dominik Müller
źródło
2

Kod maszynowy 8088, IBM PC DOS, 33 31 bajtów *

Wymienianie kolejno:

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 

Kompletny plik COM systemu DOS na komputer PC, dane wejściowe są przekazywane z wiersza poleceń.

Z wiodącymi zerami:

enter image description here

Pobierz i przetestuj ASCBIN.COM .

Lub 39 bajtów bez wiodących zer:

enter image description here

Pobierz i przetestuj ASCBIN2.COM .

* Ponieważ nie było dla mnie wyraźnie jasne, czy wiodące zera są dozwolone, publikuję wersje w obie strony.

640 KB
źródło
2

MITS Altair 8800 , 0 bajtów

Łańcuch wejściowy znajduje się pod adresem pamięci #0000H( dozwolony ). Wyjście binarne za pośrednictwem lampek we / wy na panelu przednim D7-D0.

Przykład: do RESET, następnie, EXAMINEaby zobaczyć pierwszy bajt, a następnie powtórz, EXAMINE NEXTaby zobaczyć resztę.

"H" = 01 001 000:

enter image description here

"e" = 01 100 101:

enter image description here

"l" = 01 101 100:

enter image description here

Wypróbuj online!

Oczywiście niekonkurujące. :)

640 KB
źródło
1

Haskell, 65

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

intensywne korzystanie z monady listy. nie można go przekonwertować na listy zgodności, ponieważ ostatnie instrukcje nie były return.

dumny haskeller
źródło
1

C ++ - 119 bajtów

Uwalnianie pamięci? Co to jest?

#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 kompiluje kod z ostrzeżeniem)

BMac
źródło
1
Wersja C, krótszamain(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 i TheC64Mini, 101 tokenizowanych bajtów BASIC

Oto zaciemniony wykaz przy użyciu skrótów słów kluczowych 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

Tutaj w celu wyjaśnienia znajduje się lista symboliczna nie zaciemniona:

 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

Funkcja fn bzadeklarowana w linii zero przyjmuje parametr numeryczny, xktórego wartość jest ANDedytowana z wartością b; SGN jest następnie wykorzystywany do konwersji x and bdo1 lub 0.

Pierwszy wiersz akceptuje ciąg wejściowy do zmiennej a$, a pętla rozpoczyna się (oznaczona za pomocą i) na długości tego wejścia. breprezentuje każdy bit od 6 do 0 bitu. c$przyjmuje każdy znak ciągu na pozycjęi .

linia 5 rozpoczyna pętlę w celu przetestowania każdej pozycji bitu; right$jest używany w wierszu 6 do usunięcia problemu z automatycznym formatowaniem, gdy Commodore BASIC wyświetla liczbę, przekształcając dane wyjściowe fn bna ciąg;asc(c$)konwertuje bieżący znak na jego kod ascii jako wartość dziesiętną.

Wiersz 7 reprezentuje następną wartość bitu. Pętla jkończy się przed wydrukowaniem spacji, a następnie ikończy się ostatnia pętla .

C64 converting PETSCII to Binary

Shaun Bebbers
źródło
1

JavaScript ES6, 71 bajtów

alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')
thomascorthouts
źródło
Witamy w PPCG! Musisz .split('')podzielić na pusty ciąg; .split()zamienia się "abc"w ["abc"].
Dennis
1

Dalej (gforth) , 45 bajtów

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

Wypróbuj online!

Objaśnienie kodu

: 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
źródło
1

Ruby, 24 bajty

Miałem nadzieję pokonać Martina Endera , ale udało mi się go tylko związać.

Pobiera dane wejściowe na STDIN; +1 bajty dla -pflagi.

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

Wypróbuj online!

Jordania
źródło
1

Gaia , 4 bajty

ċb¦ṡ

Całkiem zadowolony z tego

Jak to działa

ċ   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 

Wypróbuj online!

EdgyNerd
źródło
0

STATA 158

Zastosowałem inne podejście niż większość. Odczyt za pomocą monitu _request () (skrócony do di _r (r)). Zapisz ciąg do pliku o nazwie bw trybie tekstowym. Otwórz bw trybie binarnym i odczytaj każdy znak jako bajt i przekonwertuj na binarny. Technicznie rzecz biorąc, plik b powinien zostać zamknięty na końcu, ale jest to poprawny program i działa bez niego poprawnie.

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
}
znaczniki
źródło
0

Golang - 68

Jestem nowy w Go i nie jestem pewien zasad liczenia znaków w tym języku tutaj.

Import (11 bajtów):

import"fmt"

Funkcja (55 bajtów):

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

Możesz go uruchomić tutaj .

hmatt1
źródło
0

C # nigdy nie wygra tego rodzaju pytań, ale oto próba, całkowicie bez kodowania. :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));
Abbas
źródło
Można to znacznie skrócić za pomocą funkcji lambda, tj .: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));Należy jednak pamiętać, że ze względu na użycie .Select()zarówno tej krótszej odpowiedzi, jak i oryginalnej odpowiedzi, należy podać 18 bajtów, using System.Linq;chyba że podasz, że używa kompilatora interaktywnego Visual C # , który domyślnie importuje System.Linq
Skidsdev
Oto rozwiązanie funkcji lambda przy użyciu interaktywnego kompilatora, łącznie 55 bajtów
Skidsdev
0

Kobra - 64

Jako lambda:

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
Obrzydliwe
źródło