自行删除的程序


22

如果使用编译语言,则程序必须删除编译后的可执行文件(但不必删除源文件)。如果使用解释语言,则程序必须删除源文件。

我的开标价:

Python(29个字符)

import os;os.remove(__file__)

编辑:为了防止类似rm -rf /的解决方案,该程序不得删除可执行文件或源文件以外的任何内容。

html,body{margin:0;padding:0;height:100%;overflow:hidden}
 <iframe src="https://xmikee1.github.io/ppcg-leaderboard/?id=19355" width="100%" height="100%" style="border:none;">Oops, your browser is too old to view this content! Please upgrade to a newer version of your browser that supports HTML5.</iframe>



2
@JanDvorak这个问题更加严格,需要一个.exe文件。这比较宽松。
EMBLEM 2014年

嗯...如果我投票反对相反的方向呢?
约翰·德沃夏克

3
代码高尔夫,而不是人气竞赛?w
贾斯汀2014年

10
@Quincunx我不相信人气竞赛。真正的代码不是首先通过其精美性而得到验证,而是通过其正确性进行验证。
EMBLEM 2014年

Answers:


21

Bash脚本(7个字符,7个字节)

rm "$0"

1
如果脚本文件名包含空格,则不起作用。
user80551 2014年

好眼睛!我已经更新了脚本以处理其中带有空格的文件。仅再添加两个字符。谢谢!
anthony.c 2014年

如果文件名包含双引号,是否可以使用?
John Dvorak 2014年

1
@JanDvorak:是的。通过执行,这将是例如./the\"program./'the"program''./tha"program'。所有工作均按预期进行。(在调用时,必须将引号转义或括在单引号中。)还将用于包含带有换行符等名称的文件
。– Runium,2014年

1
@StéphaneGourichon可能是因为他rm "$0"在Bash shell中而不是在批处理脚本中运行。您应该像这样编辑标题:# Bash script, 7 bytes
MD XF

15

Unix?(9):

#!/bin/rm

经典。用途rm作为翻译,即时自动删除。虽然不是最短。


5
或者,如果您想作弊:一个0字节的rm程序。
nyuszika7h 2014年

1
#!行不计入分数。
帕维尔

@Phoenix:这是否与您使用的语言不同寻常?仅#!给出语言默认解释器名称的完全标准的行数为零。#!就Bash而言,这是一条非常不寻常的路线。(尽管它可以在其他语言中使用,但这

1
这实际上不是Bash程序(如果使用显式运行它bash,它将不会删除任何内容)。它是UNIX / Linux可执行文件。(它还可以在Perl中工作,它可以模拟UNIX / Linux对#!行的处理,以便可以在无法本地执行的平台上运行

@Pavel Hmm ... 0个字节?
ɐɔıʇǝɥʇuʎs

10

批处理-6个字节

Del %0

很简单 注意:即使名称包含空格,该命令也可以使用。


仅当文件名没有空格时。
Isiah Meadows

@impinball,对不起?
2014年

只是指出一个小错误。如果指定DOS,则不会,但是在Windows中(例如在Program Files中),它很容易损坏。无需道歉。
伊西亚·梅多斯

我不好...没关系。我记错了在这种情况下不需要引号,因为引号会自动包含在其中。
伊西亚·梅多斯

都好。添加波浪号会删除周围的引号。%~0
2014年

9

Ruby,14个字符

File.delete $0

$0 是一个特殊的全局变量,其中包含当前正在运行的脚本的名称。


我很确定您可以放下空间。
达伦·斯通

这就是为什么我对问题的版本更加严格。口译语言可以毫无问题地做到这一点。这个想法是,本机运行的应用程序不能仅仅从自身下面抽出
毛刺

6

BASIC-80 / BASICA / GW-BASIC / IBM BASIC / Commodore 64 BASIC / Vintage BASIC / Commodore LCD BASIC / Atari BASIC *

5字节

1 NEW

好吧,就这么简单。NEW创建一个新程序,因此将其放在程序中的任何位置都会将其删除。

IBM BASIC的概念证明( NEW为清晰起见,请参见第40行):

*是的,我列出了所有我测试过的旧BASIC版本(或几乎使用过的版本)


2
+1,这有点诗意。存在甚至。
Wossname

5

PHP,17个字符

unlink(__FILE__);

6
我不确定为什么有人会对此表示否决;这是完全有效的。您可能要包括一个开放的标签,虽然<?unlink(__FILE__);
普里莫

4
该PHP程序打印unlink(__FILE__);。它不会删除文件。
rightfold

1
@rightfold如果您包含一个开始标记,它会按照描述的方式工作,我会假设要添加它
Darren H





3

Python,18岁

open(__file__,'w')

以只写模式打开自己,将自己擦除。


9
这将截断文件。它不会删除它。
2016年




1

Vitsy + bash,8个字节

iG' mr',

iG       Get the name of the use declaration at the top item (-1) (returns the current one)
  ' mr'  Concatenate "rm " to the front of it.
       , Execute via shell.


1

Lua,17个字节

os.remove(arg[0])

实际上,仅当您通过键入完整的文件路径来运行程序时,此方法才有效,即,假设文件名为,当前工作目录为,则
lua ~/Scripts/removeself.lua可以,但lua removeself.lua不可以。removeself.lua~/Scripts

据我所知,无法找到脚本的实际文件路径,只能找到传递给脚本的参数。我确实知道debug.getinfo(1).source,但是在我的测试中,该游戏的结果与arg[0]。如果有人知道找到文件路径的方法,请告诉我。



1

JS,37个字节

document.documentElement.innerHTML=""

这算吗?它杀死了页面上的javascript


你不需要围绕的空间=
programmer5000

1

tcl,18

file delete $argv0

演示注意:这只是一次演示!仅在第一次时它将可运行。请保留在问题的原始海报上。尝试:按Execute按钮。绿色区域不会报告任何错误。之后,任何随后单击该Execute按钮将导致not found错误!


1

C,32个字节

main(c,v)char**v;{remove(v[0]);}

1
}在C中允许缺少s吗?哇!
CalculatorFeline

