문자열을 이진으로


19

이것은 코드 골프 도전입니다. 제목에서 알 수 있듯이 ASCII 문자 문자열을 이진수로 변환하는 프로그램을 작성하십시오.

예를 들면 다음과 같습니다.

"Hello World!" 로 바뀌어야한다 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001 합니다.

참고 : 특히 pyth 구현에 관심이 있습니다.


1
우리는 반대의 질문을했다 : codegolf.stackexchange.com/questions/35096/…
hmatt1

1
난 그것을 알아 챘다. 내가 왜이 질문을했는지에 대한 일화가 있습니다. 나는 친구가 프로그래밍을 배우도록 격려했고, 지난 여름에 각 학생이 프로젝트를 선택해야하는 자바 수업을 들었다. 그는 텍스트를 이진으로 번역하고 싶다고 말했는데 파이썬 3에서 1 줄 (매우 긴 줄)으로 (그의 실망에) 그랬습니다. 그의 프로젝트 아이디어를 8 바이트로 증류 할 수 있다는 것이 놀랍습니다.
ericmarkmartin

1
공유해 주셔서 감사합니다. 더 많은 사람들이 참여할 수있는 기회를 제공하고 답변 형식으로 많은 콘텐츠를 생성하기 때문에 이와 같은 쉬운 질문을 좋아합니다.
hmatt1

1
ASCII 여야합니까? 즉, 기술이 ASCII와 호환되지 않는 경우 결과가이를 반영 할 수 있습니까?
Shaun Bebbers

1
ASCII 인쇄 가능 32-127이라고 가정 할 수 있습니까? 그렇다면 이진 문자열은 왼쪽 제로 패딩이있는 7 자일 수 있습니까?
640KB

답변:


13

CJam, 8 바이트

l:i2fbS*

쉬워요:

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

여기 사용해보십시오


13

파이썬 3, 41 바이트

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

마찬가지로 KSFT의 대답 ,하지만 난뿐만 아니라, 지적 줄 알았는데 raw_input -> input인해위한 플랫으로, 파이썬 3도 여기에 장점이있다 print.


8

Pyth, 10 바이트

jdmjkjCd2z

파이썬 매핑 및 설명 :

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"

입력은 따옴표없이 변환해야하는 문자열입니다.

여기 사용해보십시오


10
asdfghjlkl도 유효한 pyth 프로그램입니까? 무엇을합니까?
flawr

@flawr 시도에 어떤 해를 입히고 있습니까? ;)
Optimizer

2
@flawr 파이썬으로 컴파일합니다. Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen())))))whee d = ''및 k = ''. 따라서 전혀 유효하지 않습니다.
isaacg

12
@ ericmark26 방이나 사무실을 둘러보고 키보드로 찾을 수있는 모든 것을 부수고 해석하는지 확인하십시오. 그것이 무엇을하는지 알아 낸 후 다음 객체로 반복하십시오. 부족하면 다른 회전을 시도하십시오.
globby

2
@ ericmark26 Pyth에 익숙해지는 가장 좋은 방법은 간단한 Python 프로그램을 가져 와서 Pyth로 변환하는 것입니다.
isaacg

4

파이썬 3-43 바이트


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

가장 짧지는 않지만 재미있는 접근법 IMO. 유효 비트 수가 달라지면 EG Hi!0으로 채워지는 것은 사소한 것입니다 (에 대한 9와 반대로 2 바이트 .zfill(8)).

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

3

파이썬-52

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

이것을 Pyth로 번역 할 것입니다. 다른 누군가가 이미 Pyth 답변을했습니다.

전체 프로그램이나 I / O 형식에 신경 쓰지 않고 Python 3을 사용하는 경우 다음과 같이 23 바이트로 수행 할 수 있습니다.

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

x 입력입니다.

챌린지가 게시되기 전에 통역사가 풀리지 않았기 때문에 이것이 중요하지 않다는 것을 알고 있지만 여기 KSFTgolf에 있습니다.

oan

