仅执行一次的代码


223

目标

这项挑战的目标是编写仅执行一次的代码。这基本上意味着它会以某种方式损坏程序,脚本或环境。如果重新引导系统,则允许代码再次运行。

计分

票数。所有假设必须清楚列出。仅启动重新启动或暂停的任何答案将被取消资格。

附加规则,因为格雷格·休吉尔(Greg Hewgill)是半神

不允许root访问。

结束日期

比赛将于2014年5月31日截止。

编辑

该比赛已更改为人气比赛。


7
@PeterTaylor一个可能的解决方案是自我删除,但结果表明它不是唯一的一个。
卢凯(Lukei)2014年

101
对于许多vi在单一终端环境中打电话的人来说,具有这种效果,除非您重新启动它,否则它不会逃脱:)这里只是个玩笑。
Orion

6
该网站免费为您提出这样的问题。
ojblass 2014年

16
echo "If you try to execute me again, it means you are an idiot.";<-没有人会执行不止一次:P
user3459110 2014年

25
导弹相关软件是否合格?;)
rsegal 2014年

Answers:


518

守夜

最后是Vigil的一个用例!

def main():
  raise Exception()

摘自“语言规范”:

不用说,任何引发未捕获异常的函数都是错误的,必须受到惩罚。

...

如果宣誓就职,违规功能将受到适当惩罚。

怎么样?

简单:它将从您的源代码中删除。

确保程序满足其要求的绝对方法是绝对禁止不这样做的代码。使用Vigil,它将自动为您完成此操作

还有其他方法可以执行此操作,因为Vigil提供了关键字imploreswear并且从根本上讲,誓言要遵守某些前提条件和条件:

def main():
  swear 0 > 1

116
毫无疑问,这是应该赢的。
Matteo Italia

77
最后,这是一种足够警惕的现代语言!我将开始在生产中使用它。必须清除所有错误。
克劳迪(Cluaudiu)2014年

13
在我看来,抛出未捕获的异常的功能不一定是错误,也可能是调用堆栈上的函数由于未能捕获异常而疏忽大意。它甚至可能表明整个应用程序的体系结构存在缺陷(因为也许不通过重组代码就无法正确处理该异常吗?)总之,应该删除整个程序。
乔纳森·普拉诺


32
咒骂的其他要点。无疑,需要删除做出虚假陈述的程序。
猎户座

293

几乎所有Linux发行版的9个字符

这是经典!

#!/bin/rm

将其放在文件中并运行:

> ed
a
#!/bin/rm
.
wq foo
> ls
Mail mbox foo
> chmod 777 foo
> ./foo
> ls
Mail mbox

Aaand消失了!

至于发生了什么:我真的在跑步rm#!被称为射棒。如果在脚本的第一行中放置了其中的一个,然后是某个可执行文件的路径,则程序加载器将使用您在其中编写的内容执行脚本文件-默认值通常为#!/bin/bash#!/bin/sh(Bourne-again shell / Bourne shell) 。传递给该脚本的第一个参数将是文件名本身(这就是为什么您在这里看到这么多解决方案(包括%0or $0等)的原因);因此,通过包含#!/bin/rm并运行文件,我要做的就是将文件名传递给rm


9
我自己从未使用过Linux,但我认为它会删除脚本文件。
2014年

56
@NateKerkhofs #!序列会启动一个shebang,它确定您将用于脚本的解释器-通常/bin/bash。在这里,Flonk被/bin/rm用作“解释器”。rm是一个删除文件的程序。因为Linux认为我们想rm成为解释器,所以它将文件名作为参数传递给它。因此,文件会自行删除

19
有点

25
@ user80551我不需要root访问权限。
弗隆克(Flonk)2014年

9
嗯..../foo mbox
2014年

241

x86二进制,4字节

F0 0F C7 C8

假设:必须在P5 Pentium CPU上运行。

上面的说明通常称为F00F错误。它试图执行一条以lock为前缀的无效指令。

这将使CPU完全冻结(既不停止也不重启),甚至不需要root访问权限。


4
哇...真有趣。
ojblass 2014年

31
@JackM:可以,但是在问题中明确允许。
丹尼斯

34
@JackM,这似乎是阻止“脚本”运行的好方法。
Paul Draper 2014年

5
我记得这个错误是在什么时候进行的。几乎立即发现了内核方面的解决方法-除非您运行的操作系统没有补丁,否则它不会使计算机崩溃。
zwol 2014年

3
@RosLuP显然有209个不同的用户。如果您不同意,请投下反对票并继续前进。
丹尼斯

150

重击5

>"$0"

将自身截断为零长度。

