找出这是否是Stack Cats风格的有效Stack Cats程序!


16

背景

Stack Cats是Martin Ender提出的一种可逆的深奥语言。Stack Cats中的每个命令都是其自身的反函数(表示为对称字符,如-_:T|),或者具有其反命令(表示为镜像,如() {} [] <>)。Stack Cats对语法的要求很高,那就是整个程序应该是其自身的镜像。请注意,这意味着任何有效的Stack Cats程序都是自然的镜像歧义

这是Stack Cats的整个命令集:

  • 自对称: !*+-:=ITX^_|
  • 对称对: () {} [] <> \/

其他字符无效;字符不在上述字符集中的任何输入应输出false。

语言有附加约束(){}对必须始终平衡,但是为了简单起见,你不必检查此条件。

以下是有效的Stack Cats程序的一些示例(同样,请注意,您不会检查平衡括号):

{[+]==[+]}
[)>^<(]
({T)}|{(T})
<(*]{[:!-_:>}<[<)*(>]>{<:_-!:]}[*)>

这些不是:

b<+>d
())(
({[<++<]})

挑战

编写确定给定字符串是否有效的Stack Cats程序的程序或函数。您的代码也应该是自然的镜像歧义,这意味着:

  • 您的代码应该是其自身的镜像。
    • 您的代码可能具有一个或多个换行符,只要自然显示的整个代码是其自身的镜像即可。
    • 您可以在每行上省略或添加尾随空格,因为它不会更改显示。
    • 不允许使用制表符,因为它们在显示上有些歧义。

注意:您的代码不会必须是一个有效的协议栈猫节目; 它可能包含Stack Cats不允许的某些额外字符。(请参阅下面的完整列表。)

例如,以下两个程序是对称的(因此是有效的提交),而第三个则不是:

({bTd})
[<q|p>]
({bTd})
  IXI
({bTd})
IXI
  • 关于“镜像对称性”,仅考虑Stack Cats风格的对称性(例如({IH}),即使具有镜像对称性,也不是有效的提交方式)。
  • 您的代码只能包含以下字符集以及换行符:
    • 自对称:空格(0x20)+!"'*+-.8:=AHIMOTUVWXY^_ovwx|
    • 对称对: () /\ <> [] bd pq {}

当在SE上显示为代码时,字符集被选择为严格对称或自对称。

输入输出

输入范围是任何可打印ASCII字符的单行字符串

您可以选择将输入作为字符串,字符列表或ASCII值列表。

您可以选择输出:

  • 由您选择的语言定义的任何真假值
    • 输入之间的实际结果值可能有所不同(例如,对于一个真实输入,输出1;对于另一个真实输入,输出2)。
    • 不允许交换真实值和虚假值。
  • 分别为true / false的任何两个常量值
    • 在这种情况下,结果值应恰好是两个常数值之一。

您应该在提交中指定输入方法和输出值。

获奖条件

这是,因此每种语言中的最低字节为准。

笔记

  • 照常禁止出现标准漏洞
  • 当然,您可以在Stack Cats中解决此问题,但是机会是您不能使用允许将代码大小减少一半的标志。:P语言非常难学

1
为什么#不允许尖锐?
tsh

1
@tsh它在许多字体中略有倾斜,包括SE上的代码字体(至少我在Chrome上看到的)。
Bubbler

@DLosc我试图澄清一些问题。但是,如果您认为说明不清楚,请随时进行编辑。
Bubbler

Answers:


16

的JavaScript(ES6),487 467 378 298 292个 280 266 264字节

@Bubbler节省了14个字节

I=>(V=v=>!I[v]||((T=o=>[[]][+!!A[o]]||[(I[v]!=A[o]||A)[o^o<88/8]]+T(++o))(8-8)==I.pop())*V(++v))(V|(A='(){}[]<>\\/ !*+-:=ITX^_|'))//\\(('|_^XTI=:-+*! \//<>[]{}()'=A)|V)((v++)V*(()qoq.I==(8-8)((o++)T+[[8\88>o^o](A||[o]A=![v]I)]||[[o]A!!+][[]]<=o=T))||[v]I!<=v=V)<=I

定义一个匿名函数,该函数接受一个char数组并返回所需的输出。输出为真/假;通常1/ 0,但空字符串给出true

怎么样?

最明显的技巧是//\\用作中心点,以注释掉代码的镜像版本。在那之后,它变成了仅使用给定的字符集来找出解决问题的最短方法的游戏。

我们遇到的第一个问题是缺少关键字和内置功能。我们仍然奇迹般地拥有了.pop(),但是其他所有事情都必须通过允许的运算符(包括a[b]f(c))来完成,并递归地模拟循环。

第二个问题是缺少逻辑运算符。无论是&?是允许的,这意味着只有决策运营商,我们可以使用的||。因此,我们必须仔细构造逻辑以解决这一问题。

我要做的第一件事是定义一个T反映单个字符的函数。基本思想是循环访问可镜像字符的字符串中的每个字符,测试每个字符是否与给定字符相等。如果是平等的,我们在返回其镜面炭index^1(){}[]<>\/,或焦炭本身的休息。

我在这里遇到的第一个问题是在每次迭代中获取镜像的char或伪造的值。我最终想出的解决方案是(x!=A[o]||A)[o^o<88/8],其中x输入字符,A镜像字母和o当前索引在哪里。如果x与不相同A[o],则给出true,索引表达式的值为undefined; 否则,会||A被激活,最终我们会得到A[o^(o<11)]

第二个问题是如何终止递归。我发现执行此操作的最佳方法是简单地连接每次迭代的结果,并在A到达末尾时返回空字符串。这给我们带来了另外两个问题:将undefineds 转换为空字符串,并返回空字符串||。这些可以通过滥用数组来解决:[a]+""提供的字符串表示形式a,如果a未定义,则为空字符串。另外,它[]是真实的,但可以字符串化为空字符串,因此我们可以方便地将其用作“真实的空字符串”。

现在,我们可以使用该T功能来镜像任何单个字符。我们这样做是递归的镜子比较I[v++],以I.pop()直至达到字符数组的结束。我们不能使用&&&检查所有比较是否正确,而是使用*。将所有这些结果相乘可以得出1每个字符是否都是相反字符的镜像,或者0是否有任何比较失败。

这基本上就是这个答案的工作方式。我可能没有很清楚地解释它,所以请问您可能遇到的任何问题,并指出我犯的任何错误。


U=([A,...H])=>!(V=H.pop())||!(W=([x,...X]=(T="!*+-:=ITX^_|")+"(){}[]<>\\/",[o,...O]=T+")(}{][></\\")=>!x||((o!=A)+(x!=V))*(W(X,O)))()*U(H)//...280字节
tsh

源代码中不允许使用@tsh 逗号,因为它们不对称(使用SE代码字体)并且没有镜像(
始终使用

对不起,我错过了那部分。
tsh

@tsh我一开始也很想念它,花了20分钟在解决方案上才意识到它是无效的:P
ETHproductions

无论如何,因为您已经发布了JavaScript解决方案。我们现在不需要另一个JSF * k解决方案... //如果我是您,我将通过将其编译为JSF * k来解决此问题……
tsh

1

Stax76 70字节

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq*!-W:"|_^XTI=:-+*!\>])}"_=_HM^^xW:

运行并调试

Stax是Stack Cats的朋友,具有内部功能,可以从上半部分生成Stack Cats程序的后半部分。如果我们不在乎源代码的限制并且不需要检查字符集,那么这里是一个4字节的解决方案:

4字节

:R_=

运行并调试

说明

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq...
:W                                         "Mirror" the string
                                           Equivalent to appending the reverse of the string to itself
                                           And map `{([</\>])}` to its mirror in the appended string
  x^^                                      2, but we can't just use `2` here ...
     MH                                    Partition the "mirror"ed string to two parts, take the later part.
       _=                                  The string is the same as the original one (*)
                                           `:Wx^^MH_=` is just `:R_=`, but we can't use `R` here ...
         _                                 Input string
          "{([</!*+-:=ITX^_|":W-           Remove valid characters from input
                                !          The final string is empty (**)
                                 *         (*) and (**)
                                  p        Pop and print result
                                   q       Peek stack and print
                                           Since the stack is now empty, this causes the program to terminate
                                    ...    Not executed

的存在RW真的很有趣。通过pq组合终止程序对我也印象深刻。
Bubbler

谢谢。指令实际上是两个字节::R:W。我觉得我不禁要告诉大家Stax中有内部工具可以做到这一点。
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.