String ke Biner

19

Ini adalah tantangan kode golf. Sama seperti judulnya, tulis sebuah program untuk menyamarkan serangkaian karakter ascii ke dalam biner.

Sebagai contoh:

"Hello World!" harus berubah menjadi 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Catatan: Saya sangat tertarik dengan implementasi pyth.

ericmarkmartin
sumber
1
Kami telah meminta yang terbalik: codegolf.stackexchange.com/questions/35096/...
hmatt1
1
Aku tahu itu. Ada sebuah anekdot mengapa saya menanyakan pertanyaan ini. Saya mendorong teman saya untuk belajar pemrograman, dan dia mengambil kelas java musim panas lalu di mana setiap siswa harus memilih proyek. Dia mengatakan kepada saya bahwa dia ingin menerjemahkan teks ke biner, yang kemudian saya lakukan (membuatnya kecewa) dengan python 3 in 1 baris (garis yang sangat panjang). Saya merasa luar biasa bahwa ide proyeknya dapat disuling hingga 8 byte.
ericmarkmartin
1
itu keren, terima kasih sudah berbagi! Saya suka pertanyaan yang lebih mudah seperti ini karena memberi lebih banyak orang kesempatan untuk berpartisipasi dan menghasilkan banyak konten dalam bentuk jawaban.
hmatt1
1
Apakah harus ASCII? yaitu, jika suatu teknologi tidak kompatibel dengan ASCII, dapatkah hasilnya mencerminkan hal itu?
Shaun Bebbers
1
Bisakah kita menganggap ASCII dapat dicetak 32-127? Jika demikian, bisakah string biner menjadi 7 karakter dengan zero-padding kiri?
640KB

Jawaban:

13

CJam, 8 byte

l:i2fbS*

Mudah-peasy:

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

Coba di sini

Pengoptimal
sumber
13

Python 3, 41 byte

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

Seperti jawaban KSFT , tapi saya pikir saya akan menunjukkan bahwa, selain raw_input -> input, Python 3 juga memiliki keuntungan di sini karena percikan untuk print.

Sp3000
sumber
8

Pyth, 10 byte

jdmjkjCd2z

Pemetaan dan penjelasan 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"

Input adalah string yang perlu dikonversi tanpa tanda kutip.

Coba di sini

Pengoptimal
sumber
10
Apakah asdfghjlkl juga merupakan program pyth yang valid? Apa fungsinya?
flawr
@ flawr ada salahnya mencoba? ;)
Pengoptimal
2
@ flawr Mengkompilasi ke python Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), whee d = '' dan k = ''. Jadi tidak, sama sekali tidak valid.
isaacg
12
@ ericmark26 lihat di sekitar kamar atau kantor Anda, dan hancurkan segala sesuatu yang dapat Anda temukan di keyboard Anda dan lihat apakah itu bisa diartikan. Cari tahu apa fungsinya, dan kemudian ulangi dengan objek berikutnya. Ketika Anda kehabisan, coba rotasi berbeda.
globby
2
@ ericmark26 Saya pikir cara terbaik untuk membiasakan diri dengan Pyth adalah dengan mengambil beberapa program Python sederhana, dan menerjemahkannya ke dalam Pyth.
isaacg
4

Python 3 - 43 byte


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

Tidak sesingkat itu, tetapi pendekatan IMO yang menarik. Ini memiliki keuntungan tambahan bahwa jika jumlah bit signifikan bervariasi, EG Hi!, padding dengan nol adalah sepele (2 byte lebih, dibandingkan dengan 9 untuk .zfill(8)):

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

Python - 52

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

Saya akan bekerja menerjemahkan ini ke Pyth. Orang lain sudah menjawab Pyth.

Jika Anda tidak peduli bahwa itu adalah program lengkap atau tentang format I / O dan menggunakan Python 3, Anda dapat melakukannya dalam 23 byte seperti ini:

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

x adalah input.

Saya tahu ini tidak masuk hitungan karena penerjemah belum dirilis sebelum tantangan dipasang, tapi ini dia di KSFTgolf:

oan
KSFT
sumber
3

Ruby, 34 28 24 byte

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

Mengambil input melalui STDIN. 6 byte disimpan, terima kasih untuk AShelly dan 4 lainnya berkat inggris.

