错误404:找不到字符


74

情境

您的一位朋友正在为家庭作业而苦苦挣扎。他需要一个简单的程序来打印前404个自然数:

1 2 3 4 5 6 7 8 9 10 11 ... 401 402 403 404

您的挑战很简单:为他编写此程序。

但是,您的连接很糟糕,因此每次发送程序时都会丢失1个随机字符。为防止这种情况破坏您的程序,您必须使它删除任何单个字符不会起作用:无论如何,程序都可以工作。(原始程序也必须工作。)

由于连接太差而无法发送大文件,因此您的代码必须尽可能短。

TL:DR-制作防辐射程序以输出数字1至404


规则/细节

  • 输出可以是任何合理格式的整数列表(由空格,换行符,逗号等分隔)。但是,您的输出必须一致,并且在修改程序时不能更改。
  • 禁止包含逻辑,执行实际代码,生成号码列表等的命令行标志。
  • 这是,因此最短的提交(以字节为单位)获胜!


16
原始程序(不删除任何字符)是否也需要工作?
阿德南

5
如果程序仍然打印1-404,是否可以忽略错误?
jrich

4
也许应该有防辐射标签?
六。

5
投票结束,我们不会为您做功课XD
チーズパン

Answers:


16

05AB1E,12个字节

码:

XX440044ÔÔŸŸ

正常代码说明:

X             # Pushes the number 1.
 X            # Pushes the number 1 again.
  440044      # Pushes the number 440044.
        Ô     # Connected uniquify.
         Ô    # Connected uniquify.
          Ÿ   # Inclusive range of the top two elements.
           Ÿ  # Inclusive range on the array, which leaves it intact.

这导致了下面的优化代码:X404Ÿ,这是我们想要实现的。

数字404由以下任何一种变体生成:

440044ÔÔ
40044ÔÔ
44044ÔÔ
44004ÔÔ
440044Ô

包含范围在两个数字上的含义如下:

`1 5Ÿ`             ->    [1, 2, 3, 4, 5]
[1, 5]Ÿ            ->    [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]Ÿ   ->    [1, 2, 3, 4, 5]

这总是让第二Ÿ一个空操作

使用CP-1252编码。在线尝试!


34

JavaScript,228个字节

etInterval=stInterval=seInterval=setnterval=setIterval=setInerval=setIntrval=setInteval=setInteral=setIntervl=setInterva=top=>4

setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`
setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`

说明

setInterval即使有错误,也可以通过评估a中的代码来继续执行程序。如果删除任何单个字符,我们确保传递的代码将出错。模板字符串语法可能会被滥用,以setInterval不带括号的常量字符串进行调用。幸运的是,即使模板字符串在下一行,它仍会解析为具有这种语法的函数调用。

我们遇到的第一个问题setInterval是函数,因此,如果删除了一个字符而程序尝试调用setInteval它,则会出错。当然,由于有两个相同的调用,setInterval只要我们避免该错误,我们就不必担心它的实际功能是否正确。因此,第一行定义了setTimeout对有效函数的所有可能的“拼写错误” 。

第一行通过将所有这些“拼写错误”分配给函数来工作top=>4。请注意ES6语法,这只需要一个名为“ top”的参数并返回4。为什么是“ top”?好吧,即使删除了字符,第一行也绝不能抛出错误。如果=删除了make top>4,则此布尔表达式将是有效的,因为它top是在浏览器中预定义的,只是yield false。如果删除了4,则功能主体将简单地成为第一个setInterval段,而第二个段则不受损害。

