이진 문자열을 ASCII로 변환


27

공백으로 구분 된 이진 문자 문자열을 가져 와서 ASCII 문자열로 변환하십시오.

예를 들어 ...

1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100

로 변환 것입니다 ...

Hello World

이진 문자열은이라는 변수에 저장됩니다 s.

이것은 코드 골프 문제이므로 가장 짧은 솔루션이 승리합니다.


15
이야기와 다른 사기꾼없이 도전하기위한 +1, 바로 요점
bebe

9
@bebe 가상의 환상적인 fripperies는 재미의 절반을 형성합니다.
qwr

안녕하세요. 기술이 너무 발전되어 ASCII를 지원하지 않는다고 가정 해 봅시다. 원시 문자 인코딩으로 변환 할 수 있습니까, 아니면 ASCII를 원시 문자 인코딩으로 변환해야합니까? 나는 ZX81여기서 생각하고 있다.
Shaun Bebbers

답변:


10

루비, 36 32

s.split.map{|x|x.to_i(2).chr}*""

또는 31

s.gsub(/\w+ ?/){$&.to_i(2).chr}

Chron 덕분에 최적화


1
몇 개의 문자를 저장하는 대신 .join""사용할 수 *""있습니다. split + map + join 대신 gsub로 수행 할 수도 있습니다 s.gsub(/\w+ ?/){$&.to_i(2).chr}(31 자).
Paul Prestidge

2
s.gsub(/\d+./){$&.to_i(2).chr}작동하지만 30 자입니다. 왜 작동하는지 모르겠습니다. 은 .지난 시간과 일치하지 말아야하지만 않습니다.
addison

10

자바 스크립트 (ES6) 49 55 56 64

s.replace(/\d+./g,x=>String.fromCharCode('0b'+x))

편집 @bebe 제안을 수락-감사
Edit2 이진 숫자 리터럴에 대해 몰랐습니다-덕분에 @kapep
Edit3 Wow 6 not 4 bytes saved thx @ETHproductions

의견에서 요청한 설명