不,只是一个错字!我的角色数包括结束符,}但是我显然不正确地复制/粘贴了该片段。感谢您指出!
乔什(Josh)

好吧,由于匿名下注者不想发表评论或撤回他们的投票,因此我删除了我的答案,该答案是基于你的。您可以将其压缩为29个字节:main(c,v)int**v;{remove(*v);}
MD XF

@MDXF我不知道,如果改变char**,以int**在技术上是有效的。我担心潜在的对齐问题。
乔什(Josh)

1
@乔希 它有效...所以我不明白为什么不这样。代码高尔夫是关于使用在技术上无效的可怕方法。
MD XF

1

JavaScript(ES6),13个字节

f=_=>delete f

试试吧

记录f,调用f(删除f)的来源,尝试f再次记录,但由于f现在未定义而引发错误。

f=_=>delete f
console.log(f)
f()
console.log(f)



0

朱莉娅-25个字节

将此写入文件,然后使用include("<filename here>")并包含该文件f()

f()=rm(functionloc(f)[1])

显然,这是一个函数-我不确定如何检测直接运行的文件的文件名(作为其中没有函数定义的include语句)。


0

C ++,137个字节。

大多数时间在Windows上工作

#include <stdlib.h> 
#include <string>
int main(int, char*v[]){char c[99];sprintf(c,"start cmd /C del \"%s\"/Q", *v);return system(c);}

C,90字节

void main(int n,char**v){char c[99];sprintf(c,"start cmd /C del \"%s\"/Q", *v);system(c);} 

大多数时候?
Addison Crump

1
您可以通过删除未使用的#include <string>,删除多余的空格并制作此C 来节省很多字节,这使您可以删除intreturn。另外,您需要#include <stdio.h>完成这项工作,因为这是在此处sprintf声明的。
Mego

0

MATLAB,36个字节

delete([mfilename('fullpath'),'.m'])

遵循Matlab的文件名准则,将以上代码另存为m文件。


0

VBA,69 67字节

子例程,不输入任何内容并自行删除。

要求下面的代码是活动代码窗格中的第一行,并且VBA具有对VBE Project模型的信任访问。

Sub a:Application.VBE.CodePanes(1).CodeModule.DeleteLines 1:End Sub

-2个字节,用于替换ActiveCodePaneCodePane(1)


0

T-SQL,28个字节

CREATE PROC d AS DROP PROC d

它只是在执行自身时删除/删除过程和代码。用法:

EXECUTE d

0

shortC,10个字节

Aremove(*@

怎么运行的:

A           main function
 remove(    delete file specified in next string
        *@  program name

等效的C程序:

int main(int argc, char **argv){remove(*argv);}

0

8086/8088机器码,1个字节

aa    stosb

假设:

  • 寄存器CS,IP,ES,DI和AL最初均为0。
  • 此代码位于地址0。

所述stosb指令存储在所述存储器位置AL寄存器指向的字节由ES和DI,然后递增或递减DI。在这种情况下,它将字节0存储在内存地址0,该地址恰好是指令本身所在的位置。

当然,该程序不会删除文件或任何东西。但是,如果您设法使用8086处理器,将该程序插入内存并运行,它实际上会覆盖自己。

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.