将代码行放到代码中,然后全部摇晃


10

使用一种编程语言编写5个单行程序,当分别运行时,每个程序都会输出不同的第一节经文给哈里·尼尔森(Harry Nilsson)1972年的歌曲《椰子》。

哥买了一个椰子,他买了一毛钱
他的妹妹有另外一个,她付出它的石灰
她把石灰的椰子,她喝了他们俩了
,她把石灰的椰子,她喝了他们俩了
她把石灰放在椰子里,她把它们都喝了

完整歌词

最后3行具有相同的歌词,因此您的最后3个程序也可能相同。

这5个单行程序有5种阶乘或120种方式,可以在一个5行程序中每行安排一个。您必须优化单行程序,以使对于这120种组合中的尽可能多的5行程序以正确的顺序输出整节经文,与上面显示的完全一样。

最简单的答案是5条单行打印语句,最后3条相同:

print('Brother bought a coconut, he bought it for a dime')
print('His sister had another one, she paid it for a lime')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')

只要前两个单行代码位于正确的位置,五行程序的输出将按其正确顺序排列。在120种可能的布置中,只有6种可以做到这一点。

计分

在所有120场胜利中,提交案件的案件最多。打破平局的程序将使用累积字节数最少的程序集(不计换行符)。该示例有309个字节。

细节

  • 您的程序可能无法阅读其自身的源代码。他们也不应读取其他外部文件或要求网络连接。

  • 输出到标准输出或最接近的替代项。您还可以输出具有您选择的名称的文件。

  • “单行程序”是包含除行终止符之外的任何字符的字符串(您可能只需要担心换行符)。

  • 将单线组成5线时,您应该恰好添加4条换行符,每对相邻的单线之间应添加一条换行符。您可以选择添加尾随换行符。


“编写5个程序,每个程序输出不同的行...”不是没有可能吗?
feersum

@feersum这两是不同的。其中三个恰好具有相同的文本。
加尔文的爱好2015年

如果我的Java文件包含5个类,每个类都有一个main方法,该怎么办?然后在运行程序时应运行哪个?
feersum

@feersum那么您的编译器做什么?当同一文件中的多个类都具有Java时,我不确定Java会做什么main
加尔文的爱好

2
我记得这一点的方式是,在一个可口可乐广告中,他们“将石灰放入可乐中” ...
Joe Z.

Answers:


9

CJam,120个有效排列,334个299 290字节

"She put the lime in the coconut, she drank them both up"N+
"Brother bought a coconut, he bought it for a dime"N+]$~
"She put the lime in the coconut, she drank them both up"N+
"His sister had another one, she paid it for a lime"N+]$~
"She put the lime in the coconut, she drank them both up"N+

很简单的逻辑:

  • 将歌曲的每一行分别放在5个程序中
  • 将所有内容包装在数组中
  • 对数组排序
  • 解开数组,以便下一个程序可以使用相同的逻辑
  • 在每个步骤中,我们将部分歌词排成一个数组。幸运的是,对数组进行排序可以给出正确的歌词顺序。

更新:事实证明,您不需要在这3首类似歌曲并出现在歌曲结尾处之后的wrap-sort-unwrap循环。我可以解释为什么它不那么明显:)


8

前奏,120个排列,2045 2035字节