String.replace 두 가지 인수를 취할 수 있습니다.

  • 정규 표현식 /\d+./g: 하나 이상의 숫자 다음에 하나의 다른 문자-g 플래그는 패턴을 두 번 이상 검색하도록 지정합니다.
  • 여기서 화살표 형식으로 지정된 함수 (여기서 인수 (x)는 찾은 문자열 (공백이 뒤에 오는 숫자 시퀀스)이며 함수 값은 대체되는 값입니다 (이 경우 단일 문자의 코드).

문자열의 끝에 정규 표현식이 후행 공백없이 일련의 숫자와 일치한다는 점에 주목할 가치가 있습니다.이 경우 점은 마지막 숫자와 일치합니다. '123'.match (/ (\ d +) ./)를 시도하여 확인하십시오.

(아직도) 가장 장황한 자바 스크립트 중 하나입니다 ...
(문자열 s에 대한 계산은 계산되지 않습니다)

var s='1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100'
var x=
s.replace(/\d+./g,x=>String.fromCharCode('0b'+x))

console.log(x)


2
s.replace(/\d+./g,x=>String.fromCharCode(parseInt(x,2)))56
bebe

2
s.replace(/\d+./g,x=>String.fromCharCode(eval("0b"+x)))55
kapex

무엇을하는지 설명해 주 /\d+./g,x=>시겠습니까?
izlin

1
@izlin 나는 대답에 약간의 설명을 추가했다
edc65

나는이 오래된 답을 알고,하지만 당신은 변경할 수 있습니다 eval('0b'+x)위해 '0b'+x-04 바이트를 저장합니다.
ETHproductions

8

Bash + Common Linux 유틸리티, 25 바이트

dc<<<2i$s[Pz0\<m]dsmx|rev

DC 설명

  • 2를 스택으로 밀고; 팝 및 입력 기수로 사용
  • 입력 문자열을 스택으로 푸시 (모든 값을 한 번에)
  • 재귀 매크로 m를 정의 하여 다음을 수행하십시오.
    • 팝 후 ASCII로 값을 인쇄
    • 스택 깊이를 스택으로 밀어 넣기
    • 쌓으려면 0을 누르십시오
    • 팝 2 스택 값; m비어 있지 않은 경우 매크로 비교 및 호출
  • 스택 상단 복제 (매크로 정의)
  • 팝업하여 m등록 할 매크로 저장
  • 팝업 및 매크로 실행

이진 문자열 전체를 먼저 스택으로 푸시하기 때문에 각 값을 팝하면 문자열이 반전됩니다. 따라서이 rev유틸리티를 사용하여 문제 를 해결하십시오.

사용법 예 :

$ s="1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100"
$ dc<<<2i$s[Pz0\<m]dsmx|rev
Hello World
$ 

7

PowerShell, 49

-join(-split$s|%{[char][convert]::toint32($_,2)})

편집 : 다른 PowerShell 답변을 보지 못했습니다. 그러나이를 해결하는 방법은 본질적으로 하나뿐입니다.


7

C- 57 43 38/31

38 바이트 버전 :

for(int*x=s;putchar(strtol(x,&x,2)););

또는 s가 포인터 인 경우에만 31 바이트 :

while(putchar(strtol(s,&s,2)));

나는 이것이 정확히 for 및 while 루프가 사용되어야한다고 생각하지는 않지만 작동합니다.


6

피 이스 , 12

smCv+"0b"dPZ

s는 Pyth에서 유효한 변수가 아니므로 대신 Z를 사용했습니다.

설명:

        print(
s             sum(
m                 map(lambda d:
C                     chr(
v                         eval(
+"0b"d                         "0b"+d)),
P                     split(
Z                           Z))))

예:

=Z"<the binary string from above>"smCv+"0b"dPZ
Hello World

포맷팅에서 공백을 사용하지 않는다는 사실 (여기에서 파이썬을
보았습니다

@Pharap 그래, Pyth를 보는 한 가지 방법은 파이썬이 공백, 괄호, 다중 문자 토큰 등과 같이 더 많은 문자를 제거하도록하는 모든 요소를 ​​가진 Python입니다.
isaacg

나는 Pyth를 모르지만 id2대신 사용할 4 문자를 저장하지 v+"0b"d않습니까? 어쨌든 이것은 읽을 수 없으며 멋지다.
DLosc

@DLosc 나는이 질문으로 인해이 질문을 한 후에 Pyth에 그 기능을 추가했습니다. 현재 Pyth에서는 더 짧을 수 있지만 현재 Pyth에서는이 도전에 허용되지 않습니다.
isaacg

내가 참조. 나는 그것이 그런 것 일지 궁금했다.
DLosc

6

DOS의 x86 기계 코드-22 바이트

00000000  30 d2 b4 08 cd 21 2c 30  72 06 d0 e2 08 c2 eb f2  |0....!,0r.......|
00000010  b4 02 cd 21 eb ea                                 |...!..|

머신 코드에는 실제 문자열 변수가 없으므로 (특히 " s" 라는 이름의 변수가 없음 ) stdin에 대해 입력으로 설정했습니다.

NASM 입력 :

    org 100h

section .text

start:
    xor dl,dl
loop:
    mov ah,8
    int 21h
    sub al,'0'
    jb print
    shl dl,1
    or dl,al
    jmp loop
print:
    mov ah,2
    int 21h
    jmp start

6

파워 쉘 ( 52 49)

-join(-split$s|%{[char][convert]::ToInt16($_,2)})

$ s의 이진 문자열을 통한 간단한 루프. [convert]를 포함 시키면 내 점수가 사라집니다.

편집 : 실제로 Powershell에는 이것을 없애는 한 가지 방법이 있습니다. Joey와 나는 둘 다 독립적으로 작동하는 것과 거의 같은 대답을 얻었습니다!

입력:

1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100

산출:

Hello World

1
단항 분할 연산자를 사용하여 세 개의 문자를 절약 할 수 있습니다 (이 시점에서 답은 동일합니다 ... 큰 놀라움 ;-)).
Joey

@Joey Ohh, 좋은 지적입니다! 내가 그것을 놓쳤다는 것을 믿을 수 없다. 당신은 그것을 잡기 위해 나에게서 +1을 얻습니다. 감사합니다!
fuandon

5

매스 매 티카, 52 바이트

아 Mathematica의 사랑스러운 기능 이름

f=FromCharacterCode[#~FromDigits~2&/@StringSplit@#]&

5

33 32

편집 : 업데이트 된 솔루션, 32.

say$s=~s/\d+ ?/chr oct"0b$&"/rge

이전 솔루션 (33) :

$_=$s;say map{chr oct"0b$_"}split

또는

say map{chr oct"0b$_"}split/ /,$s

테스트:

perl -E '$s="1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100";$_=$s;say map{chr oct"0b$_"}split'

5

J (23)

u:;(#.@:("."0))&.>cut s

테스트:

   s=:'1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100'
   u:;(#.@:("."0))&.>cut s
Hello World

설명:

                  cut s    NB. split S on spaces
   (          )&.>         NB. for each element
        ("."0)             NB. evaluate each character
      @:                   NB. and
    #.                     NB. convert bitstring to number
  ;                        NB. unbox each number
u:                         NB. convert to ASCII



4

APL (15)

⎕UCS{2⊥⍎¨⍕⍵}¨⍎s

테스트:

      s←'1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100'
      ⎕UCS{2⊥⍎¨⍕⍵}¨⍎s
Hello World

설명:

  • ⍎s: 평가 s하여 정수 배열로 바꿉니다. 배열은 공백으로 구분 된 숫자로 작성되므로 분할 s됩니다.
  • {... : 각 요소마다 :
    • ⍕⍵: 숫자를 다시 문자열로 바꿉니다.
    • ⍎¨: 각 개별 숫자를 평가하여 비트 열을 제공합니다.
    • 2⊥: base-2 디코드, 숫자 제공
  • ⎕UCS: 각 숫자의 문자를 가져옵니다

달리 지정하지 않으면 문자 대신 바이트 수를 계산해야합니다. codegolf.stackexchange.com/tags/code-golf/info :)
Averroes

1
@Averroes : 여유가있는 바이트의 APL 캐릭터 세트 맞아야 frankenstein.dns.org.uk/~marinus/aplcharset.png
스 marinus

아, 몰랐어 내 잘못이야. 죄송합니다!
Averroes

4

PHP (61)

<?=join(array_map('chr',array_map('bindec',explode(' ',$s))))

foreach(str_split($s,8)as$v)echo chr(bindec($v));
Jörg Hülsermann 2016 년

@ JörgHülsermann 인코딩은 선행 0을 건너 뛸 수 있으므로 str_split($s,8)작동하지 않습니다. foreach(explode(' ',$s)as$v)echo chr(bindec($v));유효하지만 실제로 실제로 골프되지 않은 첫 번째 PPGC 답변 중 하나를 편집 할 계획은 없습니다. 어쨌든 감사합니다!
Christoph

4

바커스 , 25 바이트

S,' 'j:A=(Ö,2,10b:c),A¨

설명:

S,' 'j 문자열 S를 빈 공간으로 분할하여 블록 (일부 배열)으로 변환합니다.

:A= 이전 블록을 가져 와서 변수에 할당하십시오.

(),A¨ A의 각 요소에 대해

Ö,2,10bÖ기본 2 의 현재 요소 (로 표시 )를 읽고 기본 10으로 변환하십시오.

:c 이전 값을 얻고 문자로 인쇄



3

C-63

C에는 표준 라이브러리에 기본 2 변환기가 없기 때문에 테스트하십시오
.

r;f(char*s){for(;*s;(*s|32)-32||(putchar(r),r=0))r=2*r|*s++&1;}

3

실행 길이 인코딩 된 Brainfuck, 49 바이트

Brainfuck에는 변수가 없으므로 표준 입력 및 출력을 대신 사용했습니다.

32+인터프리터는 코드 를 32 +초로 해석해야합니다 . 통역사가 RLE를 지원하지 않는 경우 수동으로 교체하십시오.

>,[32->+<[16-<[>++<-]>[<+>-]>-<]>[<<.[-]>>-]<,]<.

확장 (RLE 이외) 버전 : (91 바이트)

>,[-------------------------------->+<[----------------<[>++<-]>[<+>-]>-<]>[<<.[-]>>-]<,]<.

이 코드는 EOF가 0으로 인코딩 된 것으로 가정합니다.

설명

다음과 같은 레이아웃이 사용됩니다.

+---+---+------+
| x | a | flag |
+---+---+------+

x인쇄 될 ASCII 바이트는 어디에 있고 a표준 입력의 문자 이며 공백 인 flag경우 1 a입니다.

>,            Read a character a into the second cell
[             While not EOF: 
  32-           Decrease a by 32 (a -= ' ')
  >+<           Set the flag to 1 
  [             If a was not a space:
    16-           Decrease by 16 more ('0' == 32+16)
    <[>++<-]      a += 2*x
    >[<+>-]       Move it back (x = a)
    >-<           Reset the flag, it was not a space.
  ]>
  [             If a was a space (flag == 1):
    <<.[-]        Print and reset x
    >>-           Reset the flag
  ]
  <,            Read the next caracter a
]
<.            Print the last character x

1
+1 모든 것이 간결한 구현을해야하기 때문입니다.
Pharap

"Run Length Encoded Brainfuck"은 실제 별도 언어입니까? 통역사를 찾을 수 없습니다.
mbomb007

3

자바 8 : 60 바이트

Java 8에서 람다 사용 (75 바이트) :

Arrays.stream(s.split(" ")).reduce("",(a,b)->a+(char)Byte.parseByte(b,2));

그리고 정적 가져 오기 (여기서는 일부 사용)를 허용하면 (61 바이트)입니다.

stream(s.split(" ")).reduce("",(a,b)->a+(char)parseInt(b,2))

for 루프 (60 바이트)를 사용하는 초소형 버전 :

for(String n:s.split(" ")){out.print((char)parseInt(n,2));}

2
그들은 실제로 익명 클래스로 알려진 괴물을 대체 했습니까? 대단해
seequ

@Sieg 예 Java에는 현재 람다 / 클로저가 있지만 익명 클래스 위에는 합성 설탕입니다 ... (분명히)
Roy van Rijn

3

클로저 63 (또는 57)

모든 Clojure impl :

(apply str(map #(char(read-string(str"2r"%)))(re-seq #"\d+"s)))

Java interop으로 :

(apply str(map #(char(Long/parseLong % 2))(.split s" ")))

REPL 세션 :

golf> (def s "1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100")
#'golf/s
golf> (apply str(map #(char(read-string(str"2r"%)))(re-seq #"\d+"s)))
"Hello World"
golf> (apply str(map #(char(Long/parseLong % 2))(.split s" ")))
"Hello World"

3

Q 기본, 103

s$=s$+" ":FOR i=1 TO LEN(s$):c$=MID$(s$,i,1):IF c$=" "THEN n=0:r$=r$+CHR$(n)ELSE n=n*2+VAL(c$)
NEXT:?r$

뭐? 여기서는 이진 대 십진 함수가 없습니다. 너 스스로해라!

나는 이 메타 포스트END IF 당 줄 바꿈 (i가없는 if-then-else를 얻는 데 필요하다고 생각합니다 )을 1 바이트로 계산 합니다. Windows의 QB64가 코드 파일을 그런 식으로 허용할지 여부를 모르겠습니다. 아마 중요하지 않습니다.


2

NodeJS62

Buffer(s.split(' ').map(function(a){return parseInt(a,2)}))+''

PHP75

array_reduce(explode(' ', $b),function($a,$b){return $a.chr(bindec($b));});

es6 호환성으로 nodejs를 어떻게 실행합니까? 최신 하나는 여전히 나를 위해 람다 함수를 지원하지 않습니다
비비

@bebe Arrow 함수는 v8에서 구현되었지만 아직 노드와 통합되지 않았습니다. 게시물을 수정하겠습니다.
cPu1

@ cPu1 그들은 나를 위해 일합니다
username.ak

2

자바 스크립트 111

이것은 parseInt 또는 eval없이 숫자 변환을 수행합니다. 문자열을 뒤로 읽고 비트 수를 세면 비트 x는 1입니다. 공백이 발견되면 숫자가 문자로 변환되고 비트 설정을 위해 새로운 0 숫자가 시작됩니다.

x=n=0,w='',s=' '+s
for(i=s.length;i--;){m=s[i]
if(m==1)n|=1<<x
x++
if(m==' ')w=String.fromCharCode(n)+w,n=x=0
}

1
구식 방식으로 +1하여 QBasic 버전을 작성하도록 영감을 받았습니다.
DLosc

유효하지 않습니다. 함수 또는 전체 프로그램이어야합니다 (입력하는 프로그램)
ASCII 전용

2

그루비 64

{it.split(" ").collect{Integer.parseInt(it,2) as char}.join("")}

2

CJam, 11 바이트

NS/{:~2bc}/

s 는 CJam에서 유효한 변수 이름이 아니므로 대신 N 을 선택했습니다 .

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

예제 실행

$ cjam <(echo '
> "1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100"
> :N;
> NS/{:~2bc}/
> '); echo
Hello World

작동 원리

NS/            " Split N at spaces.                            ";
   {     }/    " For each chunk:                               ";
    :~         "   Evaluate each character ('0' ↦ 0, '1' ↦ 1). ";
      2b       "   Convert from base 2 array to integer.       ";
        c      "   Cast to character.                          ";

2

하스켈-48 (+13 수입품 (?))

하스켈에서의 첫 골프 시도입니다.

map(chr.foldl1((+).(*2)).map digitToInt)$words s

Data.Char를 가져와야합니다.

사용법 (ghci) :

Prelude> :m +Data.Char
Prelude Data.Char> let s = "1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100"
Prelude Data.Char> map(chr.foldl1((+).(*2)).map digitToInt)$words s
"Hello World"

설명:

map(chr.foldl1((+).(*2)).map digitToInt)$words s
                                        $words s -- split s on spaces into a list
                         map digitToInt          -- convert each digit in input string to int
              ((+).(*2))                         -- a function that multiplies its first 
-- argument by 2, then adds the second argument
        foldl1((+).(*2)).map digitToInt          -- fold the above over the list of ints: 
-- in other words this is a function that reads strings as binary and gives the value as int
   (chr.foldl1((+).(*2)).map digitToInt)         -- cast to character
map(chr.foldl1((+).(*2)).map digitToInt)$words s -- map our function over the list of words

잘만되면 나는 수입과 관련하여 정확하게 점수 규칙을 따랐습니다. 수정하지 않은 경우 수정하여 자유롭게 수정하십시오. ghci에서 가져 오는 데 필요한 ": m + Data.Char"를 13으로 처리했습니다.
ballesta25

1

GNU Sed, 19 바이트

훌륭한 @Digital Trauma 답변에서 영감을 얻었습니다 .

골프

s/\w*/dc -e2i&P;/eg

테스트

echo 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100|\
sed 's/\w*/dc -e2i&P;/eg'

Hello World


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.