如果文件名不包含空格,>$0则可使用3个字符


2
实际上,由于shell解析规则中的特殊情况,即使在程序或程序的路径包含空格的情况下,在这样的重定向文件名中使用的变量也不需要引号。因此,您始终可以用3个字符完成它!
apenwarr 2014年

3
@apenwarr,它在没有引号且文件名包含空格的情况下显示“ $ 0:歧义重定向”

1
@apenwarr,如果解释该脚本的外壳基于ksh88或bash不在posix模式下,则需要使用该命令。这与空间无关,$IFS与bash的任何字符以及bash和ksh88的通配符有关。少she-bang的脚本通常由系统的sh解释,但是某些shell(包括bash和ksh88)将解释为它们自己的子级。
sch 2016年

144

gzip

#!/bin/gzip

以前习惯使用非破坏性命令行工具的人们大为烦恼,gzip默认情况下会破坏原始文件,而将其替换为压缩后的版本(添加后缀)。

这是该#!/bin/rm选项的一种变体,除了可以通过人工干预(调用gunzip)来恢复。作为特别的奖励,生成的文件比原始文件长得多(差异取决于文件名的长度)。

警告:的位置gzip可能有所不同。

编辑:正如WChargin所指出的,这更可移植:

#!/usr/bin/env gzip

文件的其余部分可以具有任何内容。从本质上讲,它是一个文件,被调用时会将自己隐藏在一个盒子中,直到您强行打开其包装后才肯出来。


7
我以前从没想过,但您绝对正确。
ojblass 2014年

非常有趣
Grijesh Chauhan 2014年

11
“警告:位置gzip可能有所不同” –这不是代码高尔夫,因此您可以使用#!/usr/bin/env gzip
wchargin

37
+1是为了It's essentially a file that, when called, hides itself in a box and refuses to come out until you forcibly unpack it.让您度过美好的一天,现在是凌晨1点。
2015年

从本质上讲,它是一个文件,被调用时会将自己隐藏在一个盒子中,直到您强行打开其包装后才肯出来。让我发笑。:D
Mischa

121

Bash,13岁12岁

不是最短的,但是它实际上并不会删除文件或使系统无法使用。

chmod 0 "$0"

如果文件名不包含空格,则可以删除引号以保存2个字符。

说明

它会rwx从自身中删除所有权限()。当您尝试运行它,甚至是第二次查看其代码而又没有手动还原权限时,它会说类似

bash: <FILENAME>: Permission denied

使用还原权限

chmod +rwx <FILENAME>

旧版本

仅删除执行许可权,但删除一个字符更长的时间(在更改为之前,这是一个问题):

chmod -x "$0"

ŁukaszNiemier的鬼nea版本

#!/bin/chmod 0

4
chmod 0也起作用
gnibbler 2014年

@gnibbler thnx,添加

我认为您可以调用该程序a并保存3个字符:chmod 0 a

@tohecz基本上是在作弊

5
更好#!/bin/chmod 0
Hauleth 2014年

112

6800机器代码-1个字节

0xDD

这称为HCF或“ 停火”


78
好的,规则说:“任何仅启动重新启动或暂停的答案都将被取消资格”,但这不只是启动暂停,因为它还会着火。因此,+ 1!
Trejkaz 2014年

94

Shell + sed,16字节

没有其他答案那么破坏性;-)

该脚本#在其每一行的开头插入一个注释:

sed -i s/^/#/ $0

3
怎么sed -i g $0
seshoumara

91

Commodore 64 BASIC

这个不会删除程序。

1 POKE 2048,1

自我毁灭

根据Commodore 64内存映射,address 2048未使用,但是它必须包含一个值,0以便BASIC程序可以运行。


1
戳是否只是将变量移到某个位置?
ojblass 2014年

12
@ojblass是的,有效。 poke a, b等效于C代码*((unsigned char *)a) = b;
Jules

4
我想以这种方式可视化我的FaceBook戳!
Sunny R Gupta 2014年

3
哇!我还记得C64 BASIC的PEEK和POKE!我在1977
。– Fixee

旁注:一个0字节用于标记代码行的结尾;因此地址0x800可能需要一个地址来标记第一行代码的开头。
泰特斯(Titus)


68

Python,18岁

open(__file__,'w')

通过以只写模式打开文件来截断文件。


14
万一您很认真,它会自行打开(__file__指的是它自己的文件名)。在w模式下打开会截断文件,基本上将其清除。
鲍勃

7
认为截断会在打开时发生,但无论Python运行时是否应在程序结束时刷新所有打开的文件,并且Python或OS将在进程结束时关闭它们。当然,通常最好在使用完后将打开的句柄关闭。
鲍勃