Martin Ender
sumber
trim by 6 with$<.each_byte{|c|$><<"%b "%c}
AShelly
Anda dapat mengurangi beberapa karakter dengan menggunakan String#bytesalih-alih String#each_byte. Formulir blok sudah usang, tetapi masih berfungsi :)
britishtea
@ britishtea Oh, bagus. Terima kasih!
Martin Ender
2

Matlab

Ini adalah fungsi anonim

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

penggunaan adalah f('Hello World') .

Atau, jika xdidefinisikan sebagai string Hello World!di ruang kerja, maka hanya dec2bin(char(x))akan berfungsi.

David
sumber
Saya tidak yakin bagaimana cara menilai ini karena saya tidak yakin bagaimana saya bisa mendapatkan input. Ada komentar?
David
Mengapa char? Saya pikir maksud Andadec2bin(x)-'0'
Luis Mendo
Karena aku tidak sepintar itu!
David
Maksud saya adalah:, char(x)ketika xsudah menjadi string, tidak melakukan apa-apa. Jadi Anda bisa menghapusnya untuk menghemat ruang. Di sisi lain, hasilnya dec2binadalah string, dan saya pikir outputnya harus berupa angka
Luis Mendo
Saya mengerti, dan Anda benar, tentu saja. Matlab membuatnya kadang-kadang mudah melupakan tipe data.
David
2

J - 9

1":#:3&u:

Tidak tahu bagaimana membuat ini berturut-turut tanpa menggandakan panjang kode, saya perlu guru J untuk memberi tahu saya :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001
desir
sumber
2
Anda bisa menambahkannya ".ke awal. Ini mengevaluasi hasil Anda sehingga akan berada dalam satu baris dan dipisahkan oleh spasi. Bahkan lebih pendek adalah untuk menciptakan Base10 nomor dengan digit 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)+" ");}}}

Diedit untuk memasukkan file lengkap

