ここでは、初心者が挑戦できるほど簡単な質問はないと思います!
課題:次のような1と0のランダムな入力文字列が与えられた場合:
10101110101010010100010001010110101001010
ビット単位の逆関数を出力する最短コードを次のように記述します。
01010001010101101011101110101001010110101
ここでは、初心者が挑戦できるほど簡単な質問はないと思います!
課題:次のような1と0のランダムな入力文字列が与えられた場合:
10101110101010010100010001010110101001010
ビット単位の逆関数を出力する最短コードを次のように記述します。
01010001010101101011101110101001010110101
回答:
入力文字列がvariableにあると仮定しますb
。
b='0'
これは、ほとんどの言語で行うことを行いません...
J比較演算子はただです
=
(=:
そして=.
、それぞれグローバル割り当てとローカル割り当てです)。ただし、=
通常の==
演算子とは異なり、アイテムごとに比較します。配列は次のように形成されることに注意してください0 2 3 2 3 1 2 3 4
。2 = 0 2 3 2 3 1 2 3 4
与え0 1 0 1 0 0 1 0 0
例えば。:これは、文字列についても同様である'a'='abcadcadda'
だけでは戻りません0
、それは返す、1 0 0 1 0 0 1 0 0 1
(これが意味するように推定することができる0
と*/
基本的に意味し、all
我々はとゼロの文字列をしたいので、しかし、この動作は優秀である。この場合、または。)真と偽。Jのbool は1
andであるため0
、これはの and の配列に1
なります0
(これらは文字列ではなく、他のすべての文字1
も0
この配列になります。)これは印刷を必要としません。Jは式の結果を自動的に印刷します。これが適切な説明であったことを願っていますが、そうでない場合は、コメントでまだ明確ではない何かを尋ねてください。この答えも'0'&=
(または=&'0'
)だったかもしれませんが、私はそれb='0'
がより明確だと感じました。
=&'0'
同じバイト数で機能します。
{1^}%
GolfScriptは、STDINから入力全体を読み取り、文字列としてスタックに配置します。
{}%
文字列内のすべての文字を調べ、すべての文字に対してコードブロックを実行します。
1^
ASCIIコードの1との排他的論理和を計算します。「0」はASCIIコード48に、「1」はASCIIコード49に対応します。
以来48 ^ 1 = 49
と49 ^ 1 = 48
、これが0のに1と1に0年代をオンにします。
完了すると、GolfScriptは変更された文字列を出力します。
q1f^
このxorはすべての文字が1です。
他のCJamの回答とは異なり、入力が既にスタックにあるとは想定していません。
f
。
さて、それは再び短くなりました!無関係な課題の解決策を書いた後、ここでも同じトリックを適用できることに気付きました。だからここに行きます:
00000000 b4 08 cd 21 35 01 0a 86 c2 eb f7 |...!5......|
0000000b
コメント付きアセンブリ:
org 100h
section .text
start:
mov ah,8 ; start with "read character with no echo"
lop:
; this loop runs twice per character read; first with ah=8,
; so "read character with no echo", then with ah=2, so
; "write character"; the switch is performed by the xor below
int 21h ; perform syscall
; ah is the syscall number; xor with 0x0a changes 8 to 2 and
; viceversa (so, switch read <=> write)
; al is the read character (when we did read); xor the low
; bit to change 0 to 1 and reverse
xor ax,0x0a01
mov dl,al ; put the read (and inverted character) in dl,
; where syscall 2 looks for the character to print
jmp lop ; loop
これよりもずっと短くなるとは思いません。実際に、そうでした!@ninjaljにもう1バイト削ってくれてありがとう。
00000000 b4 08 cd 21 34 01 92 b4 02 cd 21 eb f3 |...!4.....!..|
0000000d
このバージョンは、高度なインタラクティブ機能を備えています-コマンドラインから実行した後、入力された数字(エコーされない)を書き込む限り、「反転した」文字を吐き出します。終了するには、Ctrl-Cを実行します。
前のソリューションとは異なり、これはDosBoxでの実行に問題があります。DosBox はCtrl-Cを正しくサポートしていないため、終了する場合はDosBoxウィンドウを閉じる必要があります。代わりに、DOS 6.0を搭載したVMでは、意図したとおりに実行されます。
NASMソース:
org 100h
section .text
start:
mov ah,8
int 21h
xor al,1
xchg dx,ax
mov ah,2
int 21h
jmp start
これは、コマンドラインからの入力を受け入れました。DosBoxで.COMファイルとしてスムーズに実行されます。
00000000 bb 01 00 b4 02 8a 97 81 00 80 f2 01 cd 21 43 3a |.............!C:|
00000010 1e 80 00 7c f0 c3 |...|..|
NASM入力:
org 100h
section .text
start:
mov bx, 1
mov ah, 2
loop:
mov dl, byte[bx+81h]
xor dl, 1
int 21h
inc bx
cmp bl, byte[80h]
jl loop
exit:
ret
xchg dx,ax
より1バイト短いmov dl,al
tr 01 10
STDINから入力を受け取ります。
または
y/01/10/
y 01 10
tr
...
:~:!
元の文字列が既にスタック上にあると仮定します。変更された文字列を出力します。
次のコードを貼り付けて、オンラインで試してください。
"10101110101010010100010001010110101001010":~:!
:~
文字列の各文字を評価します。つまり、文字 0を整数 0 に置き換えます。
:!
各整数の論理否定を計算します。これにより、0が1に変わり、1が0になります。
>,[>,]<[<]>[<+++++++[>-------<-]<+>>[++<]<[>]++++++++[>++++++<-]>.[-]>]
説明:
>,[>,] Read characters until there are none left.
<[<] Return to start
>[< Loop as long as there are characters to invert
+++++++[>-------<-] Subtract 49 (ASCII value of 1)
>[++<] If not 0, add 2
+++[<++++>-]<[>>++++<<-]>> Add 48
. Print
[-] Set current cell to 0
>] Loop
a
れるバグを修正する必要がありました11
。
Put this tasty pancake on top!
[]
Put this delicious pancake on top!
[#]
Put this pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "#".
Eat all of the pancakes!
Put this supercalifragilisticexpialidociouseventhoughtheso pancake on top!
Flip the pancakes on top!
Take from the top pancakes!
Flip the pancakes on top!
Take from the top pancakes!
Put this supercalifragilisticexpialidociouseventhoughthes pancake on top!
Put the top pancakes together!
Show me a pancake!
If the pancake is tasty, go over to "".
入力がヌル文字で終了することを想定しています。戦略は次のとおりです。
1
。0
(1
持っ0
て0
いれば、または持っていれば1
)0
、それまでにi(char*s){while(*s)*s++^=1;}
while
とfor
28文字の長さの、まだ結果。
ああ、この最初のものはどれだけ吸いますか。かなりい、これは。63文字。
print''.join([bin(~0)[3:] if x == '0' else bin(~1)[4:] for x in ''])
これは少し優れていますが、それでもそれほど派手ではありません。44文字。
print''.join([str(int(not(int(x)))) for x in ''])
以来int(x) and 1
戻ってint(x)
、それは0ではありませんし、そうでない場合はfalseの場合。解決策はさらに36文字に減らすことができます。
print''.join([str(1-int(x)) for x in ''])
以来join()
発生をとるブラケットを除去することができます。32文字。
print''.join(str(1-int(x))for x in'')
代わりにバックティックを使用できます str()
print''.join(`1-int(x)`for x in'')
@TheRareのポインターのおかげで34から44に減少
python bin(-int)
では-0bxxxを返すので、上記のように補数を見つけるのは困難です。
(int(x) and 1) == int(x)
'' == False
に'hi' == True
''.join(`1-int(x)`for x in'')
repr(x)
xに対して<MAXINTはに等しく、str(x)
'y/10/01/'
9番目の文字は「p」フラグです
使用法:
$ echo '10101001' | perl -pe 'y/10/01/'
alert(prompt().replace(/./g,x=>x^1))
s
、s.replace(/./g,x=>x^1)
22文字です。
p=prompt(p().replace(/./g,x=>x^1))
(p=prompt)(p().replace(/./g,x=>x^1))
、それは同じ長さです。
(Labyrinthはこのチャレンジよりも新しいため、この答えは競合しません-とにかく勝っているというわけではありません...)
1,
.$@
このコードは、STDINに数字のみが含まれていることを前提としています(特に、末尾の改行はありません)。
命令ポインター(IP)は、左上隅から右に向かって始まります。読み取る数字がある間、それは左側の2x2ブロックを通るタイトループで循環します1
。1をプッシュし,
、数字を読み取り、1と$
XORして最後のビットを切り替え.
、結果を出力します。XORの後、スタックのトップが正であるため、IPはこのループを取り、右折します。EOFをヒットすると、代わりに,
戻ります-1
。次に、XORが生成さ-2
れ、この負の値でIPは左折し@
、プログラムは終了します。
このソリューションは、ラビリンスに最適です。I / Oループが必要,
で、プログラムを終了する必要があります。最後のビットを切り替えるには、少なくとも2つの文字(ここと)が必要です。また、終了できるループには少なくとも1つの改行が必要です。.
@
1
$
STDERRを無視する場合、つまりエラーで終了することを許可しない限り、保存することができ、@
2つのパスを切り替える方法も必要ありません。誤って負の値(-2
)を印刷しようとするまで、読み取りと印刷を続けます。これにより、少なくとも2つの5バイトソリューションが可能になります。
1,
.$
,_1$.
このオンラインTMシミュレータに必要なルールテーブル構文を使用します。数か月前にGoogology Wikiユーザーブログに投稿した記事から借りました。
0 0 1 r *
0 1 0 r *
0 _ _ * halt
print''.join(`1-int(x)`for x in raw_input())
なぜ複雑にしたり、チートな変数を使用したりするのですか?
print''.join('1-int(x)'for x in'input()')
です:。コメントコードでバッククォートを取得できなかったため、 'で置き換えました。
`a\`b`
-> a`b
。
完全なプログラム。標準入力を要求します。
∊⍕¨~⍎¨⍞
⍞
プロンプト標準入力
⍎¨
各キャラクターを実行する
~
論理否定
⍕¨
各文字をテキストとしてフォーマットする
∊
ϵ nlist(平坦化)
<kbd>
タグの巧妙な乱用。
これは、Ans
入力としてバイナリ文字列(を介して)を受け取り、指定されたように、反転(逆ではない)文字列として出力を返す関数です。さらにヘルプが必要な場合はnot(
、TI-BASIC wikiのリストアプリケーションをご覧ください。私はそれが小さいので、コンパイルされたバージョンを使用しています:
»*r>Õ¸r
16進数で:
BB 2A 72 3E D5 B8 72
説明
»*r
-関数入力を文字列として受け取り、リストに変換します
>
-与えられたリストを次のオペレーターにパイプする
Õ¸r
-リストの逆を返します
»*r>Õ¸r
何ですか?
expr(Ans:Returnnot(Ans
ます。2.文字列はカンマで区切られておらず、a {
で始まっていないため、リストではなく1000010011のような整数に評価されます。3. Return
書いたとおりに機能しない。4.これにより、文字列ではなくリストとして出力されます。
0>~1+:#v_$>:#,_@
^ -1<
空のスタックとEOFの両方が-1を読み取ると仮定します。
0
nullターミネータとして\ 0をプッシュします
>~1+:#v_
入力ループで、asciiを読み取り、1を追加してEOF + 1 = 0をチェックし、
^ -1<
そうでない場合は1を減算し、プッシュされたASCII値をスタックに残します。
$>:#,_@
スタックの先頭にゼロの余分なコピーをドロップし、バイナリ文字列を上から下に出力します
空のスタックが0の場合、2バイトを保存します
>~:1+#v_$>:#,_@
^ -1<
EOF = 0の場合、この同じアルゴリズムを使用して15バイト前後のバージョンを使用できますが、テストに便利な実装はありません。
Methinks Pythonはこれに最適な言語ではありません。:)
for i in input():print(1-int(i),end='')
出力の後に改行が必要な場合は、43文字の代替手段があります。
print(''.join("01"[i<"1"]for i in input()))
end=''
ただの,
意志なしで動作します:)-スペースがないことを気にしない限り
print
関数ではend
、各印刷の終わりで改行を抑制するためにパラメーターを調整する必要があります。また、OPの仕様によれば、スペースがないことを気にかけていると思います。:)コメントありがとうございます!
Jのブール値は整数0
およびとして表されます1
。これはもちろん配列(この場合は2文字の配列'01'
)の有効なインデックスです。
'01'{~'0'&=