文字列からバイナリ


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
きがついた。この質問をした理由についての逸話があります。私は友人にプログラミングを学ぶことを勧めました。彼は昨年の夏、各学生がプロジェクトを選択しなければならないjavaクラスを受講しました。彼はテキストをバイナリに翻訳したいと言ったので、それから私は(彼のがっかりして)python 3 in 1 line(非常に長い行)でした。彼のプロジェクトのアイデアを8バイトまで蒸留できることは信じられないことです。
ericmarkmartin

1
それはクールです、共有してくれてありがとう!私はこのような簡単な質問が好きです。なぜなら、より多くの人々が参加する機会を与え、回答の形で多くのコンテンツを生成するからです。
hmatt1

1
ASCIIである必要がありますか?つまり、テクノロジがASCII互換でない場合、結果にそれを反映できますか?
ショーンビバーズ

1
ASCII印刷可能な32-127を想定できますか?もしそうなら、バイナリ文字列は左ゼロパディングで7文字にすることができますか?
640KB

回答:



13

Python 3、41バイト

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

KSFTの答えていますが、に加えてraw_input -> input、Python 3にはのための感嘆符があるため、Python 3にも利点があると指摘したいと思いましたprint


8

Pyth、10バイト

jdmjkjCd2z

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"

入力は、引用符なしで変換する必要がある文字列です。

ここで試してみてください


10
asdfghjlklも有効なpythプログラムですか?それは何をするためのものか?
flawr

@flawrしようとすると害がありますか?;)
オプティマイザー

2
@flawr python 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

Python 3-43バイト


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

最短ではありませんが、興味深いアプローチIMOです。有効ビットの数EGが変化する場合、Hi!ゼロによるパディングが簡単であるという追加の利点があります(の場合は9バイトではなく、さらに2バイト.zfill(8)):

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

3

Python-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バイト節約されました。


6でトリム$<.each_byte{|c|$><<"%b "%c}
-AShelly

String#bytes代わりにを使用して、さらに文字を削ることができString#each_byteます。ブロック形式は非推奨ですが、それでも動作します:)
britishtea

@britishteaああ、いいね。ありがとうございました!
マーティンエンダー


2

Matlab

これは匿名関数です

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

使用法はf('Hello World')です。

または、ワークスペースでx文字列として定義されている場合Hello World!、そのまま機能しますdec2bin(char(x))


どのように入力を取得できるかわからないので、これをどのように採点するかについてはわかりません。コメントはありますか?
デビッド

なんでchar?私はあなたが意味を考えるdec2bin(x)-'0'
ルイスMendo

私はそれほど賢くないからです!
デビッド

私のポイントはchar(x)xが既に文字列である場合、何もしないことです。したがって、スペースを節約するために削除できます。一方、の結果dec2binは文字列であり、出力は数字でなければなりません
ルイスメンドー

もちろん理解していますし、あなたは正しいです。Matlabでは、データ型を簡単に忘れることがあります。
デビッド

2

J-9

1":#:3&u:

コードの長さを2倍にせずにこれを連続して作る方法はわかりません、私に教えてくれるJの達人が必要です:)

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

2
".最初に追加できます。結果が評価され、1行になり、スペースで区切られます。さらに短いのは、base2桁のbase10番号を作成することです10#.#:3&u:
randomra

2

Java-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はスニペットだけでなく、完全なプログラムを望んでいると思います。さらに、それはもっと多くのゴルフをすることができます。
ロドルフォディアス

これが完全なプログラムです。メインクラスに配置すると、実行されます。より良いゴルフについては、おそらくしかし、私はどのように見つけることができませんでした。
ブライアンデヴァニー

1
完全なプログラムにはメインクラスも含まれます。
ロドルフォディアス