9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                          (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+9409-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-5809-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-99+58992++96+99+09-9-9-3-                                             (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                 (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+993+09-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-49197+09-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-595+96+09-9-9-9-9-9-9-1-99+58992++96+95+109-9-9-9-9-9-9-1-41809-9-9-9-9-9-9-1-99+5992++991++9991++09-9-9-9-9-9-9-1-991++909-9-6-                                                           (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                                                   (9+9+9+9+9+9+9+9+9+9+6+!)

这最终使我相信,Prelude和CJam需要一个孩子。如果不是因为Prelude的指令集非常有限,那么即使没有击败CJam,此提交内容实际上也会非常有竞争力。

基本思想如下

"push line 4"               print
"push line 1"print
"push line 3"          print
"push line 2"     print
"push line 5"                    print

在Prelude中,每行都是带有自己堆栈的自己的“语音”,并且这些声音是并行执行的。也就是说,在完整程序中,每一行将仅单独构造字符串,并在最后打印该字符串。但是由于print语句的偏移,行的顺序对于输出的顺序根本不重要,因为执行是从左到右而不是从上到下的。

现在,为什么行这么长?前奏仅将数字存储在其堆栈中。此外,它一次只能输入一位数字,因此必须通过加法和减法构造更大的数字(也没有乘法或其他算术)。因此,代码的最大部分就是简单地计算并推送正确的字符代码。为了简化一点,我将它们偏移了96。最后,要打印,我要循环直到堆栈为空(即0遇到a),然后在每个数字上加96,然后打印出来。

请注意,由于字符串是从最后一个字符打印到第一个字符的,因此它们被反向推入。

这假定Python解释NUMERIC_OUTPUT = False(这是该规范定义的I / O方法)。

我使用以下CJam代码生成字符串构造:

"Brother bought a coconut, he bought it for a dime
"W%{i96-_0<{zLa*9/:,'-*'-+0\+}{La*9/:,_,'+*W<}?}%

最后,只是为了好玩,为什么我认为如果Prelude具有字符串的概念,这真的很短:

"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emid a rof ti thguob eh ,tunococ a thguob rehtorB"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emil a rof ti diap ehs ,eno rehtona dah retsis siH"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!

现在,打印语句!的顺序已经正确,因此我什至不需要抵消它们。我想我会花点时间来实现这一点。


7

Ruby,120个有效排列,430字节

$*[1]='His sister had another one, she paid it for a lime';a||=at_exit{puts($*-[p])}
$*[0]='Brother bought a coconut, he bought it for a dime';a||=at_exit{puts($*)}
$*[2]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[3]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[4]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}

可以按任何顺序或单独工作。每一行都会修改全局状态,然后将一个挂钩设置为在程序末尾执行,除非已经设置了该挂钩。


问题是“ 5个单行程序”。这是否意味着每一行都应该在单独的程序中?不是全部合而为一吗?
bacchusbeale 2015年

1
只是格式化问题。每行都是自己的程序。
histocrat

6

> <>,120个排列,703字节

<    /a"emid a rof ti thguob eh ,tunococ a thguob rehtorB"0a.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<   / a"emil a rof ti diap ehs ,eno rehtona dah retsis siH"09.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<  /  a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"08.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
< /   a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"07.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
</    a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"06.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"

对于2D语言而言,单线限制非常困难,因此我必须找到一种方法来充分利用.瞬态传送指令。

初始值<使程序向左流动,环绕并执行

"o;?=0l>\\\\\\/////"15p26p37p48p59p75p76p77p78p79p7ap8ap9apaapbapcapdap

这是一系列p(放置)指令,它们将字符放置到板子看起来像这样:

<    /<lyrics1>0a.#.!50<blah>
<   / <lyrics2>09.#.!50<blah>
<  /  <lyrics3>08.#.!50<blah>
< /   <lyrics4>07.#.!50<blah>
</    <lyrics5>06.#.!50<blah>
 /     \
  /    \
   /   \
    /  \
     / \
       >l0=?;o

#.!50随后再次翻转程序流回到右,跳跃到5行之前,以下是这样的:

  • 在第/5行的镜像之后,找到歌词5,并将其推入堆栈。然后我们传送到第6行。
  • 在第/6行的镜像之后,找到歌词4,并将其推入堆栈。然后,我们传送到7号线。
  • 在第/7行的镜子后面找到歌词3 ...

这种情况一直持续到我们推入歌词1为止,这时我们将传送到第10行。这是一个循环,用于打印整个堆栈直到其为空。

如果仅显示该程序的一行,则\镜像将执行与每个歌词行上的传送相同的工作。

如果程序是加扰的,则上面的说明仍然适用,因此该程序适用于所有排列!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.