我们忘记了什么?


31

您的任务是编写一个由一些字节序列组成的非空计算机程序。如果我们在程序中选择一个特定的字节并将其所有实例从程序中删除,则修改后的程序应输出删除的字节。

例如,如果我们的程序是

aabacba

然后bcb将输出aaaaca将需要输出b并且aababa将输出c

未经修改的程序做什么无关紧要。

答案将以字节计分,目标是最大程度地减少字节数。


4
由于此挑战不是quine标签,我们可以阅读自己的源代码吗?
丹尼斯

1
@丹尼斯 成为我的客人
Wheat

2
如果程序中的所有字节都代表数字,是否可以通过退出代码输出?
Xcoder先生18年

15
我认为这是更好的代码挑战,因为您必须最大化使用的离散字符数量。
Notts90 '18

2
应该指定超过1个字节,而不是非空的:P。或Notts90所说的。
魔术章鱼缸

Answers:


70

zsh的,603个 594 566 561 548 440 415 399 378 370字节

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

取决于coreutils + dc

在线尝试!

那是一次旅程。

这个答案分为三个部分。前4行处理某些特殊情况,以简化随后的代码。接下来的2行和最后一行基本上都完成了相同的操作,但是在除去任何给定字符的情况下,仅运行了一行。它们是用大多数互补的字符集编写的,因此删除任何字符最多只会破坏一个字符,从而使另一个字符继续起作用。

看第一部分,我们先处理

  • 换行符 ec\nho \\n
  • 空格删除ca t<<<$'\x20'(其后exi t为避免运行以后的代码,这将导致多余的输出)
  • $d$c -e8BC6P8BC6= 922636*256 + 10,和36和10分别是$和和换行符的字节值;使用十进制的十六进制数字来避免必须将它们包括在第6行的大注释中)
  • 0d0c -eKpK进行删除)获取小数精度,0默认情况下为

在下一部分中,除了第二行末尾的垃圾外,其余唯一的字符是$'\01234567v;,空格和换行符。其中,已经考虑了四个,因此其余('\1234567v)不能出现在最后一行。扩展八进制转义$'\123'符(表示值为123 8的ASCII字符),我们得到:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

第一行循环遍历程序中使用的所有字符,并在其自己的源代码($0正在运行的脚本的文件名)中搜索每个字符,并打印未找到的任何字符。

第二行看起来有些奇怪,并且看起来exit和一堆点子一样。但是,编码exit为八进制会直接导致$'\145\170\151\164',其中不包含23。我们实际上需要使它对清除的适应性降低。这是因为,如果'\014567v删除了其中任何一个,则中断第一行,第二行也中断,从而允许其余代码执行。但是,我们需要它也要断开2或断开,3以便3和4行可以运行。这可以通过在:和中的鞋拔来实现;,它们的八进制表示分别为2和3。

第2行末尾的垃圾只是在那里,以确保每个可打印的ASCII字符至少出现一次,因为通过遍历每个字符进行检查的方式需要这样做。

如果exit在第一部分中未调用(即已通过删除其中一个进行了修改'\01234567v),则继续进行第二部分,在第二部分中,我们必须完成相同的操作而不使用任何这些字符。最后一行与解码后的第一行相似,不同之处在于我们可以缩小循环范围以节省一些字节,因为我们已经知道除以外的所有字符'\01234567v都已被覆盖。它也有0# $#在它之前,该评论出来并防止其产生,如果无关的输出0$除去。


5
哇,考虑到涉及到的不同角色数量,这真是令人印象深刻!绝对期待看到这种解释。
凯文·克鲁伊森

3
@KevinCruijssen在这里,你去:)
门把手

1
@Doorknob如果这不能为您赢得548个互联网,我不知道是什么。老实说,603字节的版本同样令人印象深刻!
Magic Octopus Urn

3
到目前为止唯一有趣的答案。
htmlcoderexe

21

视网膜,1个字节

1

在线尝试!

1删除单个字节()的所有实例后,输出为1。很简单。


6
我正在浏览TIO来找到类似的内容-您击败了我。顺便说一句,这是一个多语言的语言,可与蜗牛一起使用
JayCe

IMO,这个答案应该升级为一个多语言答案,作为第一个答案(可能带有永远不完整的语言列表),而其他两个则被淘汰。哦,这C语言中适用

@Rogem我不确定“这在C语言中有效”的含义。你有一个C编译器1为空程序输出吗?无论如何,我认为所讨论的答案使用了不同的方法和行为。IMO仅在方法保持相同的情况下才有多语种答案。(客观地讲,这不是多语言的,因为下面的答案与实际代码有所不同。)可以随意投票选择想要的方式,但是有效的答案是有效的答案。我将按原样保留我的答案,我不希望在上面存储答案。
科纳·奥布莱恩

11

语言,216173027061157310字节

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2。有216173027061157310 - 144115617572598740 $s,216173027061157310 - 144115241762960340 #s和216173027061157310 - 144115194786755540空格。

144115617572598740 #s和空格编码以下BF程序:

++++++[>++++++<-]>.

在线尝试!

144115241762960340 $s和空格编码以下BF程序:

+++++++[>+++++<-]>.

在线尝试!

144115194786755540 $s和#s编码以下BF程序:

++++++++[>++++<-]>.

在线尝试!

编辑:由于@Nitrodon,节省了72057832274401770字节。


为什么不使用U字节127?在线尝试!甚至只是nul字节和soh?
Jo King

@JoKing我不知道 U是可以输出的最短可打印ASCII字节。我不想使用不可打印的字节。
尼尔

即使不利用包装单元格或无法打印的字符的优势,也可以通过将空格字符作为第三个不同的字节包括在内,将其减少到216173027061157310字节。
Nitrodon

7
我不禁因为给予好评“编辑:保存72057832274401770字节......”
利斯特先生


9

英文*,1字节(等待确认

0

在线尝试!(使用三角关系)

*:这适用于(相当广泛的)多种语言(除了像4,> <>之类的esolangs以及其他一些例外)。与源代码中的Jelly答案相同,但是I / O的方法不同–输出是通过退出代码进行的。当0从源代码中删除一个代码时,他们将得到一个空程序,该程序通常不会出错,并且在大多数语言中会产生退出代码0



3

一元(非竞争性),96个字节

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

这是xxd转储。

一元语言的更广泛定义允许其源代码中包含任何字符。但是我没有找到可以使用的编译器或解释器。因此,我将此答案标记为非竞争性。如果您能找到一个在问这个问题之前发布的内容,我会链接到它。


4
这是我见过的最小的一元程序。
Draco18s
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.