堆猫 -mn
,4个字节
:-:_
在线尝试!在页脚中,我包括了所有其他4字节解决方案。(Stack Cats会在第一个换行后忽略所有内容。)
尝试反向!
说明
该-n
标志打开数字输出(和输入,但我们没有),并且该-m
标志通常只是为了方便打高尔夫球,从而可以避免源代码的冗余部分。这是因为每个Stack Cats程序都必须具有镜像对称性。使用-m
标志时,您只给它前半部分(加上中心字符)。所以这里的实际程序是:
:-:_:-:
正如您在第一个TIO链接中看到的那样,有大量的4字节解决方案,但我之所以选择它是因为其简单性。Stack Cats基于堆栈,该程序仅使用初始堆栈。由于我们没有任何输入,因此它-1
在无穷大的零井上方包含一个(EOF标记)。程序中的三个命令具有以下含义:
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
因此,这是程序修改堆栈的方式(状态和命令交错排列,以指示每个命令如何将堆栈从一种状态更改为另一种状态):
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
事实证明,在这里真正执行任何操作的唯一命令是_
将EOF标记变为1
。程序末尾的输出是隐式的,而EOF标记是可选的,因此这只会打印出1
我们得到的结果。
现在,如果我们反转源代码,由于隐式镜像,实际程序将变为:
_:-:-:_
这做了非常不同的事情:
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
此时的堆栈的底部是仍然一-1
所以它并充当EOF标记,并且只有-1
在其顶部上获取打印。
...
现在说了这么多,由于Stack Cats与反向代码有着如此独特的关系,我觉得使用-m
有点欺骗。通常,这仅意味着通过省略源代码的冗余部分来节省字节,但是实际上,这使挑战变得容易得多,甚至整个程序也更短。这是因为反转完整程序只会在程序包含以下任何一个时更改程序<>[]
,这也意味着该程序最终会使用多个堆栈(Stack Cats实际上有一堆堆栈带,其中除初始堆栈之外的所有堆栈均被填充)以零开头)。此外,将其反转然后仅交换<>
和[]
对,这仍然使执行对称。打破这种对称性的唯一方法就是使用I
它做-]
或-[
还是什么都不是,取决于堆栈顶部的符号。所以...
堆猫 -n
,11个字节
*|]I*:*I[|*
在线尝试!页脚再次包括相同字节数的所有其他选择。在每个程序之后,其中一些输出1 / -1和一些输出2 / -2。我选择这个来随机解释是输出2的一种。
尝试反向!
说明
就像我说的,这个要长一点。即使我们确实-m
为此使用了表示法,它也将占用6个字节,而不是上面的4个字节。
这次使用的命令:
* Toggle the least significant bit of the top of the stack.
| Reverse the longest non-zero of prefix on this stack.
[] Move one stack to the left/right and take the top of the current stack with you.
I If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
: Swap the top two stack elements.
第一个程序仅使用两个堆栈。在ASCII艺术中这样做有点混乱,但是我会尽力而为。方括号指示磁带头位于哪个堆栈上,我将在每对堆栈状态之间放置命令。
[-1]
… 0 0 …
0 0
… …
*
[-2]
… 0 0 …
0 0
… …
| (does nothing)
]
[-2]
… 0 0 …
0 0
… …
I
[2]
… 0 0 …
0 0
… …
*
[3]
… 0 0 …
0 0
… …
:
[0]
… 3 0 …
0 0
… …
*
[1]
… 3 0 …
0 0
… …
I
[-1]
… 3 0 …
0 0
… …
[
[-1]
… 3 0 …
0 0
… …
|
[ 3]
… -1 0 …
0 0
… …
*
[ 2]
… -1 0 …
0 0
… …
现在,该-1
行为将作为EOF标记并2
进行打印。
直到为止,其他程序是相同的[
。直到第二个,它实际上几乎一直都一样I
。从技术上讲,我们将位于不同的堆栈上,但是如果没有任何价值,它们都是无法区分的。但随后的区别I[
,并I]
结束了无所谓:
*|[I*:*I
[-1]
… 3 0 0 …
0 0 0
… … …
]
[-1]
… 3 0 0 …
0 0 0
… … …
| (does nothing)
*
[-2]
… 3 0 0 …
0 0 0
… … …
这次,我们没有EOF标记,但是程序仍输出-2
。
-
(0x45 = 0b00101101)在Jelly中起作用--
因为它定义了文字-1,所以产生-1,而Ṇ
(0xB4 = 0b10110100)因为执行逻辑不而产生1。的隐式输入零。(当然Ṇ
效果也不错:p)