这个挑战非常适合不可读的人。
它的第一个版本是3379字节,只是让您知道我打了多少高尔夫球。
程序完全按照挑战中的描述接受输入:用空格分隔的单词列表(也可以包含数字和标点符号),然后是空格和至少为4的整数(较低的数字会生成无限循环) 。
'“”“”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”“” “'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” '“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”'“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “'”“”'“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“”“”“” “'”“'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”““”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” '“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“” “”“”“'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “'”“”'“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”'“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”“”“” '“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “'”“'”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”““”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“” “'”“'”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”““”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“'”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“” '“”“”“”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
说明
我将向您介绍该程序如何处理输入thyme horseradish peppermint 10
。预期的输出是thyme,\nhorser...,\npeppermint
。
首先,我们从7号单元格开始,读取整个输入,但从每个字符中减去32,以便空格变为零。
出于明显的原因,这将运行指针(在此处命名为p,存储在单元#0中)留在最后。我们使用一个while循环来查找最后一个间隙,该间隙是定义输出宽度的数字的开头(在此示例中为单元格#36)。
现在,我们要解码数字(即从十进制转换)。最终结果将在单元格t和r中。我们依靠它们从零开始的事实。
对于数字中的每个数字,请执行以下操作:
- 将t设置为-15。
- 在while循环中,将r(包含到目前为止的结果)减至-1(因为我们需要精确地进行r次迭代,但是由于减数发生在将其作为while循环的条件进行检查之前,因此减为0会减少一次迭代)对于每次迭代,将10加到t。现在t包含前一个结果减10的10倍。
- 再次在while循环中,将* p递减为0,并为每次迭代将t加1 。在此之后牛逼包含了到目前为止正确的中间结果:字符
'0'
以'9'
ASCII代码为48-57,32较早减法他们是16-25后如此,所以我们实际上增加15-24到牛逼,这与-15取消我们将其设置为更早。同样重要的是,这会将用于包含数字字符的单元格清零,以便后续代码可以识别单词列表的末尾。
- 将r设置为新的中间结果,以便下次迭代在r中找到它。(请注意,我们不需要再次读取t,我们可以使用上一个while循环中的最后一个值,因为我们知道* p不能为零,因此它至少运行了一次。)
最后,我们使用另一个简单的while循环(将t减为计数器)将我们刚刚计算出的数字转换为一元。我们从单元格#0向左存储一串1。这依赖于这样的事实,即单元格#1(我们为此(q)的运行指针)从0开始。我们少得到1,因为Unread中的while循环是这样的:
此后,我们不再需要r中的值,因此我们将该单元格重新用于其他用途。我们重置指针p和q,并使用稍后需要的字符的ASCII码初始化一些单元格。我还标记了c和s,我们将在以后使用,我们将依赖于s从零开始的事实:
嘿等一下 为什么单元格0的颜色是红色的?还记得我们输出的1太少了吗?诀窍是我们将单元格#0用作“扩展名”来对此进行更正。之所以有效,是因为我们知道p永远不会为0。这样,红色块现在宽了10个单元,正好是我们想要的数字。它还保存9个字符,以便能够将q初始化为1而不是0。
现在,我们进入遍历单词的while循环并将其全部输出。
步骤1:找出下一个单词是否适合当前行。我们可以简单地将p移至右侧,q移至左侧,同时使用while循环,直到p到达下一个间隙:
现在p在单词的右边,我们可以通过检查*(p + 1)是否为零来检查这是否是列表中的最后一个单词。我们还存储值(在我们的例子是72,因为它是“H”,从“辣根”零下32)ç,因为我们稍后会再需要它。在这种情况下,它不为零,因此我们将需要与单词一起输出逗号,因此单词要长一个字符。通过减少q一次来考虑这一点。最后,使用另一个while循环将p返回到单词的开头。
现在我们知道该单词将适合当前行,因为q指向一个非零值,所以我们要做的就是:
- 再次在单词中向前移动p,打印每个字符(加32,因为所有ASCII码都减32)。
- 如果c不为零,则打印逗号(使用单元格5中的值)。
- 将s设置为非零值,以指示下一次迭代我们不再位于行首,因此需要在下一个单词之前输出一个空格字符。(为此,我们重复使用上述打印语句的返回值,逗号为44。)
到目前为止的输出: thyme,
然后,大循环的下一次迭代开始。和以前一样,当我们从左到右遍历单词时,通过减小q来检查下一个单词是否适合该行的其余部分。请注意,与上一次迭代相比,q仍为-5,以跟踪当前行中已经打印了多少个字符。在“辣根”,加上一个逗号,加上一个计数的字符,因为之后小号是表明我们需要输出空间,以及不为零,q将有超调的1的块的结尾:
现在q指向零单元格,这意味着“辣根”将不适合当前行。现在,我们取决于s是否为非零。在我们的情况下,这意味着我们需要换行到下一行。我们要做的就是:
- 打印换行符(使用单元格3)
- 将q设置回1
- 将s设置为0
到目前为止的输出: thyme,\n
对于下一次迭代,p与以前位于相同的位置,因此我们将再次查看相同的单词。和以前一样,我们计算“辣根”中的字符,当发现后面还有另一个单词时,将c再次设置为80 ,将逗号减q,然后将p倒回到单词的开头:
与上一次迭代一样,我们发现“辣根”仍然不合适,因为q最终出现在零单元格上。但是,这次s为零,这意味着我们做的事情与上次不同。我们需要输出一些单词,三个点和一个逗号。我们的宽度是10,所以我们需要输出6个字符的单词。让我们看看如果我们完成以下任务:
- 查找红色块1的开头。我们可以通过右移来做到这一点,因为我们知道q必须在左移。
- 如果我们还需要输出逗号(c ≠0),请再次增加q。
磁带现在看起来像这样:
我在这里标记了6个单元格的跨度。如您所见,我们需要输出字符,直到q = -1。检查该代码非常有效(基本上是while ((++q)+1) { ... }
)。所以:
- 打印这些字符(加上32,因为所有ASCII码都减去32),直到q达到-1。然后,p将在单元格19中的“辣根”中间。
- 打印三个点。由于print命令返回其自己的参数,因此我们可以有效地代码嵌套(本质上为
print(print(print('.')))
)。我们从单元格#5中获取ASCII值,并将其加2以得到点的ASCII码。
- 将p移至单词的末尾。既然我们知道我们还没有到达单词的末尾(因为单词太长了,我们必须从单词中删除至少3个字符以适应点),所以此循环肯定至少有一个迭代,因此代码中使while循环的主体计算点的ASCII值,然后将while循环的返回值传递给打印函数的代码较短。
- 如果c不为零,则打印逗号。
完成所有这些操作后,我们还打印了换行符(使用3号单元格),并将q设置为1。即使s已经为0,我们也可以将s设置为0,这与我们之前将其包装到下一行(当s非零时),因此为了避免重复代码,我们在检查s的条件之后执行此操作。
到目前为止的输出: thyme,\nhorser...,\n
仅剩一次迭代。这次,在计算单词的字母之后,我们得到:
这次,在p之后没有任何内容,因此我们将c设置为0表示“无逗号”,因此,我们不再将q减一。由于q现在指向一个非零的单元格,因此我们知道该单词将适合,因此执行与第一次迭代相同的代码,只是这次c为零,因此它根本不会打印逗号。
输出: thyme,\nhorser...,\npeppermint
在本演练中,我没有涉及代码实际打印空格的情况,但是我认为现在应该很清楚了。如果代码发现单词适合(* q ≠0)并且s不为零,它将仅在单词之前输出一个空格。