バイナリ文字の文字列を同等のASCII文字に変換します


27

スペースで区切られたバイナリ文字の文字列を取得し、ASCII文字列に変換します。

例えば...

1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100

に変換します...

Hello World

バイナリ文字列はと呼ばれる変数に保存されますs

これはコードゴルフの挑戦なので、最短のソリューションが勝ちます。


15
ストーリーやその他のフリッパーなしで、ポイントにまっすぐに挑戦するための+1
bebe 14

9
@bebe架空の幻想的なフリッパーが半分の楽しみを形成します。
qwr 14

こんにちは。あなたの技術が非常に高度で、ASCIIをサポートしていないと想像してみましょう。ネイティブ文字エンコーディングに変換することは許可されますか、それともASCIIをネイティブ文字エンコーディングに変換する必要がありますか?ZX81ここで考えています。
ショーンビバーズ

回答:


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文字)のようにすることもできます。
ポール・プレスティッジ14

2
s.gsub(/\d+./){$&.to_i(2).chr}動作し、それは30文字ですが、なぜそれが動作するのか分かりません。.最後の時間と一致していないはずですが、それはありません。
アディソン14

10

JavaScript(ES6)49 55 56 64

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

編集 @bebe提案の受け入れ-感謝
Edit2バイナリ数値リテラルについて知らなかった-感謝@kapep
Edit3 Wow 6 4バイトは保存されません thx @ETHproductions

コメントで要求された説明

String.replace 2つの引数を取ることができます。

  • 正規表現/\d+./g:1つ以上の数字の後に1つの異なる文字が続く-gフラグは、パターンを複数回検索することを指定します
  • ここで矢印形式で指定された関数。引数(x)は見つかった文字列(最終的にスペースが続く数字のシーケンス)になり、関数の値は置換されます(この場合、コード)。

文字列の最後にある正規表現は、末尾のスペースなしで数字のシーケンスに一致することに注意してください。この場合、ドットは最後の数字に一致します。「123」.match(/(\ d +)./)を試して確認してください。

(それでも)これまでで最も冗長なJavaScriptの1つです...
(stringへの割り当てはカウントされません)

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 14

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

あなた/\d+./g,x=>は何をするのか説明してもらえますか?
izlin 14

1
私は答えにはいくつかの説明を追加@izlin
edc65

私はこれが古い答えであることを知っていますが、4バイトを節約eval('0b'+x)する'0b'+x-0ように変更できます。
-ETHproductions

8

Bash + common linux utils、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の答えを見ませんでした。しかし、これを解決する方法は本質的に1つしかありません。


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

実際には、それは大きな1である(ここではPythonのあなたを見ています)書式設定で空白を使用していません
Pharap

@Pharapええ、Pythを見る1つの方法は、空白、括弧、複数文字トークンなど、より多くの文字を削除する要素をすべて削除したPythonです。
isaacg 14

私はPythを知りませんがid2、代わりに使用する4文字を保存しませんv+"0b"dか?いずれにせよ、これは読みにくくてクールです。
DLosc 14年

@DLosc主にこの質問のために、この質問が行われた後にPythにその関数を追加しました。現在のPythでは短くなりますが、このチャレンジでは現在のPythは許可されません。
isaacg 14年

そうですか。私はそれがそのようなものであるかもしれないかどうか疑問に思いました。
DLosc 14年

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のバイナリ文字列の単純なループ。[変換]を含めると、スコアが失われます。

編集:Powershellでこれを実行する方法は本当に1つしかありません。ジョーイと私はどちらもほぼ同じ答えを独立して得ました!

入力:

1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100

出力:

Hello World

1
単項分割演算子を使用して、3文字を保存することができます(この時点で、答えは同じです...驚きです;-))。
ジョーイ14

@Joey Ohh、良い点!私がそれを見逃したとは信じられない。キャッチしてくれてありがとう
フアンドン14


5

Perl 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 14

1
@Averroes:APL文字セットは1バイトに余裕があります:frankenstein.dns.org.uk/~marinus/aplcharset.png
marinus 14

ああ、私はそれを知りませんでした。私の悪い。ごめんなさい!
アベロス14

4

PHP(61)

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

foreach(str_split($s,8)as$v)echo chr(bindec($v));
ヨルクヒュルサーマン

@JörgHülsermannは、エンコーディングが先行ゼロをスキップする可能性があるため、機能しstr_split($s,8)ません。foreach(explode(' ',$s)as$v)echo chr(bindec($v));有効ですが、とにかく明らかにゴルフではないことが明らかになったPPGCの最初の回答を編集する予定はありません。ともあれ、ありがとう!
クリストフ

4

バッカス、25バイト

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

説明:

S,' 'j 文字列Sを空のスペースで分割し、ブロック(ある種の配列)に変換します。

:A= 前のブロックを取得し、変数に代入します。

(),A¨ Aの各要素

Ö,2,10bÖベース2 の現在の要素(で表される)を読み取り、ベース10に変換します。

:c 前の値を取得してcharとして出力



3

C-63

Cには標準ライブラリにベース2コンバータがないため、ここでテストしてください
編集:あります、私はそれについて知るにはあまりにも愚かです

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

3

Run Length Encoded Brainfuck、49バイト

Brainfuckには変数がないため、代わりに標準の入力と出力を使用しました。

コード32++、インタープリターによって32 秒として解釈される必要があります。インタープリターがRLEをサポートしていない場合は、手動で置き換えてください。

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

拡張(非RLE)バージョン:(91バイト)

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

コードは、EOFが0としてエンコードされることを前提としています。

説明

次のレイアウトが使用されます。

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

どこxASCIIバイトが印刷され、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すべてにブレインファックの実装が必要なため。
ファラプ14

「Run Length Encoded Brainfuck」は実際の別個の言語ですか?通訳が見つかりません。
mbomb007

3

Java 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 14

@SiegはいJavaにもラムダ/クロージャーがありますが、ほとんどが匿名クラスの上にある合成シュガーです...(明らかに)
ロイファンレイン14

3

Clojure 63(または57)

All-Clojure impl:

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

Java相互運用機能を使用する場合:

(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

QBasic、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$

何?ここには、2進数から10進数への派手な関数はありません。自分でやる!

このメタ投稿END IFごとに、改行(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

@bebe Arrow関数はv8で実装されていますが、まだノードと統合されていません。投稿を編集します。
cPu1 14

@ CPU1彼らが私のために働く
username.ak

2

JavaScript 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 14年

無効、関数または完全なプログラム(入力を受け取るプログラム)である必要があります
ASCIIのみ


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

Haskell-48(+13インポート(?))

Haskellでの私の最初のゴルフの試みです。

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として扱いました。
ballesta2514

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.