Chuỗi thành nhị phân


19

Đây là một thử thách golf mã. Giống như tiêu đề đã nói, hãy viết một chương trình để chuyển đổi một chuỗi các ký tự ascii thành nhị phân.

Ví dụ:

"Hello World!" nên biến thành 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Lưu ý: Tôi đặc biệt quan tâm đến việc thực hiện pyth.


1
Chúng tôi đã hỏi ngược lại: codegolf.stackexchange.com/questions/35096/iêu
hmatt1

1
Tôi nhận thấy rằng. Có một giai thoại cho lý do tại sao tôi hỏi câu hỏi này. Tôi đã khuyến khích bạn tôi học lập trình, và anh ấy đã tham gia một lớp java vào mùa hè năm ngoái, nơi mỗi sinh viên phải chọn một dự án. Anh ấy nói với tôi rằng anh ấy muốn dịch văn bản sang nhị phân, điều mà sau đó tôi đã làm (với sự mất tinh thần của anh ấy) trong dòng python 3 in 1 (một dòng rất dài). Tôi thấy không thể tin được rằng ý tưởng dự án của anh ta có thể được chắt lọc xuống còn 8 byte.
ericmarkmartin

1
Thật tuyệt, cảm ơn vì đã chia sẻ! Tôi thích những câu hỏi dễ hơn như thế này vì nó cho nhiều người hơn cơ hội tham gia và tạo ra nhiều nội dung dưới dạng câu trả lời.
hmatt1

1
Nó có phải là ASCII không? tức là, nếu một công nghệ không tương thích ASCII, kết quả có thể phản ánh điều đó không?
Shaun Bebbers

1
Chúng ta có thể giả sử ASCII có thể in 32-127 không? Nếu vậy, chuỗi nhị phân có thể là 7 ký tự với phần đệm không bên trái không?
640KB

Câu trả lời:


13

CJam, 8 byte

l:i2fbS*

Dễ như ăn bánh:

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

Hãy thử nó ở đây


13

Python 3, 41 byte

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

Giống như câu trả lời của KSFT , nhưng tôi nghĩ tôi đã chỉ ra rằng, ngoài ra raw_input -> input, Python 3 còn có một lợi thế ở đây nhờ tính năng splat cho print.


8

Bình thường, 10 byte

jdmjkjCd2z

Ánh xạ và giải thích 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"

Đầu vào là chuỗi cần phải được chuyển đổi mà không có dấu ngoặc kép.

Hãy thử nó ở đây


10
Asdfghjlkl cũng là một chương trình pyth hợp lệ? Nó làm gì?
flawr

@flawr có hại gì khi thử không? ;)
Trình tối ưu hóa

2
@flawr Điều đó biên dịch thành python Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), whee d = '' và k = ''. Vì vậy, không có giá trị.
isaacg

12
@ ericmark26 nhìn xung quanh phòng hoặc văn phòng của bạn, và đập vỡ mọi thứ bạn có thể tìm thấy trên bàn phím và xem nó có diễn giải không. Chỉ ra những gì nó làm, và sau đó lặp lại với đối tượng tiếp theo. Khi bạn chạy ra ngoài, hãy thử các vòng quay khác nhau.
globalby

2
@ ericmark26 Tôi nghĩ cách tốt nhất để làm quen với Pyth là dùng một số chương trình Python đơn giản và dịch chúng sang Pyth.
isaacg

4

Python 3 - 43 byte


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

Không hoàn toàn ngắn nhất, nhưng một cách tiếp cận thú vị IMO. Nó có thêm lợi thế là nếu số lượng bit đáng kể thay đổi, thì EG Hi!, việc đệm với các số 0 là không đáng kể (thêm 2 byte, trái ngược với 9 cho .zfill(8)):

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

3

Con trăn - 52

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

Tôi sẽ làm việc để dịch cái này sang Pyth. Một số người khác đã trả lời Pyth rồi.

Nếu bạn không quan tâm đến việc nó là một chương trình đầy đủ hoặc về định dạng I / O và sử dụng Python 3, bạn có thể làm điều đó trong 23 byte như thế này:

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

x là đầu vào.

Tôi biết điều này không được tính bởi vì trình thông dịch đã không được phát hành trước khi thử thách được đăng, nhưng đây là trong KSFTgolf:

oan

3

Ruby, 34 28 24 byte

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

Đưa đầu vào qua STDIN. 6 byte được lưu cảm ơn cho AShelly và 4 byte khác nhờ vào britishtea.


cắt giảm 6 với$<.each_byte{|c|$><<"%b "%c}
AShelly 23/1/2015