现在,唯一需要担心的是是否删除了`。

如果从一开始就将其删除,则setInterval只会执行任何操作,并将其作为自己的表达式求值。然后,第二行的其余部分仅运行循环的一次迭代,让另一个setInterval片段完成工作。如果从末尾删除,则从注释末尾提取剩余的反勾号。

放置换行符是为了使删除行不会影响程序行为,但是在某些字符删除(例如前导反引号)的情况下,它们可以防止错误。


3
我思考如果405删除a 中的一个数字会破坏什么,但是后来我意识到:什么也没有,因为要么所有404数字都已经打印过,要么第二个循环将打印丢失的数字。出色的工作。
ETHproductions 2016年

如果部分“ top”丢失了怎么办?
Scimonster

@Scimonster它仍然解析为一个函数,返回4,只是带有未使用的名为“ to”或“ op”或“ tp”的参数
jrich,2016年

1
@jrich当然。脑痉挛。:P
Scimonster,2013年

如果您输了一部分会this怎样?
dkudriavtsev

25

Pyth-16个字节

这背后的基本思想是,当您从取下一位数字时404,它只会使数字更小,因此我们只需要取两个最大值404即可确保我们拥有正确的数字。显然,还有很多冗余。

SSsetSS[404  404

说明:

SS                       First one does 1-index range, second one sorts, which is no-op 
 s                       If the e is there, this is no-op, if only t is there, it sums a one element list, which is the item
  et                     e picks last element in list, and if e is gone, then t gets you the list without the first element which is good enough when combined with s
   SS                    Sorting twice is no-op
    [                    Start list, this can't be two element because if we get rid of initial 4, the 0 becomes third element which neeeds to be captured
     404                 One of the 404's
     <space><space>404   Need two spaces for redundancy, because 404404 *is* bigger than 404

在这里在线尝试


23

Befunge-98,37个字节

20020xx##;;11++::''ee44**``kk@@::..;;

在线尝试!

说明

在Befunge-98中制作经过防辐射处理的代码不错,因为您可以使用手动设置“增量”(即指令指针的步长)x。因此,如果将delta设置为(2,0),从那时起,将跳过所有其他字符,我们可以简单地将所有命令加倍。棘手的事情是以2 0可靠的方式进入堆栈的顶部。实际上0 2 0,我们需要其余的程序才能正常工作,但是我们将免费提供该程序。这是我们的操作方式:

20020xx

请注意,每个数字都按自己,所以在完整程序中,会有一个开始2 0,我们将忽略它。

因此,从程序中删除第一个或第二个字符是无关紧要的,因为我们还是不会使用这些数字。同样,删除第三个字符与删除第二个字符相同,因此我们也不必为此担心。

让我们考虑一下其他两种情况。删除第四个字符:

2000xx

注意,增量设置为(0,0)。但这根本不会移动指令指针,因此x立即再次执行相同的指令,这一次将弹出(2,0)并且一切都很好(在堆栈底部有隐含的零,以供以后使用)。

让我们删除第五个字符:

2002xx

现在,增量设置为(0,2)。但是,仍然没有水平移动,因此IP立即回绕x并再次设置正确的增量。

从这一点开始,我们基本上可以忽略字符重复以及最初的部分,因为它将始终被跳过:

...#;1+:'e4*`k@:.;

;是一种注释命令,它会跳过所有内容,直到;遇到下一个命令为止。但是,我们跳过了第一个;#因此;从该点开始将仅执行之间的部分。

1+    Increment the top of the stack.
:     Duplicate it.
'e    Push 101.
4*    Multiply by 4 to get 404.
`     Greater-than check. Pushes 1 once the top
      reaches 405, otherwise 0.
k@    Terminate the program that many times.
:.    Print a copy of the top of the stack (and a space).

16

> <>103 60 51字节

               vv
;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

在这里测试。

使用与该程序相同的策略。如果在第一行中删除了字符,则第二行仍将运行。如果第二行中的字符被删除,则v由于第二行中的字符较短,因此将执行移至第三行。第三行的删除对程序控制没有影响,因为它仅在第二行的删除之后执行。

如果删除换行符,该程序也将起作用:

情况1:

第二行将运行。

               vv;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

情况2:

这两行变成一条带有两次指令的行。

               vv
;?=*4o" e"n:ll<<;?=*4o" e"n:ll<<

说明:

该程序的核心如下。请注意,1第一行已经将a 压入堆栈。

ll:n        Push length of the stack twice, duplicate, print as number
"e "o       Push 101, 32, output 32 as space
4*          101 * 4 is 404
=?;         Pop twice, if equal, halt
            (Execution wraps around)

你可以用o" e"吗?
Martin Ender

而不是+1您可以使用l。fishlanguage.com解释器也有点怪(虽然调试功能当然有用,但使用起来很烦人)。我认为TIO使用的Python解释器要好
Martin Ender

@MartinEnder如果您删除1第一行中的s,那将不起作用 。
mbomb007 '16

嗯,是的,无论如何我还是很困扰:tio.run/nexus/fish#@q@ACsrKuKztAbPVMslXUkhVysnLybGxwRD4/x8A
Martin Ender

12

> <>42 38 34字节

在线尝试!

感谢@Martin Ender@Teal Pelican削减了8个字节!

<<;?=*4o" e"lnll/
 ;?=*4o" e"lnll<

类似于mbomb007的答案,但仅使用2行。

而不是使用单个内存值从1递增到404,而是连续增加堆栈的长度。这样可以避免在循环开始之前将任何东西放在堆栈上,从而使事情变得容易得多。

原始代码

<轮到的IP左右,而该/是一个空操作,因为IP环绕,并继续沿着它的正常路径。因此,相关代码为:

          lnll   Prints the size of the stack + 1 and pushes the stack size twice
     o" e"       Prints a space and pushes 101
   *4            Multiplies to get 404
;?=              If the number we just printed was 404, end the program

重复一遍。

删除

这里最大的关键是镜子/。如果修改了第二行,它什么也没做-只是绕回自身,本质上是无操作的。但是,如果删除了第一行中的字符,则该行将向下移动,以使镜像击中箭头<,从而导致相同的,未修改的循环。

唯一的其他重要删除将是\n字符。由于产生了以下代码,因此也要考虑到这一点:

<<;?=*4o" e"lnll/ ;?)*4o" e"lnll<

现在,我们刚刚将原始循环的副本附加;?=*4o" e"lnll到其自身。由于这是一个循环,因此它对执行没有影响,并且就像没有任何更改一样运行。


1
将其减少到2行的一种非常不错的方法。我能看到的唯一问题是它不是38个字节而是42个?简化内部代码;;?= * 4o“ e”:n:+ 1l会将其减少到38个字节。这只是将您的84 *放在字符串“ e”中而不是分开。
蓝绿色鹈鹕

1
您也可以更换:+1:用一个l每个。
Martin Ender

是的,谢谢你们!
MildlyMilquetoast

;?=*4o" e"n:ll也可以。
mbomb007 '16

11

梨树,34字节

该程序包含控制字符,因此这里是xxd转储:

00000000: 7072 696e 7420 312e 2e34 3034 2327 108a  print 1..404#'..
00000010: af70 7269 6e74 2031 2e2e 3430 3423 2710  .print 1..404#'.
00000020: 8aaf                                     ..

梨树基本上是Perl派生的,具有一些“有趣的”功能。我开玩笑地把它拼在一起(这样我可以说我的多语言印刷a partridge在《梨树》上;实际上,几乎所有程序都这样做)。但是,这是图灵完备的,并且实际上有点擅长于此类挑战。

我们在这里最关心的功能是,如果代码的某些子字符串的CRC-32为,则“梨树”将仅运行程序00000000。旋转代码以将有问题的子字符串放在开头。碰巧的是,代码的两个(相同的)两半各有问题的CRC-32(由于末尾有看起来可疑的二进制注释),因此,如果您从源中删除一个字符(破坏了CRC),另一半旋转到起点,#靠近终点的符号将注释损坏的另一半,此外还有二进制垃圾。

另一个功能使程序变小:尽管A Pear Tree通常被解释为Perl,但是它做了一些细微的更改以使其更像Python。与Perl的print声明(只是将数字一起运行)不同,这里的一个相关之处是Pear Tree的print声明用空格分隔参数并打印最终换行符。这给了我们很好的空格分隔输出,这意味着我们不必在格式化上浪费字节。(请注意,您不必为程序提供任何输入;如果该语言接收到输入,则默认情况下它将假定它应该对此进行处理。)

当然,这不能与实际的高尔夫语言竞争(我也不希望如此),但是我认为人们可能会发现它很有趣。


9

Befunge 98,34个字节

在线尝试!

<<.:@k`*4e':+1[

