Hello、World!のパート2として (他のすべての文字が)、というようなプログラムを書く3つのすべてのこれらのプログラムの印刷「こんにちは、世界!」:プログラム全体、第一、第三、第五、などあなたのプログラムの文字及び第二、第四、第六、等
プログラムが次の場合:
abc
def
「Hello、World!」と出力されるはずですが、そうであるべきです
acdf
そして
b
e
「Hello、World!」が組み込まれたソリューションはありません。
Hello、World!のパート2として (他のすべての文字が)、というようなプログラムを書く3つのすべてのこれらのプログラムの印刷「こんにちは、世界!」:プログラム全体、第一、第三、第五、などあなたのプログラムの文字及び第二、第四、第六、等
プログラムが次の場合:
abc
def
「Hello、World!」と出力されるはずですが、そうであるべきです
acdf
そして
b
e
「Hello、World!」が組み込まれたソリューションはありません。
回答:
PROG.COM MS-DOSエミュレーター、たとえばDOSBoxでダウンロードして実行します。
B3 B4 B3 02 90 B3 B3 B4 02 B3 B4 B3 02 90 B3 B2
B3 48 90 B3 B3 B2 48 B3 B2 B3 48 90 B3 CD B3 21
90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 65 90 B3
B3 B2 65 B3 B2 B3 65 90 B3 CD B3 21 90 B3 B3 CD
21 B3 CD B3 21 90 B3 B2 B3 6C 90 B3 B3 B2 6C B3
B2 B3 6C 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3
21 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 6F 90 B3 B3 B2 6F B3 B2 B3 6F 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 2C
90 B3 B3 B2 2C B3 B2 B3 2C 90 B3 CD B3 21 90 B3
B3 CD 21 B3 CD B3 21 90 B3 B2 B3 20 90 B3 B3 B2
20 B3 B2 B3 20 90 B3 CD B3 21 90 B3 B3 CD 21 B3
CD B3 21 90 B3 B2 B3 77 90 B3 B3 B2 77 B3 B2 B3
77 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 6F 90 B3 B3 B2 6F B3 B2 B3 6F 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 72
90 B3 B3 B2 72 B3 B2 B3 72 90 B3 CD B3 21 90 B3
B3 CD 21 B3 CD B3 21 90 B3 B2 B3 6C 90 B3 B3 B2
6C B3 B2 B3 6C 90 B3 CD B3 21 90 B3 B3 CD 21 B3
CD B3 21 90 B3 B2 B3 64 90 B3 B3 B2 64 B3 B2 B3
64 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 21 90 B3 B3 B2 21 B3 B2 B3 21 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 CD B3 20
90 B3 B3 CD 20 B3 CD B3 20 90
1つのパラメーター0xCDで0xAB opcodeコマンドを実行する場合、次のように記述します。
コードを実行し、16進数を取得します。バイナリに変換
cat prog.hex | xxd -r -p > PROG.COM
print=="partisn't";
"ran" >="partisn't" ;
print((""" "HHeelllloo,, wwoorrlldd!! """[" ) #2">"1":: 3- 1] [ 1:-1 ]))
pit=print;"a">"ats'";pit(" Hello, world! "[ 2>1: -1 :1])
rn="ats'"
rn =print
rn("""Hello, world!""")#""":3 ][1- )
これはおそらくもっと短くなる可能性がありますが、Pythonで動作させることができてうれしいです。最初の部分のvroomfondelの答えに似ています。
""""""
print("Hello, world!")
""""""#
""""
pprriinntt((""HHeelllloo,, wwoorrlldd!!""))
#"""
"""pit"el,wrd"
"""
""
print("Hello, world!")#"
"""
rn(Hlo ol!)"""#""
print("Hello, world!")
""
! """!!ddllrrooWW oolllleeHH"!!"" >~o <> o <
または単なる文字:
"!dlroW olleH"!">o<
または奇妙な文字:
!""!dlroW olleH!" ~ >o<
オンラインで試してください:original、evens、odds。
元のバージョンは「!!ddllrrooWW oolllleeHH
」をスタックにプッシュし、次に魚がをバウンスします>~o <
。これにより、文字の削除、2つの印刷、2つの削除、2つの印刷、2つの削除などが行われます。トリッキーな部分は、3つすべてのプログラムで文字列モードを組み合わせ"
たり!
、切り替えたりすることでした。
120 x""!!ddllrrooWW ,,oolllleeHH""cckk,,@@
奇妙なものだけ:
10x"!dlroW ,olleH"ck,@
偶数のもののみ:
2 "!dlroW ,olleH"ck,@
完全なプログラム:
120 Push 1, push 2, push 0.
x Pop 0 (y) and 2 (x) and set the instruction pointer's movement
delta to (x,y). That is, run the remainder of the code
by skipping every other cell.
"!dlroW ,olleH" Push the code points of the output.
ck, Print 13 characters from the top of the stack.
@ Terminate the program.
奇妙なプログラムでは、2
はなくなっているため、10x
実際には何もしません((1,0)
とにかくデフォルトのデルタを設定します)。プログラムの残りの部分は同じです。
偶数プログラムでは2
、最初にプッシュするだけで、完全に無視できます。プログラムの残りの部分は以前と同じです。
PPrriinntt[[""HHeelllloo,, WWoorrlldd!!""]]Print@"Hello, World!"
いくつかの警告をスローし、出力しHello, World!
、リターンしますNull PPrriinntt[["" HHeelllloo, Null, "" WWoorrlldd!!]]
。(REPLではなく)プログラムとして実行すると、戻り値は出力されません。
偶数文字を削除した後:
Print["Hello, World!"]Pit"el,Wrd"
印刷しHello, World!
、返します"el,Wrd" Null Pit
。
奇数の文字を削除した後:
Print["Hello, World!"]rn@Hlo ol!
印刷Hello, World!
して戻りますNull ol! rn[Hlo]
。
ЕвгенийНовиковからの着想のソリューション、私はそれだけですべての3つのバリエーションのためのそれ以外の場合は『互いに素』コードに周りのジャンプ、すなわち少ないトリック、となんとかべきであると思いました。私はまだlodsb; lodsb
中心点として使用するスマートなバリアントを試しています(したがって、すべてのバリアントに必要な文字列定数は1つだけです)
EB 14 00 00 8A 8A 17 16 01 01 B4 B4 09 09 CD CD
21 21 CD CD 20 20 8A 1f 01 B4 09 CD 21 CD 20 48
65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 00 48 48 65
65 6c 6c 6c 6c 6f 6f 2c 2c 20 20 57 57 6f 6f 72
72 6c 6c 64 64 21 21 00 00
私が子供の頃から正しく思い出せば、COMの小さなモデルはから始まりDS=CS=SS
、コードはCS:0100h
ます。コードがゼロのメモリブロックにロードされることが保証されているとは思いません(保証されている場合、2バイトをドロップできます)。
長いコードの分解は
JMP *+14h
; 20 irrelevant bytes
MOV DX,message
MOV AH,09h
INT 21h; print string pointed to by DS:DX
INT 20h; exit program
message:
DB "Hello, World!\0"
DB "HHeelllloo,, WWoorrlldd!!\0\0"
奇数コードの分解
JMP *+00h
MOV DX,message
MOV AH,09h
INT 21h; print string pointed to by DS:DX
INT 20h; exit program
; some irrelevant bytes
message:
DB "Hello, World!\0"
偶数コードの分解:
ADC AL,00h
MOV DX,message
MOV AH,09h
INT 21h; print string pointed to by DS:DX
INT 20h; exit program
; some irrelevant bytes
message:
DB "Hello, World!\0"
8A
0116にはする必要がありますBA
代わりに、文字列がで終了し$
、ないNULL。
G |`
HHeelllloo,, WWoorrlldd!!
$_&
(.)\1t?
$1
奇数の位置:
G|
Hello, World!
_
()1?$
偶数ポジション:
`
Hello, World!$&
.\t
1
完全なプログラム:
G |`
これは何もしません。これ|
は既存の構成オプションではありません。これG
によりgrepステージになりますが、grepを実行するものは実際には何もなく、正規表現は空なので、これは何もしません。このステージの目的は、メインの「Hello、World!」の前に2つの改行を入れることです。それらのいずれかが常に削減を生き残るようにライン。これをgrep stagにする理由は、行のパリティをオフセットする必要があり、grepステージでは1行しか必要ないためです。
HHeelllloo,, WWoorrlldd!!
これにより、(空の)作業文字列が必要な出力に変換され、各文字が2倍になります。
$_&
これは何もしません。正規表現は、文字列の末尾のa _
とa を一致させようとし&
ますが、これはもちろん不可能です。ただし、ラインの消失に対処するために、縮小版ではこれらのキャラクターが必要になります。
(.)\1t?
$1
最後に、で置き換えること(.)\1
で重複文字を削除し$1
ます。t?
使用されることはありませんが、再び減少のバージョンで必要になります。
奇妙なプログラム:
G|
Hello, World!
G
空の入力と一致することはできませんが、我々が持っている理由です|
代替空の試合を許可します。これにより、空の作業文字列が目的の出力に変わります。
_
()1?$
これはアンダースコアを()1?$
に置き換えますが、文字列にはアンダースコアがないため、何もしません。
偶数プログラム:
`
Hello, World!$&
は`
単に空の構成文字列を示しているため、再び空の正規表現を使用して作業文字列を出力に置き換えます。今回も挿入します$&
が、それ自体が一致であり、もちろん空なので、何もしません。
.\t
1
これにより、タブに続く任意の文字がに置き換えられますが、タブ1
はないため、これも操作なしです。
----[[[[
print("Hello, World!")
--[[
---- ] ]
---- ] ]
pprriinntt((""HHeelllloo,, WWoorrlldd!!""))
----]]
代替1:
--[[
rn(Hlo ol!)-[
--]]--
print("Hello, World!")--]
代替#2:
--[[pit"el,Wrd"
-[--
--]]print("Hello, World!")
--]
オルタネータースクリプト:オンラインでお試しください!
{---- }
mmaaiinn==ppuuttSSttrr""HHeelllloo,, WWoorrlldd!!""----}main=putStr"Hello, World!"
オンラインでお試しください!コメントの乱用は、構文の強調表示で処理するには多すぎるようです。{- ... -}
インラインまたは複数行のコメントですが、--
開始するの行のコメントです。
奇数文字:
{--}
main=putStr"Hello, World!"--mi=uSrHlo ol!
偶数文字:
--
main=putStr"Hello, World!"--}anptt"el,Wrd"
<<<Hello\ world!||eecchhoo HHeelllloo\\ wwoorrlldd!!
メインプログラムは最初のステートメントを正常に実行するため、ブール値の後のステートメント||
は無視されます。
奇数/偶数の場合、は標準入力で終了または提供の<<<Hello\ world!
いずれかになります。いずれにしても、はになり、最初のコマンドによって出力されたものはすべてにパイプされ、無視されます。<<heredoc
<file
||
|
echo
;;\\
pr[Hello, World!]er "|
pprr[[HHeelllloo,, WWoorrlldd!!]]
;;\\
|
(プログラムの末尾には改行があります)
削除された2つのバージョン:
;\p[el,Wrd]r"
pr[Hello, World!]
;\|
そして
;\
rHlo ol!e |
pr[Hello, World!];\
(プログラムの末尾には改行があります)
何の説明についてはpr
とer
行う、参照この記事を。この場合、er
ワードはプロシージャ名を決定するフィードです。
これ\
は、ロゴのエスケープ文字です。コメントの終了後に改行をエスケープするため、2 rHlo ol!e |
番目に削除されたプログラムの2行目()をコメントにします。
//**
alert`Hello, World`//**//aalleerrtt``HHeelllloo,, WWoorrlldd``
奇妙なキャラクター:
/*aetHlo ol`/*/alert`Hello, World`
偶数文字:
/*
lr`el,Wrd/*/alert`Hello, World`
私の答えのもう一つの修正版。
l
inが欠落していHHeelllloo
ます。
60バイトコードの+ 1 -p
。
$ _ =$ _ =q";HHeelllloo,, WWoorrlldd!!";;;q##;s/;|.\K.//g##
$_="Hello, World!";q#s;.K/g#
$_= q;Hello, World!;;#;/|\./#
L @""H!edlllroo,W W,oorlllde!H"" ~@"!dlroW ,olleH"
Runicは、フロー制御文字をランダムに削除すると、実行のトレースが非常に苦痛になりますが、他のすべての文字と同様に予測可能な放射であるため、通常、放射線の処理にはあまり適していませんか?簡単です。2つのプログラムを互いに逆向きにインターリーブしてエンコードし、その後、3番目のコピーを追加して基本実行を行い、どちらを1つの文字で実行するかを制御します。プログラム2では、3番目のコピーは決して見られないごみであり、プログラム3では引用符を保持するため、印刷せずにポップできます。
プログラム1はこの部分のみを実行します。
L @"!dlroW ,olleH"
プログラム2はこの部分のみを実行します。
" H e l l o , W o r l d ! " @
このような:
"Hello, World!" @!lo olH
プログラム3はこの部分のみを実行します。
L @ " ! d l r o W , o l l e H " ~ " d r W , l e "
このような:
L@"!dlroW ,olleH"~"drW,le"
この"drW,le"
部分は実行されますが、~
すぐにスタックからポップされ、目的の出力が保持されます。
単純に、> <>回答を変換すると、プログラムが短くなり、45バイトになります:
! ```!!ddllrrooWW oolllleeHH`!!`` R~$ LR $ L
ただし、Runicには、> <>にはない制限が1つあります。最大スタックサイズは10 + IPのマナ(最初は10)です。また!!ddllrrooWW oolllleeHH
、24文字が含まれているため、R
コマンドを実行する直前に期限が切れるまでIPからマナが流出し、ベースプログラムの出力がなくなります。