5
在Python中处理文件的“正确”方法是使用... er with。with open("myfile.txt","r") as thefile:然后您的文件处理代码将在完成后自动关闭文件。
Schilcote 2014年

1
这可以简化为open("f.py","w")
Ethan Bierlein 2015年

1
.pyc仍然存在,不会停止工作
minmaxavg 16-4-10

66

批次:5个字节

%0|%0

它基本上是Windows的前炸弹。

该应用程序开始其第一个参数两次。不要在生产环境中运行它;)


83
有生产性的Windows环境吗?(我当然是在开玩笑)。
猎户座

17
看起来很无辜!
ojblass 2014年

15
好的,绝对不要尝试。进行得不好。
rmobis 2014年

75
没有代表downvote,但它以最严重的方式违反了“仅运行一次”。
Xan

14
我相信人类只执行一次就可以了。
ojblass 2014年

54

的JavaScript

localStorage.x = eval(localStorage.x + localStorage.x)

首次运行时,它将运行良好:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
NaN

如果尝试运行更多(即使刷新),也会收到错误消息:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
ReferenceError: NaNNaN is not defined

5
因此,如果您多次运行它,您将获得“蝙蝠侠”主题。+1。
Hankrecords

2
@Hankrecords可悲的是,不是真的,因为这以后不会执行...
RedClover

@Soaku Bummer ...
Hankrecords

@Hankrecords除非您将其删除eval,否则它将无法应对这一挑战
RedClover

46

IBM的CMS操作系统是一个单用户操作系统,在IBM VM Hypervisor下作为来宾运行,它具有有趣的文件结构。

文件由三个元素组成,文件名,文件类型和文件模式。文件模式由两个元素组成,一个字母,为便于解释,可以将其视为类似于Windows / MS-DOS的驱动器号,另一个则包含一个数字。

单个数字的含义为http://publib.boulder.ibm.com/infocenter/zvm/v5r4/index.jsp?topic=/com.ibm.zvm.v54.dmsa3/hcsd0b10127.htm,并且对于此任务有趣的是数字3:

文件模式编号3
文件模式编号3表示在读取文件后将其删除。如果您不想在小型磁盘或SFS目录中维护副本,则可以使用文件模式3。

因此,请花费数小时编写脚本并将其归档为“ LOST FOREVER A3”。运行它,它将在第一次运行。出发回家,做得好。

注意,不会产生任何指示擦除的消息。毕竟,每个人都知道这3意味着什么,不是吗?

实际上,它当然非常有用。测试完成后,您可以3对临时文件使用,而不必在以后进行清理,因为它们是一次读取的文件。


44

Commodore 64 BASIC

0 NEW

NEW 删除程序。


1
那是做什么的
2014年

3
@ user973810,如果我还记得基本的话,那么new是用于清理内存的,因此它将删除程序
user902383

3
真好 并非特定于Commodore 64,它可能像80年代的几乎每台8位BASIC机器一样工作……
ysap 2014年

您也可以使用OLD或O。我刚开始学习12个月的12岁游戏天才;一次偶然地工作。然后不小心保存了而不是陈旧。O.不再工作了:(尽管我确实学习了十六进制编辑器的工作方式,但是却非常敏锐:)
Matt Warren

3
@ysap:如果使用1作为行号,它将更加可移植;不支持的所有基本的实现的行号为0。
celtschk

41

巴什(12)

注意:这是破坏性的。

:(){ :|:&};:

这是流行的bash前叉炸弹。它以指数方式吞噬了所有内存,并且PID锁定了系统。硬重启将允许代码再次运行,尽管您为什么要这样做?


重击10

:(){ :&};:

对于少两个字符,这会线性消耗您的内存。


巴什7

w;PATH=

w 被选为我能想到的最短的可执行文件。

这只是删除了path变量,因此外壳程序/usr/bin/w下次无法找到。重新启动外壳会修复它,因为路径通常存储在~/.profile



1
:(){ :&};:不应该吃掉你的记忆。一旦分叉,它就会停止,因此永远只有它O(1)活跃。完成后while(fork());,线性消耗您的内存就等于fork(); while(1);
marinus