Bryan Devaney
sumber
2
Saya pikir OP ingin program lengkap, bukan hanya cuplikan. Plus, bisa bermain golf lebih banyak, methinks.
Rodolfo Dias
itu adalah program lengkap, jika Anda menempatkannya di kelas utama, itu akan berjalan. Adapun golf lebih baik, mungkin tetapi saya tidak bisa melihat caranya.
Bryan Devaney
1
Program lengkap termasuk kelas utama juga.
Rodolfo Dias
bisa lebih pendek menggunakan for(char c:a[0].toCharArray()){atau bahkan for(byte b:a[0].getBytes()){karena inputnya ascii, dengan asumsi lokal mesin non-utf-16
njzk2
1
Anda dapat menyingkirkan publicdan mempersingkat nama program menjadi satu karakter untuk memenangkan lebih banyak byte. Plus, (String[]a)diterima dengan sempurna oleh kompiler, menghasilkan Anda byte lain.
Rodolfo Dias
2

JavaScript ES6, 63 65 byte

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

Ini agak panjang, berkat nama fungsi JavaScript yang panjang. Cuplikan Stack di bawah ini adalah setara ES5 kasar, sehingga dapat dijalankan di browser apa pun. Terima kasih kepada edc65 untuk peningkatan golf.

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

NinjaBearMonkey
sumber
1
[for of]sedikit lebih pendek daripada [...].mapuntuk menghitung karakter dalam string:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65
Anda dapat bermain golf dua byte dengan menggantinya .join(' ')dengan .join` ` . Anda dapat bermain golf banyak byte dengan menggunakan fungsi alih-alih prompt/alert
RamenChef
2

Scala - 59 - 55 Bytes

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

Biasanya, seseorang harus menggunakan foreach dan bukan memetakan.

Dominik Müller
sumber
2

8088 kode mesin, IBM PC DOS, 33 31 byte *

Daftar:

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 

File COM DOS yang dapat dieksekusi PC lengkap, input melalui baris perintah.

Dengan nol di depan:

masukkan deskripsi gambar di sini

Unduh dan uji ASCBIN.COM .

Atau 39 byte tanpa nol di depan:

masukkan deskripsi gambar di sini

Unduh dan uji ASCBIN2.COM .

* Karena tidak jelas secara eksplisit kepada saya apakah angka nol di depan diperbolehkan atau tidak, saya memposting versi keduanya.

640KB
sumber
2

MITS Altair 8800 , 0 byte

String input ada di alamat memori #0000H( diizinkan ). Output dalam biner melalui lampu I / O panel depanD7-D0 .

Contoh, lakukan RESET, kemudian EXAMINEuntuk melihat byte pertama, diikuti oleh pengulangan EXAMINE NEXTuntuk melihat sisanya.

"H" = 01 001 000:

masukkan deskripsi gambar di sini

"e" = 01 100 101:

masukkan deskripsi gambar di sini

"l" = 01 101 100:

masukkan deskripsi gambar di sini

Cobalah online!

Tidak bersaing, tentu saja. :)

640KB
sumber
1

Haskell, 65

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

banyak menggunakan daftar monad. itu tidak dapat dikonversi ke daftar pemahaman karena pernyataan terakhir bukan a return.

haskeller bangga
sumber
1

C ++ - 119 byte

Membebaskan memori? Apa itu?

#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 mengkompilasi kode dengan peringatan)

BMac
sumber
1
Versi C, lebih pendekmain(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 dan TheC64Mini, 101 byte BASIC tokenized

Berikut adalah daftar yang dikaburkan menggunakan singkatan kata kunci 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

Di sini untuk tujuan penjelasan adalah daftar simbolik yang tidak dikaburkan:

 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

Fungsi yang fn bdideklarasikan pada baris nol menerima parameter numerik xyang ANDed dengan nilai b; SGN kemudian digunakan untuk mengkonversi x and bke1 atau 0.

Baris satu menerima input string ke variabel a$, dan loop dimulai (dilambangkan dengan i) ke panjang input itu. bmewakili setiap bit dari bit ke-6 sampai ke-0.c$mengambil setiap karakter string pada posisi i.

baris 5 memulai loop untuk menguji setiap posisi bit; right$digunakan pada baris 6 untuk menghapus masalah pemformatan otomatis ketika Commodore BASIC menampilkan angka, mengubah output fn bmenjadi string; asc(c$)mengkonversi karakter saat ini ke kode ascii sebagai nilai desimal.

Baris 7 mewakili nilai bit berikutnya. Loop jberakhir sebelum mencetak spasi, lalu loop terakhir iberakhir.

C64 mengonversi PETSCII ke Binary

Shaun Bebbers
sumber
1

JavaScript ES6, 71 byte

alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')
thomascorthouts
sumber
Selamat datang di PPCG! Anda perlu .split('')memisahkan pada string kosong; .split()berubah "abc"menjadi ["abc"].
Dennis
1

Keempat (gforth) , 45 byte

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

Cobalah online!

Penjelasan Kode

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

Ruby, 24 byte

Saya berharap bisa mengalahkan Martin Ender , tetapi saya hanya berhasil mengikatnya.

Mengambil input dari STDIN; +1 byte untuk -pbendera.

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

Cobalah online!

Yordania
sumber
1

Gaia , 4 byte

ċb¦ṡ

Cukup senang dengan ini

Bagaimana itu bekerja

ċ   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 

Cobalah secara Online!

EdgyNerd
sumber
0

STATA 158

Saya menggunakan pendekatan yang berbeda dari kebanyakan. Baca melalui prompt display _request () (disingkat menjadi di _r (r)). Tulis string ke file yang disebut b dalam mode teks. Buka b dalam mode biner dan baca setiap karakter sebagai byte dan konversikan ke biner. Secara teknis file b harus ditutup pada akhirnya, tetapi ini adalah program yang valid dan berjalan dengan sukses tanpa itu.

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
}
tanda
sumber
0

Golang - 68

Saya baru untuk Go dan saya tidak yakin tentang aturan untuk menghitung karakter dalam bahasa ini di sini juga.

Impor (11 byte):

import"fmt"

Fungsi (55 byte):

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

Anda bisa menjalankannya di sini .

hmatt1
sumber
0

C # tidak akan pernah memenangkan pertanyaan-pertanyaan semacam ini tetapi ini adalah suatu percobaan, sepenuhnya tanpa penyandian. :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));
Abbas
sumber
Ini dapat dibuat lebih pendek dengan menggunakan fungsi lambda, yaitu: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));Namun perhatikan bahwa, karena menggunakan .Select(), kedua jawaban yang lebih pendek ini, dan jawaban awal Anda, perlu menyertakan 18 byte untuk using System.Linq;kecuali Anda menentukan bahwa itu menggunakan Visual C # Interactive Compiler , yang mengimpor System.Linq secara default
Skidsdev
Inilah solusi fungsi lambda menggunakan Interactive Compiler, total 55 byte
Skidsdev
0

Cobra - 64

Sebagai Lambda:

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