编写一个打印“ Hello,World!”的程序。而且,如果仅使用程序的第一个,第三个,第五个等字符,则生成的程序仍应打印“ Hello,World!”。
如果您的程序是:
abc
def
它应该输出“ Hello,World!”,但是应该输出
acdf
没有少于2个字符的解决方案。
编写一个打印“ Hello,World!”的程序。而且,如果仅使用程序的第一个,第三个,第五个等字符,则生成的程序仍应打印“ Hello,World!”。
如果您的程序是:
abc
def
它应该输出“ Hello,World!”,但是应该输出
acdf
没有少于2个字符的解决方案。
Answers:
rant="partisn't"
print(("HHeelllloo,, WWoorrlldd!!"""[::2]))
滥用print
在Python 3 中是函数的事实:)
您可以在PPCG上找到最少的党派解决方案。
成为
rn=print
rn("Hello, World!"[:])
[:]
实际工作过:o不错!
%
"
H
e
l
l
o
,
W
o
r
l
d
!
删除所有其他字符会删除所有换行符,结果仍为Hello, World!
:
%"Hello, World!
这样做的原因是%
创建了四个指令指针,它们在四个基本方向中的每个方向上移动。离开源代码的IP只需删除即可。因此,在第一种情况下,仅保留了向南的IP,而在第二种情况下,仅保留了向东的IP,所有其他IP都被丢弃。无论哪种情况,执行的程序都是"Hello, World!
。的"
切换到的字符串模式,其中每个小区被简单地打印到STDOUT。我们不需要终止字符串,因为保留源代码仍会终止程序。
请注意,相同的想法在Beeswax中也可以使用*
代替%
和`
代替"
(这是因为Beeswax在很大程度上受Cardinal启发,但使用了六角形网格)。
HH
说明:
H
如您所料,将压Hello, World!
入堆栈。
主程序(HH
)将遇到第一个程序H
并压入Hello, World!
堆栈。H
但是,在第二个方法上,它将尝试使用两个参数(因为堆栈需要为空,才能推送Hello, World!
)并失败。但是,此错误将被忽略,然后Hello, World!
将被隐式打印。
第二个程序(H
)将推送Hello, World!
一次,并且将被隐式打印。
这类似于Fatalize的2字节答案,但这并不是真正的“欺骗”。
H
只会压入Hello, World!
一个空堆栈,如果堆栈不为空,则将需要2个参数,因此将出现错误,并且错误将被忽略。而且,No实际上并不隐式仅打印最顶层的元素。
--- [ [
print("Hello, World!")
--[[ ] ]
pCrAiLnCtU(L"AHTeOlRlFoE,L IWNoEr:lDd !:"D)
---]]
在线尝试!如语法突出显示所示,这是大量的注释滥用。
备用:
--[[pit"el,Wrd"
-[]]print("Hello, World!")--]
为了方便起见,将程序转换为其他所有字符形式的程序:在线尝试!
HHeelllloo WWoorrlldd!!
有点无聊:P
/**/alert`Hello, World`// * / a l e r t ` H e l l o , W o r l d `
第二个字母删除:
/*aetHlo ol`/*/alert`Hello, World`
就像Laikoni的Haskell回答一样,这利用了注释。
// * /
再增加一个字节//**/
(不幸的是,由于/**/alert`Hello, World`
字节数奇特,在您的情况下是不可能的,而不是像我这样。
Ḥ~wḤ
~w
将其right变量写入STDOUT
,并忽略其left参数。Ḥ
是的"Hello, World!"
,所以打印出来了Hello, World!
。
如果仅采用第一个和第三个字符,则得到Ḥw
。在这种情况下,w
写入其left变量,而忽略其right变量,因此它也会打印Hello, World!
。
ḤḤ
从技术上讲,这是一个有效的答案,但这统一了程序的输出变量,而不是打印到STDOUT
,所以我想4字节程序更符合挑战精神。
完整程序:
main= putStr"Hello, World!";;
putSt x ="p u t S t r \" H e l l o , W o r l d !\"";
mmaaiin = main
并删除所有其他字符:
mi=ptt"el,Wrd";ptt x=putStr "Hello, World!";main=mi
p u t S t r
和\"
。
PROG.COM 下载并在MS-DOS仿真器(例如DOSBox)中运行它。
90 B3 B4 B4 02 90 90 B3 B2 B2 48 90 90 B3 CD CD 21 90 90 B3 B2 B2 65 90
90 B3 CD CD 21 90 90 B3 B2 B2 6C 90 90 B3 CD CD 21 90 90 B3 CD CD 21 90
90 B3 B2 B2 6F 90 90 B3 CD CD 21 90 90 B3 B2 B2 2C 90 90 B3 CD CD 21 90
90 B3 B2 B2 20 90 90 B3 CD CD 21 90 90 B3 B2 B2 77 90 90 B3 CD CD 21 90
90 B3 B2 B2 6F 90 90 B3 CD CD 21 90 90 B3 B2 B2 72 90 90 B3 CD CD 21 90
90 B3 B2 B2 6C 90 90 B3 CD CD 21 90 90 B3 B2 B2 64 90 90 B3 CD CD 21 90
90 B3 B2 B2 21 90 90 B3 CD CD 21 90 90 B3 CD CD 20 90
删除后的MINI.COM 下载
90 B4 02 90 B2 48 90 CD 21 90 B2 65 90 CD 21 90 B2 6C 90 CD 21 90 CD 21
90 B2 6F 90 CD 21 90 B2 2C 90 CD 21 90 B2 20 90 CD 21 90 B2 77 90 CD 21
90 B2 6F 90 CD 21 90 B2 72 90 CD 21 90 B2 6C 90 CD 21 90 B2 64 90 CD 21
90 B2 21 90 CD 21 90 CD 20
为Ubuntu / Debian安装DOSBox
sudo apt install dosbox
运行
dosbox
在DOSBOX中
mount c /home/user/path/to/your/directory
c:
PROG.COM
MINI.COM
机器操作代码代表汇编语言说明。
在MS-DOS中打印字符,您将设置寄存器并产生中断。AH寄存器将为0x02,DL寄存器包含您的字符。中断向量为0x21。
mov ah,0x2 ;AH register to 0x2 (B4 02)
mov dl,0x48 ;DL register to "H" (B2 48)
int 0x21 ;0x21 interrupt (CD 21)
MS-DOS COM文件很小的模型很不错,因为它没有任何标题。它受64K限制,但在我们的情况下这无关紧要。
要停止程序,请使用0x20中断
int 0x20 ;0x20 interrupt (CD 20)
如果要使用一个参数0xCD执行0xAB操作码命令,则编写
AB CD
在PROG.COM
90 B3 AB AB CD 90
nop ; No operation (90)
mov bl,0xb4 ; BL register to AB (B3 AB)
AB CD command (AB CD)
nop ; No operation (90)
在MINI.COM
90 AB CD
nop ; No operation (90)
AB CD command (AB CD)
它是相等的机器代码,如果你不使用BL寄存器。
将十六进制文本文件转换为十六进制二进制文件
cat hex_file | xxd -r -p > exec.com
i;H;e;l;l;o;,; ;w;o;r;l;d;!;<esc>;Ó;
请注意,这<esc>
是一个字符,例如0x1b
删除所有其他字符将得到:
iHello, world!<esc>Ó
”™ ,ï‚‚ï ! ”# ¦2 ä ø¨øJð ý
说明
”™ ,ï‚‚ï ! ” # push the string "Weekly Hello , Changed World ! "
# # split on spaces
# RESULT: ['Weekly','Hello',',','Changed','World','!','']
¦ # remove the first element (Weekly)
2ä # split in 2 parts
# RESULT: [['Hello', ',', 'Changed'], ['World', '!', '']]
ø # zip
# RESULT: [['Hello', 'World'], [',', '!'], ['Changed', '']]
¨ # remove the last element
ø # zip
# RESULT: [['Hello', ','], ['World', '!']]
J # join each inner list
ðý # join on space
删除所有其他字符后,我们剩下的代码
”Ÿ™,‚ï!” 2äøøðý
说明
”Ÿ™,‚ï!” # push the string "Hello, World!"
2ä # split in 2 parts
# RESULT: ['Hello, ', 'World!']
ø # zip, as the string has an odd length the space is lost
# RESULT: ['HW', 'eo', 'lr', 'll', 'od', ',!']
ø # zip again
# RESULT: ['Hello,', 'World!']
ðý # join on space
P0r0i0n0t0@0"0H0e0l0l0o0,0 0W0o0r0l0d0!0"Print@"Hello, World!"
它返回"0H0e0l0l0o0,0 0W0o0r0l0d0!0" Null P0r0i0n0t0[0]
,并打印Hello, World!
为副作用。当作为程序运行(不在REPL中)时,将不打印返回值。
删除所有其他字符后:
Print@"Hello, World!"rn@Hlo ol!
它返回Null ol! rn[Hlo]
并打印Hello, World!
。
““3ḅaė;œ»ḷ“ 3 ḅ a ė ; œ »
删除所有第二个字符后,剩下的代码如下。
“3a;»“3ḅaė;œ»
““3ḅaė;œ»ḷ“ 3 ḅ a ė ; œ » Main link.
““3ḅaė;œ» Index into Jelly's dictionary to yield
["", "Hello, World!"].
“ 3 ḅ a ė ; œ » Index into Jelly's dictionary to yield.
" FullERebitingBEfluffiest adoptable".
ḷ Take the left result.
“3a;»“3ḅaė;œ» Main link.
“3a;» Index into Jelly's dicrionary to yield " N-".
Set the argument and the return value to the result.
“3ḅaė;œ» Index into Jelly's dicrionary to yield "Hello, World!".
Set the return value to the result.
+0503 @@6 :22 //1 +050501 @@6 :55 +0502 @@6@6 :33 //1 +050502 @@6 :55 +03 //1 +04 @@6 :55 //1 +03 @@6 :55 +01 //1 +0504 @@6 :33 //1 +050502 @@6 :55 +01 //1 +050502 @@6 :55 +0502 @@6 :11 //1 +050501 @@6 :55 +01 //1 +03 @@6
每隔一个字母:
+53@6:2/1+551@6:5+52@66:3/1+552@6:5+3/1+4@6:5/1+3@6:5+1/1+54@6:3/1+552@6:5+1/1+552@6:5+52@6:1/1+551@6:5+1/1+3@6
由于Octave不需要方括号来进行索引,因此节省了4个字节。
'HHeelllloo,, WWoorrlldd!! ' (1:2 : 3 ^ 3)''
并简化为:
'Hello, World!'(: )'
初始代码中的字符串中的字母是重复的,因此Hello, World!
每秒钟删除一次,我们就可以使用。添加一些空格以确保保留括号和撇号。
索引确实是1:2:end
。有27个字符,我们不能使用end
或27
因为必须删除一个字符,所以我们3 ^ 3
改用了。当我们删除第三个字符时,索引就会变成(:)
(以及一些其他空格)。
(:)
意思是“变平并变成垂直向量”。因此,我们需要使用进行转置'
。我们不需要在原始代码中转置字符串,但是可以进行双重转置,因此第一个字符串使用进行了两次转置''
,第二个字符串仅进行了一次转置。
-1感谢Martin Ender。
'0H0e0l0l0o0,0 0W0o0r0l0d0!0'~ ⍕ 0
'0H0e0l0l0o0,0 0W0o0r0l0d0!0'
带零的消息作为可移动填充符
~
除了
⍕
格式化(字符串化)
0
数字零
只剩下奇数字符,它变成
'Hello, World!'
。
---
PRINT 'Hello, World!'
/*
-P-R-I-N-T-'-H-e-l-l-o-,- -W-o-r-l-d-!-'
---*/
单行和多行注释滥用,受CalculatorFeline的LUA版本启发。
删除所有偶数字符后,其中一些是换行符:
--PIT'el,Wrd'/
PRINT'Hello, World!'--/
a ='a0l0e0r0t0`0H0e0l0l0o0,0 0W0o0r0l0d0!0`0/0/';eval(a.replace(/0/g,''))
a
用content 构造一个字符串a0l0e0r0t0`0H0e0l0l0o0,0 0W0o0r0l0d0!0`0/0/
,然后删除所有0
的给定alert`Hello, World!`//
值eval
'd'。
采取该程序的其他所有特征
a=alert`Hello, World!`//;vlarpae//,')
它Hello, World
使用模板字符串语法以与整个程序中相同的方式发出警报,然后将调用结果存储在其中a
并包含具有洞察力的注释//;vlarpae//,')
。
2"Hteoltlaol,l yWhourmladn!! "⟛
在删除偶数字符时...
"Hello, World!"
具有所有字符:
2"..."⟛
no-op
2 push 2 to the stack
"..." push "Hteoltlaol,l yWhourmladn!! " to the stack
⟛ pop 2 and the string and push every 2nd character of the string
implicit output
没有偶数字符:
"..."
no-op
"..." push "Hello, World!" to the stack
implicit output