26
哇!这些都是致命的表情!我最好不要叫我的电脑bignosed frownyface :(){ ....
级别圣河

1
如果我没记错的话……叉炸弹会定期打开一个PID。该脚本可以在该时间间隔内再次运行...如果不计入该费用,则可以花些力气杀死所有分支。重启是最简单的解决方案。
Brilliand 2014年

11
我认为这不符合要求。它不会使脚本无法再次运行,而是可以保证它再次运行(多次)。
Ben Voigt 2014年

20

C#

删除自我的最短代码

Process.Start(new ProcessStartInfo("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location + "\""));

在用户界面中使其不可见的代码

Process.Start( new ProcessStartInfo()
{
    Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location+"\"",
    WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, FileName = "cmd.exe"
});

7
最后,一个C#答案!
法拉普2014年

为什么需要选择?
wizzwizz4 2016年

19

C ++ 71

可执行文件“ golf”被拒绝下次运行。

#include <stdlib.h>
int main()
{
system("chmod a-x golf");
return 0;
}

具有控制台测试的JavaScript / HTML 137、145

<script id="s"> 
function h(){
console.log(1);
var s=document.getElementById("s");
h=s.innerHTML;
h=h.replace("h","g");
s.innerHTML=h;
}

11
@Templar在JavaScript的上下文中,我认为刷新页面算是重新启动(也许吗?)

2
即使您没有从页面中删除脚本,它也只会执行一次。这是没有意义的。
nderscore 2014年

2
@nderscore看起来该函数 h仅执行一次。您实际上必须从其他地方调用它(我想类似于运行程序)。说,<button onclick="h();">
鲍勃

4
鉴于允许重新加载页面,并且您的目标只是防止h加载后多次执行,这又有什么问题function h(){h=0}呢?
基恩(Keen)2014年

1
随着#include <sys/stat.h>您可以访问chmod直接功能,节省了相当多的字节(<stdlib.h>不再需要,也不是system)。另外,return不需要。
Ben Voigt 2014年

19

我的名字的外壳... PowerShell

经典的自我毁灭讯息:

@'
##################################
Project X is a go

Meet Eagle 1 at WP Alpha

Further comms is hereby prohibited
##################################
This message will self destruct in 
5 seconds
'@
5..1| %{$_;Sleep 1;}
"Goodbye"
rm $(.{$MyInvocation.ScriptName})

请解释一下
noɥʇʎԀʎzɐɹƆ

@noɥʇʎԀʎzɐɹƆ直到13行都是胡说八道。之后,PowerShell与其他任何Shell一样,将正在运行的脚本加载到内存中,因此不再需要原始脚本文件...因此它将自身删除。
SomeShinyObject


14

SH

#!/bin/sh
curl http://runonce.herokuapp.com/

即使您重新安装系统并再次放置脚本,它也只会运行一次(如果运行,它会显示“ Hello,world!”)。


编辑:我想我也会在runonce后面发布一个脚本。没什么特别的,因为它不应该以任何一种方式发布,但是无论如何。

<?php
$db = pg_connect("[connection information]");
$ip = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];

pg_query("DELETE FROM users WHERE time < now() - interval '1 day'");

$result = pg_query_params($db, "SELECT * FROM users WHERE ip = $1 LIMIT 1", array($ip));

if (!pg_fetch_row($result)) {
    echo "Hello, world!\n";
    pg_query_params($db, "INSERT INTO users (ip) VALUES ($1)", array($ip));
}

以及数据库架构

CREATE TABLE users (
    ip inet PRIMARY KEY,
    time timestamp with time zone NOT NULL DEFAULT now()
);
CREATE INDEX ON users (time);

数据存储在Heroku的数据库中,如果您愿意,可以随时检查其隐私政策。我不检查存储在数据库中的数据,其存储纯粹是为了让代码执行一次。


4
我认为这将运行多次,但在第一次运行后不会产生任何输出。
Brilliand 2014年

5
甚至没有一次向我显示“ Hello World”。
圣保罗Ebermann

1
@StéphaneGourichon:是的,它会记住IP,并且在自动删除之前无法删除IP。我决定放置源代码,以便您可以检查它的作用。
Konrad Borowski

1
@StéphaneGourichon:pg_query_params几乎可以防止SQL注入。但是,它不会被保存,因为'; DROP TABLE users;--它不是有效的IP(inet仅接受IP),因此,如果您使用的是假X-Forwarded-For标头,则不会保存您的访问。我自己也不认为这是一个问题。
Konrad Borowski

2
我认为这违反了一个标准漏洞:外包真正的答案
juniorRubyist

12

PHP,22 20个字符

<?=unlink(__FILE__);

编辑:删除每个注释末尾的两个字符。


2
这可以进一步简化为:<?unlink(__FILE__);?>不需要尾随
leepowers

您必须从头开始,<?=否则无法识别开始标签。
Michael Mior 2014年

2
PHP自毁...哈!E_NOTICE第3048行
metadings 2014年

<?+空格也可以。您不能在短标签后使用字母。
泰特斯

11

红宝石,14