3

루비, 34 28 24 바이트

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

STDIN을 통해 입력을받습니다. AShelly 덕분에 6 바이트가 절약되었고 britishtea 덕분에 4 바이트가 절약되었습니다.


$<.each_byte{|c|$><<"%b "%c}
AShelly

String#bytes대신을 사용하여 더 많은 문자를 제거 할 수 있습니다 String#each_byte. 블록 형식은 더 이상 사용되지 않지만 여전히 작동합니다 :)
britishtea

@britishtea 아, 좋아. 감사합니다!
Martin Ender


2

MATLAB

이것은 익명 함수입니다

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

사용법은 f('Hello World') 입니다.

또는 작업 공간 x에서 문자열 Hello World!로 정의 된 경우 dec2bin(char(x))작동합니다.


어떻게 입력을 얻을 수 있는지 잘 모르겠 기 때문에 점수를 매기는 방법을 잘 모르겠습니다. 다른하실 말씀 있나요?
David

char? 난 당신 말은 생각dec2bin(x)-'0'
루이스 Mendo

나는 그렇게 영리하지 않기 때문에!
David

내 요점은 다음과 같습니다 char(x)x, 이미 문자열 아무것도하지 않는다. 따라서 공간을 절약하기 위해 제거 할 수 있습니다. 반면에 결과 dec2bin는 문자열이며 출력은 숫자 여야한다고 생각합니다.
Luis Mendo

이해합니다. 물론 그렇습니다. Matlab을 사용하면 때때로 데이터 유형을 잊어 버리기 쉽습니다.
David

2

J-9

1":#:3&u:

코드 길이를 두 배로 늘리지 않고 이것을 행으로 만드는 방법을 모른다면 J 전문가가 나에게 말해줘야합니다. :)

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

2
".처음에 추가 할 수 있습니다 . 결과를 한 줄로 표시하고 공백으로 구분하여 결과를 평가합니다. 더 짧은 것은 base2 숫자로 base10 숫자를 만드는 것 10#.#:3&u:입니다.
randomra

2

자바-148 바이트

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

전체 파일을 포함하도록 편집


2
OP는 스 니펫뿐만 아니라 전체 프로그램을 원한다고 생각합니다. 게다가, 그것은 더 많은 골프를 할 수 있습니다.
Rodolfo Dias

메인 프로그램에 넣으면 실행됩니다. 더 나은 골프에 관해서는 아마 아마 방법을 찾을 수 없습니다.
Bryan Devaney

1
전체 프로그램에는 메인 클래스도 포함됩니다.
Rodolfo Dias