短く使用することができfor(char c:a[0].toCharArray()){、あるいはfor(byte b:a[0].getBytes()){入力がASCIIであることから、非UTF-16マシンのロケールと仮定
njzk2

1
を取り除きpublic、プログラム名を1文字に短縮して、より多くのバイトを獲得できます。さらに、(String[]a)コンパイラーによって完全に受け入れられ、もう1バイト獲得できます。
ロドルフォ・ディアス

2

JavaScript ES6、63 65バイト

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

JavaScriptの長い関数名のおかげで、これはかなり長いです。以下のStack Snippetは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

あなたは置き換えることにより、2つのバイトオフのゴルフができ.join(' ').join` ` prompt/の代わりに関数を使用することにより、多くのバイトをオフにゴルフすることができますalert
RamenChef

2

Scala- 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ファイル。入力はコマンドライン経由です。

先行ゼロがある場合:

ここに画像の説明を入力してください

ASCBIN.COMをダウンロードしてテストします

または、先行ゼロなしの39バイト

ここに画像の説明を入力してください

ASCBIN2.COMをダウンロードしてテストします

*先行ゼロが許可されているかどうかは明確にはわからなかったため、両方の方法でバージョンを投稿しています。


2

MITS Altair 8800、0バイト

入力文字列はメモリアドレスにあります#0000H使用可能)。フロントパネルI / Oライトを介したバイナリ出力D7-D0

たとえば、doを実行して最初のバイトを表示しRESET、その後EXAMINEに繰り返しEXAMINE NEXTて残りのバイトを表示します。

"H" = 01 001 000:

ここに画像の説明を入力してください

"e" = 01 100 101:

ここに画像の説明を入力してください

"l" = 01 101 100:

ここに画像の説明を入力してください

オンラインでお試しください!

もちろん、非競合です。:)


1

ハスケル、65

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

リストモナドの頻繁な使用。最後のステートメントがでないため、リストの包括性に変換できませんでしたreturn


1

C ++-119バイト

メモリを解放しますか?あれは何でしょう?

#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は警告付きでコードをコンパイルします)


1
Cバージョン、短い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およびTheC64Mini、101トークン化されたBASICバイト

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

説明のために、難読化されていないシンボリックリストを示します。

 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

関数はfn bの数値パラメータ受け付けるラインゼロで宣言xされているANDの値とエドb。次に、SGNを使用しx and b1またはに変換し0ます。

1行目は、変数への文字列入力を受け入れ、その入力の長さまでa$ループが開始されます(で示されますi)。b6番目から0番目のビットまでの各ビットを表します。c$位置の文字列の各文字を取りますi

行5は、各ビット位置をテストするループを開始します。right$Commodore BASICが数字を表示し、出力をfn b文字列に変換するときの自動フォーマットの問題を取り除くために、6行目で使用されます。asc(c$)現在の文字を10進値としてのASCIIコードに変換します。

行7は、次のビット値を表します。jスペースを印刷する前にループが終了し、最後のループiが終了します。

PETSCIIをバイナリに変換するC64


1

JavaScript ES6、71バイト

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

PPCGへようこそ!.split('')空の文字列で分割する必要があります。.split()ターン"abc"["abc"]
デニス

1

Forth(gforth)、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

STATA 158

私はほとんどとは異なるアプローチを使用しました。display _request()プロンプトを介して読み込みます(di _r(r)に短縮)。テキストモードでbというファイルに文字列を書き込みます。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

このような質問にC#が勝つことは決してありませんが、ここでは完全にエンコードせずに試してみます。:)

C#-84

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

これは、ラムダ関数を使用することではるかに短くすることができます。x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));ただし、Visual C#Interactive Compilerを使用するように指定しない限り.Select()、この短い回答と元の回答の両方を使用するため、18バイトを含める必要があることに注意してくださいusing System.Linq;、デフォルトでSystem.Linqをインポートします
Skidsdev

次に、Interactive Compilerを使用したラムダ関数ソリューションを示します。合計55バイト
Skidsdev

0

コブラ-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.