これはコードゴルフの挑戦です。タイトルが言うように、ASCII文字列をバイナリに変換するプログラムを作成します。
例えば:
"Hello World!"
に変わるはず
1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001
です。
注:特にpythの実装に興味があります。
これはコードゴルフの挑戦です。タイトルが言うように、ASCII文字列をバイナリに変換するプログラムを作成します。
例えば:
"Hello World!"
に変わるはず
1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001
です。
注:特にpythの実装に興味があります。
回答:
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";
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"
入力は、引用符なしで変換する必要がある文字列です。
Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen())))))
、whee d = ''およびk = ''にコンパイルされます。いいえ、まったく有効ではありません。
$<.bytes{|c|$><<"%b "%c}
STDINを介して入力を受け取ります。AShellyのおかげで6バイト、britishteaのおかげでさらに4バイト節約されました。
$<.each_byte{|c|$><<"%b "%c}
String#bytes
代わりにを使用して、さらに文字を削ることができString#each_byte
ます。ブロック形式は非推奨ですが、それでも動作します:)
@mazzyのおかげで-13バイト
"$($args|% t*y|%{[Convert]::ToString(+$_,2)})"
これは匿名関数です
f=@(x) dec2bin(char(x))
使用法はf('Hello World')
です。
または、ワークスペースでx
文字列として定義されている場合Hello World!
、そのまま機能しますdec2bin(char(x))
。
char
?私はあなたが意味を考えるdec2bin(x)-'0'
char(x)
、x
が既に文字列である場合、何もしないことです。したがって、スペースを節約するために削除できます。一方、の結果dec2bin
は文字列であり、出力は数字でなければなりません
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)+" ");}}}
ファイル全体を含むように編集されました
for(char c:a[0].toCharArray()){
、あるいはfor(byte b:a[0].getBytes()){
入力がASCIIであることから、非UTF-16マシンのロケールと仮定
public
、プログラム名を1文字に短縮して、より多くのバイトを獲得できます。さらに、(String[]a)
コンパイラーによって完全に受け入れられ、もう1バイト獲得できます。
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(' '))
[for of]
[...].map
文字列の文字を列挙するよりもわずかに短い:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
.join(' ')
て.join` `
。prompt
/の代わりに関数を使用することにより、多くのバイトをオフにゴルフすることができますalert
リスト:
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をダウンロードしてテストします。
*先行ゼロが許可されているかどうかは明確にはわからなかったため、両方の方法でバージョンを投稿しています。
入力文字列はメモリアドレスにあります#0000H
(使用可能)。フロントパネルI / Oライトを介したバイナリ出力D7-D0
。
たとえば、doを実行して最初のバイトを表示しRESET
、その後EXAMINE
に繰り返しEXAMINE NEXT
て残りのバイトを表示します。
"H" = 01 001 000:
"e" = 01 100 101:
"l" = 01 101 100:
もちろん、非競合です。:)
メモリを解放しますか?あれは何でしょう?
#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は警告付きでコードをコンパイルします)
main(int c,char**v){char x[9];for(;c=*(v[1]++);printf("%s ",itoa(c,x,2)));}
binary scan [join $argv] B* b;puts [regsub -all .{8} $b {& }]
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 b
て1
またはに変換し0
ます。
1行目は、変数への文字列入力を受け入れ、その入力の長さまでa$
ループが開始されます(で示されますi
)。b
6番目から0番目のビットまでの各ビットを表します。c$
位置の文字列の各文字を取りますi
。
行5は、各ビット位置をテストするループを開始します。right$
Commodore BASICが数字を表示し、出力をfn b
文字列に変換するときの自動フォーマットの問題を取り除くために、6行目で使用されます。asc(c$)
現在の文字を10進値としてのASCIIコードに変換します。
行7は、次のビット値を表します。j
スペースを印刷する前にループが終了し、最後のループi
が終了します。
alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')
.split('')
空の文字列で分割する必要があります。.split()
ターン"abc"
へ["abc"]
。
: 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
私はマーティン・エンダーに勝つことを望んでいましたが、彼を結ぶことができました。
STDINで入力を受け取ります。+1バイトの-p
フラグ。
gsub(/./){"%b "%$&.ord}
ċb¦ṡ
これにかなり満足
ċ 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
私はほとんどとは異なるアプローチを使用しました。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
}
このような質問にC#が勝つことは決してありませんが、ここでは完全にエンコードせずに試してみます。:)
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をインポートします