作为《你好,世界》的第二部分 (每个其他字符),编写一个程序,使所有这三个程序都显示“ Hello,World!”:整个程序,程序的第1,第3,第5等字符,以及第2,第4,第6,等等
如果您的程序是:
abc
def
它应该输出“ Hello,World!”,但是应该输出
acdf
和
b
e
内置的“ Hello,World!”没有解决方案。
作为《你好,世界》的第二部分 (每个其他字符),编写一个程序,使所有这三个程序都显示“ Hello,World!”:整个程序,程序的第1,第3,第5等字符,以及第2,第4,第6,等等
如果您的程序是:
abc
def
它应该输出“ Hello,World!”,但是应该输出
acdf
和
b
e
内置的“ Hello,World!”没有解决方案。
Answers:
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
如果要使用一个参数0xCD执行0xAB操作码命令,则编写
运行代码,获取十六进制。转换成二进制
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!")
""
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]
。
受到ЕвгенийНовиков解决方案的启发,我认为它应该可以用更少的技巧来实现,例如,只需跳到所有这三个变体的否则“不相交”的代码即可。我仍在尝试使用lodsb; lodsb
用作中心点的智能变体(因此,所有变体仅需要一个字符串常量)
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
。我不认为可以保证将代码加载到清零的内存块中(如果可以保证,我可以丢弃两个字节)。
反汇编长码应该是
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!”前面有两个换行符。线,以便其中之一始终在还原中幸存下来。使其成为grep标记的原因是,我们需要抵消行的奇偶校验,并且grep阶段仅需要一行。
HHeelllloo,, WWoorrlldd!!
这样会将(空)工作字符串转换为所需的输出,每个字符加倍。
$_&
这什么也没做。正则表达式试图匹配字符串末尾的a _
和a &
,这当然是不可能的。不过,我们仍然需要精简版本中的那些字符,以再次处理消失的换行符。
(.)\1t?
$1
最后,我们将替换(.)\1
为来删除重复的字符$1
。在t?
从未使用过,但有必要再度在缩小版本。
奇怪的程序:
G|
Hello, World!
该G
所无法比拟的空的输入,但是这就是为什么我们有|
允许替代空匹配。这会将空的工作字符串转换为所需的输出。
_
()1?$
这会用代替下划线()1?$
,但是字符串中没有下划线,因此不会执行任何操作。
偶数程序:
`
Hello, World!$&
该`
只是表示一个空的配置字符串,所以我们再次使用正则表达式空,以取代与输出工作的字符串。这次我们也插入了,$&
但这就是匹配项本身,当然是空的,因此它什么也没做。
.\t
1
这会用替换制表符后跟的任何字符1
,但我们没有任何制表符,因此这也是禁忌操作。
//**
alert`Hello, World`//**//aalleerrtt``HHeelllloo,, WWoorrlldd``
奇数字符:
/*aetHlo ol`/*/alert`Hello, World`
偶数字符:
/*
lr`el,Wrd/*/alert`Hello, World`
我对另一个答案的修改版本。
l
in HHeelllloo
。
L @""H!edlllroo,W W,oorlllde!H"" ~@"!dlroW ,olleH"
符文通常不能很好地处理辐射,因为随机删除流控制字符会使跟踪执行过程非常痛苦,但是像其他所有字符一样,可预测的辐射又如何呢?容易,我们只需对两个相互反向并交错的程序进行编码,然后添加第三个副本以进行基本执行并控制使用单个字符执行的程序。在程序2中,第三个副本是从未见过的垃圾,而在程序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
但是,符文有一个限制,即> <>不具备:最大堆栈大小为10 + IP的法力值(最初为10)。并且!!ddllrrooWW oolllleeHH
包含24个字符,导致IP流失法力,直到它在执行R
命令之前到期为止,导致基本程序无输出。