UTF-16이 아닌 머신 로케일을 가정 할 때 입력이 ascii이기 때문에 사용 시간이 단축 for(char c:a[0].toCharArray()){되거나 심지어 더 짧을 수 있음for(byte b:a[0].getBytes()){
njzk2

1
public더 많은 바이트를 얻기 위해를 제거 하고 프로그램 이름을 단일 문자로 줄이십시오. 또한 (String[]a)컴파일러에서 완벽하게 허용되어 다른 바이트를 얻습니다.
Rodolfo Dias

2

자바 스크립트 ES6, 63 65 바이트

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

JavaScript의 긴 함수 이름 덕분에 다소 길다. 아래의 스택 스 니펫은 대략 ES5에 해당하므로 모든 브라우저에서 실행할 수 있습니다. 골프 개선을위한 edc65 덕분입니다.

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


1
[for of][...].map문자열에서 문자를 열거하는 것보다 약간 짧습니다 .alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65

로 교체 .join(' ')하여 2 바이트를 골프 오프 할 수 있습니다 .join` ` . prompt/ 대신에 함수를 사용하여 많은 바이트를 alert
골라 낼 수 있습니다.

2

스칼라 - (59) - 55 바이트

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

일반적으로, foreach를 사용하고 맵하지 않아야합니다.


2

8088 머신 코드, IBM PC DOS, 33 31 바이트 *

리스팅 :

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 

완전한 PC DOS 실행 가능 COM 파일, 입력은 명령 행을 통해 이루어집니다.

선행 0으로 :

enter image description here

ASCBIN.COM을 다운로드하여 테스트 하십시오 .

또는 앞에 0이없는 39 바이트 :

enter image description here

ASCBIN2.COM을 다운로드하고 테스트 하십시오 .

* 선행 0이 허용되는지 여부가 명확하지 않으므로 버전을 양방향으로 게시하고 있습니다.


2

MITS Altair 8800 , 0 바이트

입력 문자열이 메모리 주소에 있습니다 #0000H( allowed ). 전면 패널 I / O 표시등을 통해 이진수로 출력됩니다 D7-D0.

예를 들어 RESET, 그런 다음 EXAMINE첫 번째 바이트 EXAMINE NEXT를 확인한 다음 나머지를 보려면 반복 하십시오.

"H" = 01 001 000:

enter image description here

"e" = 01 100 101:

enter image description here

"l" = 01 101 100:

enter image description here

온라인으로 사용해보십시오!

물론 비경쟁. :)


1

Haskell, 65

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

heavy use of the list monad. it couldn't be converted to list comprehentions because the last statements weren't a return.


1

C++ - 119 bytes

Freeing memory? What's that?

#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 compiles the code with warning)


1
C version, shorter main(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 and TheC64Mini, 101 tokenized BASIC bytes

Here is the obfuscated listing using Commodore BASIC keyword abbreviations:

 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

Here for explanation purposes is the non-obfuscated symbolic listing:

 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

The function fn b declared on line zero accepts a numeric parameter of x which is ANDed with the value of b; SGN is then used to convert x and b to 1 or 0.

Line one accept a string input to the variable a$, and the loop starts (denoted with i) to the length of that input. b represents each bit from the 6th to 0th bit. c$ takes each character of the string at position i.

line 5 starts the loop to test each bit position; right$ is used in line 6 to remove a auto-formatting issue when Commodore BASIC displays a number, converting the output of fn b to a string; asc(c$) converts the current character to its ascii code as a decimal value.

Line 7 represents the next bit value. The loop j is ended before printing a space, then the last loop i is ended.

C64 converting PETSCII to Binary


1

JavaScript ES6, 71 bytes

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

PPCG에 오신 것을 환영합니다! .split('')빈 문자열에서 분리 해야 합니다. .split()회전 "abc"["abc"].
데니스

1

4 번째 (2 번째) , 45 바이트

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

온라인으로 사용해보십시오!

코드 설명

: 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




0

스타 타 158

나는 대부분의 것과 다른 접근법을 사용했습니다. display _request () 프롬프트를 통해 읽습니다 (di _r (r)로 단축). 문자열을 텍스트 모드에서 b라는 파일에 씁니다. 이진 모드에서 b를 열고 각 문자를 바이트로 읽고 이진으로 변환합니다. 기술적으로 b 파일은 마지막에 닫아야하지만 유효한 프로그램이며 파일없이 성공적으로 실행됩니다.

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

골랑-68

나는 Go를 처음 사용하고 있으며이 언어로 문자를 세는 규칙도 확실하지 않습니다.

가져 오기 (11 바이트) :

import"fmt"

기능 (55 바이트) :

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

여기서 실행할 수 있습니다 .


0

Never will C# win these kinds of questions but here's a try, completely without encoding. :)

C# - 84

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

람다 함수를 사용하면 훨씬 짧아 질 수 있습니다. x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));그러나이 .Select()짧은 답변과 원래 답변을 모두 using System.Linq;사용하기 때문에 Visual C # Interactive Compiler를 사용하도록 지정하지 않는 한 18 바이트를 포함해야합니다. 기본적으로 System.Linq를 가져옵니다
Skidsdev

다음은 대화식 컴파일러를 사용한 람다 함수 솔루션입니다 (총 55 바이트)
Skidsdev

0

Cobra - 64

람다로서 :

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.