变相变形金刚(警察线)


10

强盗的线在这里

警察的任务是编写一个函数或程序,当给定其自身的输入时,该函数或程序将输出有限的确定性字符串。如果为程序提供了不同的输入,则应返回不同的输出。

规则:

  • 提交内容包括
    • 语言名称
      • 如果使用了任何标志,则应将其显示出来。
    • 程序字节数
    • 输出字节数
    • 输出量
      • 如果时间特别长,请提供粘贴框或类似内容
      • 如果其中包含无法打印的内容,请提供一个十六进制转储。
      • 尾随换行符和空格应包含在输出中
    • 输入来自何处(STDIN,命令行
  • 如果适用,您可以假定输入中不存在表示EOF的字节,除非您在程序中使用该字节。
  • 如果您的程序被破解,请在强盗标题中的标题中添加指向相应答案的链接。
  • 您的程序直到一周过去才安全,并且您将其标记为安全。
  • 我不赞成使用输入或加密哈希函数为随机种子等技术。我无法阻止他们,但我不会接受利用其中任何一个的解决方案。还要注意,其中一些技术可能会发生冲突,其中不同的字符串会产生相同的输出。
  • 您的目标是拥有最短的输出。在发布此问题后的三周内发布的最短安全解决方案将获胜!

强盗的任务是找到一个大小等于或小于原始文件的程序,该程序也要遵守上述规则。

如果强盗使用不同于预期的解决方案破解您的程序,那么您就有机会通过证明强盗的解决方案不正确来“破解”程序。您可以通过找到强盗程序的输入来实现,以产生相同的输出。

提交示例:

brainfuck,10个字节,得分:10

]<.[<],>[,

这个解决方案是,[>,] <[。<],它只是反转输入

祝好运!


“如果给程序一个不同的输入,它应该返回一个不同的输出。” 这是否意味着程序永远不要为其他输入输出相同的东西?还是这意味着程序无论输入什么都不应该不断输出某些内容?(存在一个不等于其自身的输入,而FORALL输入不等于其自身,则返回不同的输出。)
tsh

@tsh仅其自身的输入必须具有唯一的输出。例如,有效的提交可以是一个自我识别程序该程序1可以自己输出,0否则输出
Jo King

@JoKing那么您的示例Python 3提交无效吗?因为它很明显也输出1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941其他一些字符串。
林恩

@lynn你是对的。我删除了该示例
Jo King

Answers:


4

7,31个字符,得分30,安全的,但可能是坏了吗?

一个7程序通常只是一个数字,但它可以包含空格,将其拆分为多个数字。因此,此提交包含两个数字(由7解释器隐式连接),并且程序同样通过标准输入将两个数字作为输入。(标题中的“ 31个字符”是两个数字的总长度,加上一个单独的空格字符;组成这些数字的数字在用作程序时被解释为八进制,而在用作输入时被解释为十进制,以及这是两种情况下的数字,而不是实际数字,请注意,无论是将其视为程序还是将其视为输入,无论您使用空格还是换行符将它们无关;我希望不会使提交无效。)

预期的输出是以下数字(此处以十进制表示,因为这是7解释器使用的输出格式):

238363505302130098723162537059

请注意,从Esolang Wiki链接的7解释器在内部将数字存储为一元,这意味着您不太可能有足够的内存来实际在其自身上运行程序以查看其作用。我通过手动计算程序的行为来验证该程序,并在少量输入上对其进行测试,以验证该程序是否符合我的预期。一种替代方法是编写使用更有效的数字存储方法的解释器。

在这里避免裂缝是很痛苦的,但是我现在终于满意了,除了程序本身的数字,没有其他两个数字能够产生238363505302130098723162537059作为输出。(编辑1周后:根据您对问题的理解,我可能是错了;请参阅下文。

原始程序是:

711170237403706
111723603700633
此程序需要两个数Xÿ,并且计算表达式的结果3Xÿ-ÿ-2(即ÿ3X-1个-2)。如果我们在执行此计算X=711170237403706ÿ=111723603700633我们得到的结果238363505302130098723162537059的要求

预期没有其他输入将给出期望的结果,因为:

输入必须被选择成使得ÿ3X-1个-2=238363505302130098723162537059,即ÿ3X-1个=238363505302130098723162537061(添加2向两侧)。这个数字是一个半素数,只有两个因素:1117236037006332133510712211117。这些数字中只有一个2133510712211117可以3X-1个的形式表示(给出3×711170237403706-1个=2133510712211117)。因此,我们可以唯一地标识哪个数字是X和哪个是ÿ,这意味着只有一个输入有效。

但是,根据您对问题的理解方式,可能会有第二个输入产生所需的输出(因此使该解决方案无效):

不幸的是,一个半素数有两个乘性分区,分为两个因子:一个是将其分为两个素数因子,另一个是由1个和数字本身组成的琐碎分区。1个不能以3X-1个的形式用整数X编写,但是所需的输出可以是;因此,潜在的元破解涉及给输入为794545017673766995743875123541个。但是,这里的第一个数字包含字符(89)不在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对于程序的功能不是必需的,它们只是用来获得正确输出的主要因素。如果您理解数字格式,则有助于遵循该程序;号码存储在一元变体,其中17增加1的值,06由1减小值(因此追加66由2减小的值,重复所述数量乘以它,等等)。通过重复堆栈元素来完成输入(因此,如果堆栈元素为12345,并且输入为3,则新的堆栈元素将为123451234512345)。



3

一棵梨树,46字节ASCII,得分0,破解

输入来自标准输入。预期的输出(在标准输出上)是一个空字符串(即,当程序本身作为参数给出时,不应输出任何输出)。

换句话说,这里的挑战是编写一个A Pear Tree程序,当在标准输入上给定自身时,它不会在标准输出上输出任何内容;而在标准输入上给定其自身以外的内容时,则不会在标准输出上输出任何内容,不使用超过46个字节。(尽管A Pear Tree经常使用非ASCII和不可打印的字符,但我也设法将程序保持为可打印的ASCII。)这实际上是编写具有特定输出格式的自识别程序的任务。(即,当自我识别成功时为空字符串);但是,“一棵梨树”至少有两个转折点,这使任务比使用这种特定语言完成时看起来要困难得多(这就是为什么我在提交警察时选择它)。

我的解决方案

我的解决方案与破解有所不同:

eval(k=q(print$\=$_="eval(k=q($k))"ne$_;MZpa))

在线尝试!

如果不存在匹配,则不使用exit,而是将$_(隐式输出)和$\(输出后的换行,包括隐式输出)设置为null字符串(如果不存在,则设置为null 1)。print仍然需要A,因为仅当至少有一个字节的输入时才启用隐式输出(因此,如果给定一个空字符串作为输入,则需要显式打印某些内容,这与程序不同)。

每个“洋梨树”程序都需要在某处包含一个校验和(MZpa在此解决方案中就是这样)。为了使校验和完全由ASCII字母组成,我的解决方案和crack pick变量名称(以及其他一些次要的代码细节)都被使用。



3

Perl 5、10 -p0777个字节,得分10,安全

W)9r46<(k

这里的最后一个字符是“移出”,字符代码14(十进制)/ 0E(十六进制)。所有其他均为可打印ASCII。

因为我们使用Perl的隐式I / O参数-p0777,所以输入来自标准输入,而输出则进入标准输出。

该程序执行以下操作:

NUL填充输入至少10个字符,然后与字符串进行XOR svgOUT_TOP

这意味着程序本身(产生所需输出的唯一输入)是:

$ _ ^ = abc | $ ^

在线尝试!

说明

Perl有许多特殊用途的变量。例如,当-p0777用于隐式I / O时,$_在程序开始时输入,在程序结束时输出。

这些变量大多数具有非常简单的默认值。但是,$^当前选择的页面顶部格式的默认值是更长的string STDOUT_TOP。这样,我们可以通过将$^我们要混淆的值(在这种情况下为程序)进行异或运算,将其用作非常简洁的混淆方法。

为了最后隐藏故事_TOP,我通过添加来将程序本身填充为10个字符abc|,这意味着的所有字符都STDOUT_TOP将与某些内容进行XOR运算。一abc|开始的选择是一种使输出大部分可打印的简便方法(并且使我很难发现我正在对主要由大写字母组成的字符串进行XOR,因为在ASCII中,小写的XOR大写是小写)。


3

Python 3,50个字节已破解

输入/输出到标准输入/输出。每个不同的输入的输出都是不同的。给出源代码后的唯一输出:

218216195196222130136136132192197195196130241204136209197216206130201131244155157154215136138204197216138201138195196138195196218223222130131247131131

(150位数字)

祝好运!


哎呀!我现在看到这个挑战已经结束了……很奇怪,它出现在我的时间轴/提要中。好奇,看看是否有人响应这个...
agtoever



2

Cubix,18字节,得分18,安全

可惜的是,这个挑战没有得到更多的关注,但这就是有时候的方式。我本来会感到不安全,但决定在忘记之前发布解决方案。

这应该很容易破解。

输入来自stdin

输出量

$`*2aJPJ#74(o);89

编辑: 我应该提一下,这希望它的格式是短格式的。。。现在,我注意到我发布时中断的结果中缺少一个字节(无法打印)。现在应该复制出来。十六进制值为24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39

其概念是删除第一个字符的打印,然后从字符中删除反索引,例如[chars]-[0,len([chars]).. 2]

该代码是

$r;#AoW\U-@</u.?;;

映射到以下多维数据集

    $ r
    ; #
A o W \ U - @ <
/ u . ? ; ; . .
    . .
    . .

在这里尝试


2

果冻,14个字节,得分:21,安全

程序和输出大小均使用Jelly代码页进行计数。

输入值

第一个命令行参数。

输出量

-§ḋẇ"*YdĖDƘ>Ẉed€Ç+æạɦ

ØJiⱮÄÆNPḃØ⁵ịØJ

在线尝试!


由于很难从Jelly代码页进行转换,因此拥有一个验证程序(使用程序,将其从UTF8转换为Jelly,将其自身提供,从Jelly转换为UTF8,并检查其是否等于预期值将很有用)。输出)
user202729

@ user202729 ,如果将输入评估为果冻代码且输入的输入等于输入,则果冻程序v⁼将产生结果;1否则,将产生0或出错(如果输入是无效的果冻代码)。
乔纳森·艾伦

1

JavaScript Firefox,<10字节,得分:52,来自函数参数输入,已破解

ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ==


btoa

btoa(btoa) 编码以下字符串:

function btoa() {
    [native code]
}

这使:

"ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ=="

刚复制


首先,做完显而易见的事情之后,这不是实际的代码吗?其次,您不指定输入来自何处。我会发布一个破解,但老实说我不确定此提交是否有效。
Quintec '18


我认为没有必要在该帖子中包含该破解帖子,人们只需单击链接即可查看该破解。
user202729

1

GCC 61-> 61字节

70 4F 92 73 08 D4 03 E7 65 DC D6 89 B5 AD BA 90 
97 26 31 10 F6 FA 0A 30 8F 24 69 0A A7 8B 59 9E 
A2 42 D5 67 B8 12 3A 1E 9D 25 80 F9 6B 25 32 C2 
EE 46 3F 8D 7E 0C 73 0F F0 93 C6 68 50

完整的程序,从stdin输入并输出到stdout


那么,倒数第二个还有空格50吗?
tsh

@tsh这是一个十六进制转储
l4m2

1

Perl 6,43个字节,得分:15,来自stdin

49671296789805

2
仅检查一下,由于您先前的答案没有遵循程序的唯一输出作为输入的规则,您可以确认此提交吗?
Jo King

是的,我想是这样。
donaldh


1

Ĵ,26个字节,得分:52,安全

该程序不是REPL,而是接受stdin并显式打印到的完整脚本stdout

输入值

标准输入。

输出量

6fc42353c98217ef5a2908a3c63d090aa9a55b2558b61294e06a

不,这不是加密方法。


echo]hfd]257x#.3&u:stdin''
                   stdin'' Take the whole input
               3&u:        Convert to codepoints
         257x#.     Convert base 257 to integer
     hfd]           "Hex from Decimal"
echo]               Print to stdout

在线尝试!


1

小桶,6个字节,得分:6

输入值

来自stdin,使用?

输出量

5\x1c"\x1c"9

请注意,这些是不可打印字节的转义序列。用文字字符替换转义符。原始文本在这里

祝你好运!下周再见!


0

 Perl 6,31字节,得分:39,来自标准输入-破解

破解这里

().1111111111112222235abcegijkmnorstvy

粗溶液。可能生存。


我非常确定我破解了您的解决方案,并且怀疑您的程序没有遵循不同输入应产生不同输出的规则。
nwellnhof
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.