Bạn có thể cạo thêm một số ký tự bằng cách sử dụng String#bytesthay vì String#each_byte. Hình thức khối không được chấp nhận, nhưng nó vẫn hoạt động :)
britishtea

@britishtea ơi, đẹp quá. cảm ơn bạn!
Martin Ender


2

Matlab

Đây là một chức năng ẩn danh

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

sử dụng là f('Hello World').

Ngoài ra, nếu xđược định nghĩa là chuỗi Hello World!trong không gian làm việc, thì nó dec2bin(char(x))sẽ hoạt động.


Tôi không chắc chắn về cách ghi điểm này vì tôi không chắc làm thế nào tôi có thể nhận được đầu vào. Có ý kiến ​​gì không?
David

Tại sao char? Tôi nghĩ ý bạn làdec2bin(x)-'0'
Luis Mendo

Bởi vì tôi không thông minh!
David

Quan điểm của tôi là : char(x), khi xđã là một chuỗi, không làm gì cả. Vì vậy, bạn có thể loại bỏ nó để tiết kiệm một số không gian. Mặt khác, kết quả của dec2binmột chuỗi và tôi nghĩ đầu ra phải là số
Luis Mendo

Tôi hiểu, và bạn đúng, tất nhiên. Matlab đôi khi dễ dàng quên đi các loại dữ liệu.
David

2

J - 9

1":#:3&u:

Không biết làm thế nào để thực hiện điều này liên tiếp mà không tăng gấp đôi độ dài của mã, tôi cần J gurus để nói với tôi :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001

2
Bạn có thể thêm ".vào đầu. Nó đánh giá kết quả của bạn để nó sẽ nằm trong một dòng và cách nhau bởi khoảng trắng. Thậm chí ngắn hơn là tạo các số cơ sở10 với các chữ số cơ sở 2 : 10#.#:3&u:.
ngẫu nhiên

2

Java - 148 byte

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

Đã chỉnh sửa để bao gồm toàn bộ tập tin


2
Tôi nghĩ OP muốn một chương trình đầy đủ, không chỉ là một đoạn trích. Thêm vào đó, nó có thể được chơi golf nhiều hơn nữa, methinks.
Rodolfo Dias

đó là chương trình đầy đủ, nếu bạn đặt nó trong một lớp chính, nó sẽ chạy. như để chơi golf tốt hơn, có lẽ nhưng tôi không thể nhận ra làm thế nào.
Bryan Devaney

1
Chương trình đầy đủ bao gồm cả lớp chính.
Rodolfo Dias