2.:@k`*4e':+1<^^j

这与我的> <>答案非常相似,但是/我使用了“向左转”操作[,然后反转IP方向,而不是使用镜像,在这种情况下,其功能等效于镜像。

原始代码

<<                 Reverses code direction, sending IP to right
               [   Turns the IP left, into the ^, which reverses it.
                   It then hits this again, turning left to go West. (No-op)
            :+1    Adds 1 to the sum
        *4e'       Pushes 404
     @k`           Ends the program if (sum > 404)
   .:              Prints the sum

删除

如果第二行中的内容被删除,它将移过来,完全不影响顶部。

如果删除第一行中的任何内容,[则会将IP发送到<,这将启动一个相同的循环(但唯一的情况是2j^^避免与^串联使用[

因为有两行新行,所以如果删除一行,则对代码没有影响(为此感谢@ masterX244!)


代码中的空行会发生什么?也许您也可以将换行符加倍以使其具有免疫性
masterX244 '16

您完全正确@ masterX244谢谢!没想到。
MildlyMilquetoast

大声笑,根本没有使用过这种语言,但由于某种原因,第六感使我
有了

5

Befunge-93,54 51个字节的

感谢Mistah Figgins为我节省了3个字节。

111111111111111vv
+1_@#-*4"e":.:<<
+1_@#-*4"e":.:<<

在线尝试!

这基本上与“ Hello World容错”挑战中使用的技巧相同。第一行首先确保在堆栈的顶部有一个1作为该序列的开始,然后v该行末尾的一个箭头将代码路径重定向到第2行的主例程的开始,从右到左执行。

从第一行中删除一个字符只会使v箭头向左移动一个,但这仍然允许代码成功重定向到第二行。从第二行删除一个字符会导致该行<末尾的箭头移出其v上方的路径,因此代码路径将被重定向到第3行的备份例程。

删除第一行换行符没有什么害处,因为这只是将第三行移到适当位置以替换第二行。在第二行末尾删除任何内容都将无效,因为那只是备份代码。


The first line starts by making sure there is a 1 on the top of the stack...第一行在这方面很确定。另外,您可以缩短<code> _ @#!</code> to _ @#-`并在打印之前将其保存3个字节。
MildlyMilquetoast,2016年

5

JavaScript + HTML +堆栈代码段, 167 158 154字节

滥用Stack Snippets中的JavaScript放在<script>元素内的网页中的事实。

or(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)</script></script><script>for(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)


@ Flp.Tkc已修复。
user2428118 '16

4

其实是18个位元组

:404::404kMkMMRRSS

实际上是一种基于堆栈的高尔夫语言。

所涉及命令的说明(因为它们在上述上下文中有效):

Numbers are indicated by round brackets () and lists by square brackets []

:         - pushes the longest string of characters in '0123456789+-.ij' as a numeric
k         - pop all the elements on the stack into a list [l] and push [l]
M         - pop [l], push max([l])
            pop (a), push (a)
R         - pop [l], push reverse([l])
            pop (a), push range([1,a])
S         - pop [a], push sorted([a])
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.