7,31个字符,得分30,安全的,但可能是坏了吗?
一个7程序通常只是一个数字,但它可以包含空格,将其拆分为多个数字。因此,此提交包含两个数字(由7解释器隐式连接),并且程序同样通过标准输入将两个数字作为输入。(标题中的“ 31个字符”是两个数字的总长度,加上一个单独的空格字符;组成这些数字的数字在用作程序时被解释为八进制,而在用作输入时被解释为十进制,以及这是两种情况下的数字,而不是实际数字,请注意,无论是将其视为程序还是将其视为输入,无论您使用空格还是换行符将它们无关;我希望不会使提交无效。)
预期的输出是以下数字(此处以十进制表示,因为这是7解释器使用的输出格式):
238363505302130098723162537059
请注意,从Esolang Wiki链接的7解释器在内部将数字存储为一元,这意味着您不太可能有足够的内存来实际在其自身上运行程序以查看其作用。我通过手动计算程序的行为来验证该程序,并在少量输入上对其进行测试,以验证该程序是否符合我的预期。一种替代方法是编写使用更有效的数字存储方法的解释器。
在这里避免裂缝是很痛苦的,但是我现在终于满意了,除了程序本身的数字,没有其他两个数字能够产生238363505302130098723162537059作为输出。(编辑1周后:根据您对问题的理解,我可能是错了;请参阅下文。)
解
原始程序是:
711170237403706
111723603700633
此程序需要两个数X和ÿ,并且计算表达式的结果3 x y- ÿ− 2(即ÿ(3 X - 1 )- 2)。如果我们在执行此计算x = 711170237403706和ÿ= 111723603700633,我们得到的结果238363505302130098723162537059的要求。
预期没有其他输入将给出期望的结果,因为:
输入必须被选择成使得ÿ(3 x − 1 )− 2 = 238363505302130098723162537059,即ÿ(3 x − 1 )= 238363505302130098723162537061(添加2向两侧)。这个数字是一个半素数,只有两个因素:111723603700633和2133510712211117。这些数字中只有一个2133510712211117可以3 x − 1的形式表示(给出(3 × 711170237403706 )− 1 = 2133510712211117)。因此,我们可以唯一地标识哪个数字是X和哪个是ÿ,这意味着只有一个输入有效。
但是,根据您对问题的理解方式,可能会有第二个输入产生所需的输出(因此使该解决方案无效):
不幸的是,一个半素数有两个乘性分区,分为两个因子:一个是将其分为两个素数因子,另一个是由1个和数字本身组成的琐碎分区。1个不能以3 x − 1的形式用整数X编写,但是所需的输出可以是;因此,潜在的元破解涉及给输入为79454501767376699574387512354和1个。但是,这里的第一个数字包含字符(8和9)不在7个程序的字符集中。因此,如果输入被限制为与程序具有相同的字符集,则此解决方案有效。但是,如果允许输入包含来自程序字符集外部的字符,则此解决方案无效。
说明
以下是预期解决方案的功能:
711170237403706 111723603700633
7 7 7堆栈元素分隔符
111 023 403706 111723603700633初始堆栈元素
111一号3,一元
023 I / O DSL用于“输入号码”
403706 111723603700633主程序
(隐式:执行主程序元素的副本,保留原始内容)
40在{program}上方交换{023},使其转义
3是否使用{023}进行I / O;弹出{程序}
0 I / O:数字
23输入一个数字,复制{111}多次
706在数字后加上“ 6”(递减)
11推入两个空的堆栈元素
17236推入堆栈元素“ 23”(未转义)
0转义{23},消耗一个空元素
3是否使用{23}进行I / O;弹出{下面的元素}
23复制堆栈输入的顶部多次
7006附加“ 66”(即减去2)
3输出{作为数字}
3退出程序(由于堆栈不足)
前7和后3对于程序的功能不是必需的,它们只是用来获得正确输出的主要因素。如果您理解数字格式,则有助于遵循该程序;号码存储在一元变体,其中1
与7
增加1的值,0
和6
由1减小值(因此追加66
由2减小的值,重复所述数量乘以它,等等)。通过重复堆栈元素来完成输入(因此,如果堆栈元素为12345
,并且输入为3,则新的堆栈元素将为123451234512345)。