có thể ngắn hơn bằng cách sử dụng for(char c:a[0].toCharArray()){hoặc thậm chí for(byte b:a[0].getBytes()){vì đầu vào là ascii, giả sử một địa điểm máy không utf-16
njzk2

1
Bạn có thể thoát khỏi publicvà rút ngắn tên chương trình thành một char duy nhất để giành được nhiều byte hơn. Thêm vào đó, (String[]a)được trình biên dịch chấp nhận hoàn hảo, mang lại cho bạn một byte khác.
Rodolfo Dias

2

JavaScript ES6, 63 65 byte

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

Điều này khá dài, nhờ các tên hàm dài của JavaScript. Đoạn trích dưới đây là tương đương ES5 thô, vì vậy nó có thể chạy trong bất kỳ trình duyệt nào. Cảm ơn edc65 cho những cải tiến chơi golf.

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


1
[for of]ngắn hơn một chút so [...].mapvới liệt kê các biểu đồ trong chuỗi:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65

Bạn có thể loại bỏ hai byte bằng cách thay thế .join(' ')bằng .join` ` . Bạn có thể loại bỏ rất nhiều byte bằng cách sử dụng một hàm thay vì prompt/alert
RamenChef

2

Scala - 59 - 55 byte

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

Thông thường, người ta nên sử dụng foreach và không ánh xạ.


2

Mã máy 8088, IBM PC DOS, 33 31 byte *

Liệt kê:

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 

Toàn bộ tệp COM thực thi PC DOS, đầu vào là thông qua dòng lệnh.

Với số không hàng đầu:

nhập mô tả hình ảnh ở đây

Tải xuống và kiểm tra ASCBIN.COM .

Hoặc 39 byte mà không có số 0 đứng đầu:

nhập mô tả hình ảnh ở đây

Tải xuống và kiểm tra ASCBIN2.COM .

* Vì tôi không rõ ràng rõ ràng cho dù số 0 đầu có được phép hay không, nên đăng các phiên bản theo cả hai cách.


2

MITS Altair 8800 , 0 byte

Chuỗi đầu vào là tại địa chỉ bộ nhớ #0000H( được phép ). Đầu ra ở dạng nhị phân thông qua đèn I / O phía trước D7-D0.

Ví dụ, làm RESET, sau đó EXAMINEđể xem byte đầu tiên, tiếp theo là lặp lại EXAMINE NEXTđể xem phần còn lại.

"H" = 01 001 000:

nhập mô tả hình ảnh ở đây

"e" = 01 100 101:

nhập mô tả hình ảnh ở đây

"l" = 01 101 100:

nhập mô tả hình ảnh ở đây

Hãy thử trực tuyến!

Không cạnh tranh, tất nhiên. :)


1

Haskell, 65

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

sử dụng nặng của danh sách đơn nguyên. nó không thể được chuyển đổi thành danh sách các điều khoản vì các tuyên bố cuối cùng không phải là a return.


1

C ++ - 119 byte

Giải phóng bộ nhớ? Cái gì vậy

#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 biên dịch mã với cảnh báo)


1
Phiên bản C, ngắn hơnmain(int c,char**v){char x[9];for(;c=*(v[1]++);printf("%s ",itoa(c,x,2)));}
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳





1

Hàng hóa VIC-20 / C64 / 128 và TheC64Mini, 101 byte BASIC được mã hóa

Dưới đây là danh sách bị xáo trộn bằng cách viết tắt từ khóa BASore 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

Ở đây cho mục đích giải thích là danh sách biểu tượng không bị che giấu:

 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

Các chức năng fn btuyên bố trên dòng zero chấp nhận một tham số số của xđược ANDed với giá trị b; SGN sau đó được sử dụng để chuyển đổi x and bsang 1hoặc 0.

Dòng một chấp nhận đầu vào chuỗi cho biến a$và vòng lặp bắt đầu (ký hiệu là i) với độ dài của đầu vào đó. bđại diện cho mỗi bit từ bit thứ 6 đến 0. c$lấy mỗi ký tự của chuỗi ở vị trí i.

dòng 5 bắt đầu vòng lặp để kiểm tra từng vị trí bit; right$được sử dụng trong dòng 6 để loại bỏ vấn đề định dạng tự động khi BASore BASIC hiển thị một số, chuyển đổi đầu ra fn bthành chuỗi; asc(c$)chuyển đổi ký tự hiện tại thành mã ascii của nó dưới dạng giá trị thập phân.

Dòng 7 đại diện cho giá trị bit tiếp theo. Vòng lặp jđược kết thúc trước khi in một khoảng trắng, sau đó vòng lặp cuối cùng ikết thúc.

C64 chuyển đổi PETSCII sang nhị phân


1

JavaScript ES6, 71 byte

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

Chào mừng đến với PPCG! Bạn cần .split('')phải phân chia tại chuỗi trống; .split()biến "abc"thành ["abc"].
Dennis

1

Forth (gforth) , 45 byte

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

Hãy thử trực tuyến!

Giải thích mã

: 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 byte

ċb¦ṡ

Khá hài lòng với điều này

Làm thế nào nó hoạt động

ċ   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 

Hãy thử trực tuyến!



0

SỐ LIỆU 158

Tôi đã sử dụng một cách tiếp cận khác với hầu hết. Đọc qua lời nhắc hiển thị _request () (rút ngắn thành di _r (r)). Viết chuỗi vào một tệp gọi là b trong chế độ văn bản. Mở b trong chế độ nhị phân và đọc từng ký tự dưới dạng byte và chuyển đổi thành nhị phân. Về mặt kỹ thuật, tập tin b nên được đóng ở cuối, nhưng nó là một chương trình hợp lệ và chạy thành công mà không có nó.

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

Tôi mới sử dụng Go và tôi cũng không chắc về quy tắc đếm các ký tự trong ngôn ngữ này ở đây.

Nhập khẩu (11 byte):

import"fmt"

Hàm (55 byte):

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

Bạn có thể chạy nó ở đây .


0

Sẽ không bao giờ C # giành được những loại câu hỏi này nhưng đây là một thử, hoàn toàn không có mã hóa. :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));

Điều này có thể được thực hiện ngắn hơn nhiều bằng cách sử dụng hàm lambda, nghĩa là: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));Tuy nhiên, lưu ý rằng, do sử dụng .Select(), cả câu trả lời ngắn hơn này và câu trả lời ban đầu của bạn, cần bao gồm 18 byte cho using System.Linq;trừ khi bạn chỉ định rằng nó sử dụng Trình biên dịch tương tác Visual C # , nhập khẩu System.Linq theo mặc định
Skidsdev

Đây là giải pháp chức năng lambda sử dụng Trình biên dịch tương tác, tổng cộng 55 byte
Skidsdev

0

Rắn hổ mang - 64

Là một Lambda:

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.