它将源代码重写为程序的名称。

IO.write $0,$0

3
如果程序名为“ IO.write $ 0,$ 0”,该怎么办?“假设:以任何语言将程序命名为无效代码。”
Brilliand

@Brilland一个ruby程序应该始终以结尾,.rb即使它的名称是“ IO.write $ 0,$ 0#.rb”,它也不起作用,因为编写时会包含完整路径。
Mhmd 2014年

3
@Mhmd红宝石程序可以以任何结尾。例如gemirb是没有扩展名的Ruby程序。
bfontaine 2014年

@bfontaine有shebangs。不是这样
wizzwizz4 2016年

@ wizzwizz4 Shebangs与扩展名无关。不管有没有shebang ruby foo,它ruby foo.rb都可以工作。./foo并且./foo.rb(假设它们是可执行文件)都将在没有shebang的情况下失败,并且会成功(假设正确的代码等)。
bfontaine


10

重击9 8个字符

nc -l 1&

仅会运行一次,因为端口将永远被阻塞。


1
我认为这是行不通的,因为这0是一个特殊的端口(保留)。当我在计算机上运行此程序时,可以多次打开它。另外,它是一个port < 1024,这意味着它需要root访问才能被监听。
heinrich5991 2014年

nc -l 1&0因为不需要最后一个空格,所以可以解决该问题并缩短一个字节。
kasperd 2014年

@kasperd感谢您的输入:-)
Falco

@ heinrich5991好的-比起使用root,我需要11个字符而不具有root访问权限
Falco

关心解释你为什么投票?
Falco 2014年

9

NodeJS-33字节

require('fs').unlink(__filename);

您能描述一下这对不熟悉该语言的人的作用吗?
凯尔·坎诺斯

1
@KyleKanos它获取文件系统模块fs和当前文件名,__filename并从文件系统中删除该文件名。
肯(Keen)2014年

7
您可以省略分号,因为它们在JavaScript中是可选的。
2014年

8

批次,7个字符

尝试之前,请保存未保存的工作。

假定64位系统或32位系统具有小于2 GB的RAM内存。必须在启动前保存到.bat或.cmd文件,仅在cmd.exe中输入该文件将不起作用。

^ nul<^

它消耗了完整的CPU内核,并以每秒数百兆字节的速度填充您的RAM内存。如果不及时停止运行(任务管理器),它将消耗计算机上每个字节的RAM,整个系统将死机,并且您将无法通过强制切断并重新启动计算机来执行任何操作电源或按住电源按钮不放。

所有的学分都可以在StackOverflow上的txtechhelp上找到,在这里查看更多信息:https ://stackoverflow.com/q/23284131/1955334


这怎么可能?那分页呢?流程优先级?
Nicolas Barbulesco 2014年

我运行了此脚本,没有任何反应。
Pavel

@Pavel我猜想它已经在Windows 10中修复了。我无法在Windows 10上重现它,但在Windows 8.1上可以使用。
bilde2910 '12

1
“它消耗了完整的CPU内核,并以每秒几百兆的速度填充RAM内存。如果不及时停止(任务管理器),它将消耗计算机,整个系统中的每个字节RAM。将冻结,并且您将无法通过断电或按住电源按钮的方式强行关闭计算机并重新启动计算机。” 听起来像一个恐怖故事电脑...
noɥʇʎԀʎzɐɹƆ

7

这是一对 与许多不同,它们不是破坏性的,只是创造性和非正统的。

重击

#!/usr/bin/env bash
read <<< ''
printf "$REPLY" > "$0"

这很简单。变量$REPLY是由隐式创建的read,但用一个空的HereString填充。然后printf将该空字符串添加到当前脚本中。它与以下内容相当混淆:

#!/usr/bin/env bash
cat <<< '' > "$0" # probably a lot more portable

Windows批处理

copy con %0 < nul

第二个基本上将控制台输入(从中读取)复制nul到当前文件中。


发布后,这成为一个人气竞赛
伊塞亚草甸

1
没有root权限,第一个将无法工作。您为什么要更换空设备?当以root用户身份运行时,这实际上会使系统行为异常。您在写入null时也会覆盖它们:)为什么不将其移动到其他位置?例如mv“ $ 0”“ $ {0} x”之类的?它应该可以解决问题。
Orion 2014年

之后文件仍然存在吗?
伊西亚·梅多斯

我现在完全改变了Bash示例。
伊西亚·梅多斯

这些怎么不会造成破坏?
ysap 2014年

7

辛克莱·巴斯

10 POKE 23635,255

将BASIC程序在内存中的地址从应有的位置移开(203),以便解释器发现错误的数据。


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.