这非常有趣。感谢您发布此挑战。
完全公开:发布此挑战时不存在该语言(六边形)。但是,我没有发明它,并且该语言并不是针对这种挑战(或任何其他特定挑战)而设计的。
){_2"_{\"{{""}"{'2//_.\><*\"\/_><[\]/3\'\_;|#__/(\2\'3_'}(#:|{$#{>_\//(#={/;01*&"\\_|[##={|}$_#></)]$_##|){*_.>.(/?#//~-="{}<_"=#/\}.>"%<.{#{x\"<#_/=&{./1#_#>__<_'\/"#|@_|/{=/'|\"".{/>}]#]>(_<\'{\&#|>=&{{(\=/\{*'"]<$_
六角形布置:
) { _ 2 " _ { \ "
{ { " " } " { ' 2 /
/ _ . \ > < * \ " \ /
_ > < [ \ ] / 3 \ ' \ _
; | # _ _ / ( \ 2 \ ' 3 _
' } ( # : | { $ # { > _ \ /
/ ( # = { / ; 0 1 * & " \ \ _
| [ # # = { | } $ _ # > < / ) ]
$ _ # # | ) { * _ . > . ( / ? # /
/ ~ - = " { } < _ " = # / \ } .
> " % < . { # { x \ " < # _ /
= & { . / 1 # _ # > _ _ < _
' \ / " # | @ _ | / { = /
' | \ " " . { / > } ] #
] > ( _ < \ ' { \ & #
| > = & { { ( \ = /
\ { * ' " ] < $ _
该程序实际上并未使用该#
指令,因此我使用该字符来显示哪些单元格确实未被使用。
该程序如何工作?那要看。您要短版还是长版?
简短说明
为了在以下说明中说明“线”和“段”的含义,请考虑对预期输出的这种分解:
segments →
│ │ │ │ │ │x lines
─┼───┼─┼─────────┼─┼───┼─ ↓
│ │ │ │ │xxx│
─┼───┼─┼─────────┼─┼───┘
│ │ │ │x│
─┼───┼─┼─────────┼─┘
│ │ │xxxxxxxxx│
─┼───┼─┼─────────┘
│ │x│
─┼───┼─┘
│xxx│
─┼───┘
x│
解释了这一点,该程序对应于以下伪代码:
n = get integer from stdin
# Calculate the number of lines we need to output.
line = pow(2, n+1)
while line > 0:
line = line - 1
# For all segments except the last, the character to use is spaces.
ch = ' ' (space, ASCII 32)
# The number of segments in each line is
# equal to the line number, counting down.
seg = line
while seg > 0:
seg = seg - 1
# For the last segment, use x’s.
if seg = 0:
ch = 'x' (ASCII 120)
# Calculate the actual segment number, where the leftmost is 1
n = line - seg
# Output the segment
i = pow(3, number of times n can be divided by 2)
i times: output ch
output '\n' (newline, ASCII 10)
end program
详细说明
请参考此颜色编码的代码路径图。
执行从左上角开始。通过追求相当复杂的路径){2'"''3''"2}?)
来执行指令序列(加上一些多余的取消,例如,"{
等等)。我们从深红色突出显示的指令指针#0开始。中途,我们切换到#1,从右上角开始,然后涂上深绿色。当IP#2以矢车菊蓝色(右中)开始时,内存布局是这样的:
在整个程序中,标记为2a和2b的边将始终具有该值2
(我们分别使用它们来计算2 ^ 1并除以2),标记为3的边将始终3
为该值(我们使用它来计算3ⁱ)。
进入第一个循环时,我们开始做生意,以矢车菊蓝色突出显示。该循环执行指令(}*{=&}{=
以计算值2 11。当循环退出时,采用鞍形棕色路径,这将我们带到指令指针3。该IP仅以金黄色黄色沿底部边缘向西涉水,不久便将控制权交给IP#4。
紫红色的路径表示从左下角开始的IP#4如何迅速进行到递减行,将ch设置为32
(空格字符)并将seg设置为(line的新值)。由于早期递减的缘故,我们实际上开始于2 -1−1,最终经历了值0的最后一次迭代。然后,我们进入第一个嵌套循环。
我们将注意力转向分支靛蓝,其中在seg短暂递减后,仅当seg现在为零时,我们才会将ch更新为。然后,将n设置为-seg行,以确定我们所在的段的实际数量。我们立即进入另一个循环,这次使用的是番茄的鲜艳颜色。x
在这里,我们找出了多少次ñ(当前段号)可以通过2整除,只要模为我们提供了零,我们增加我和鸿沟ñ通过2.当我们感到满意ñ不再正是如此整除,我们分成灰色的板岩,它包含两个循环:首先,它将3提高到我们计算的i的幂,然后输出ch多次。观察到这些循环中的第一个包含一个[
指令,将控制权切换到IP#3,这只是较早地沿底部边缘迈出的一步。循环的主体(乘以3并递减)由一个孤独的IP#3执行,该IP#3沿代码的底部边缘被无休止的深橄榄绿色循环包围。类似地,这些板岩灰色循环中的第二个包含一条]
指令,该指令激活IP#5以输出ch和减量,此处以深印度红显示。在这两种情况下,陷入困境的那些指令指针一次只能执行一次迭代,然后将控制权交还给IP#4,只是为了等待再次调用它们的服务。同时,石板灰重新加入了其紫红色和靛蓝弟兄风格。
当段不可避免地达到零时,靛蓝回路退出到草坪绿色路径中,该路径仅输出换行符,并迅速合并回到紫红色中以继续行循环。在行循环的最后迭代之外,还有最终程序终止的较短的稳定路径。
(,],~3^#@~.)@]
而不是(1,[:,1,"0~3*])
节省1个字节。如果您可以接受!
输出charu:32+
而不是' #'{~
另存一个。