自分自身を削除するプログラム


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ファイルが必要でした。これはもっとゆるいです。
エンブレム14年

うーん...反対の方向で閉じることに投票したらどうなりますか?
ジョンドボラック14年

3
人気コンテストではなくコードゴルフ?ああ
ジャスティン14年

10
@Quincunx人気コンテストは信じていません。実際のコードは、その優雅さではなく、その正確さで最初に検証されます。
エンブレム14年

回答:


21

Bashスクリプト(7文字、7バイト)

rm "$0"

1
スクリプトファイル名にスペースが含まれている場合は機能しません。
user80551 14年

良い目!スクリプトを更新して、スペースが含まれるファイルを操作できるようにしました。さらに2文字だけ追加します。ありがとう!
anthony.c 14年

ファイル名に二重引用符が含まれている場合、これは機能しますか?
ジョンドヴォルザーク14年

1
@JanDvorak:はい。例えばでしょう実行することにより./the\"program./'the"program''./tha"program'。すべてが意図したとおりに機能します。(呼び出し時に引用符をエスケープするか、単一引用符で囲む必要があります。)改行などの名前を含むファイルでも動作します。
Runium 14年

1
@StéphaneGourichonおそらく「彼はバッチスクリプトではなくrm "$0"Bash シェルで実行しているからです」。:あなたはそうのようなヘッダを編集する必要があります# Bash script, 7 bytes
MD XF

15

Unix?(9):

#!/bin/rm

クラシック。rm即時の自己削除のために、インタープリターとして使用します。しかし、最短ではありません。


5
または、チートになりたい場合:0バイトのrmプログラム。
nyuszika7h 14

1
#!ラインは、スコアにはカウントされません。
パベル

@Phoenix:使用している言語に異常がある場合です。#!言語のデフォルトのインタープリターの名前をゼロとしてカウントする完全に標準的な行のみ。#!Bashに関する限り、これは非常に珍しい行です。(これが実際にBashで機能するわけではありませんが、機能する言語は他にもあります。)

1
これは実際にはBashプログラムではありません(明示的にを使用して実行した場合bash、何も削除されません)。UNIX / Linux実行可能ファイルです。(UNIXで#!行の処理をエミュレートするPerlでも機能し、ネイティブに実行できないプラットフォームでシェルスクリプトを実行するために使用できます。)

@Pavelうーん... 0バイト?
ɐɔıʇǝɥʇuʎs

10

バッチ-6バイト

Del %0

ものすごく単純。注:名前にスペースが含まれていても機能します。


ファイル名にスペースが含まれていない場合のみ。
イサイアメドウズ

@impinball、ごめん?
unclemeat

小さなバグを指摘するだけです。DOSを指定した場合、そうではありませんが、Windows(たとえば、Program Files)で簡単に壊れます。謝罪は必要ありません。
イサイアメドウズ

私の悪い...それは大丈夫です。この場合、引用符は自動的に含まれるため、引用符は必要ないことを忘れました。
イサイアメドウズ

すべて良い。チルダを追加すると、周囲の引用符が削除されます。%~0
unclemeat

9

ルビー、14文字

File.delete $0

$0 は、現在実行中のスクリプトの名前を含む特別なグローバル変数です。


スペースをドロップできると確信しています。
ダレンストーン14年

これが、質問のバージョンをより厳格にした理由です。通訳言語は問題なくそれを行うことができます。アイデアは、ネイティブに動作しているアプリケーションがちょうど自体の下から敷物を引き出すことができないということです
たけた

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__);
primo14年

4
このPHPプログラムは印刷しunlink(__FILE__);ます。ファイルは削除されません。
右折

1
@rightfold開始タグを含めると、説明どおりに機能します。開始タグを追加すると想定します
Darren H


3

Perl 5(8文字)

unlink$0

$0はスクリプト名であり、それをunlink削除します。通常、読みやすくするために、少なくとも間にスペースを追加します。



3

k(8)

~-1!.z.f

または14に相当するq:

hdel hsym .z.f

3

Python、18

open(__file__,'w')

書き込み専用モードで自身を開き、それ自体を消去します。


9
これにより、ファイルが切り捨てられます。削除しません。
右折



1

ジュリア、13バイト

rm(@__FILE__)

シンプル。しかし、もっと長い。:P


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

デモ注意:これは1回限りのデモです。初めて実行可能になります。質問の元のポスターにそれを予約してください。試すには、Executeボタンを押します。緑色の領域はエラーを報告しません。その後、Executeボタンをクリックするとnot foundエラーが発生します!


1

C、32バイト

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

1
欠落している}sはCで許可されますか?うわー!
電卓

いいえ、ただのタイプミスです!私のキャラクター数には終止符}が含まれていましたが、どうやらスニペットを間違ってコピー/ペーストしました。それを指摘してくれてありがとう!
ジョシュ

匿名の投票者はコメントを残したり投票を撤回したりする気がないので、回答を削除しました。することができますゴルフ29バイトに、このダウン:main(c,v)int**v;{remove(*v);}
MD XF

変更場合@MDXF私はわからないchar**にすることはint**技術的に有効です。アライメントの問題の可能性が心配です。
ジョシュ

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);} 

ほとんどの時間?
アディソンクランプ

1
未使用#include <string>を削除し、余分なスペースを削除し、このCを作成すると、intand を削除できるため、多くのバイトを節約できますreturn。さらに、宣言されている#include <stdio.h>場所でsprintfあるため、この作業を行う必要があります。
Mego

0

MATLAB、36バイト

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

Matlabのファイル名のガイドラインに従って、上記のコードをmファイルとして保存します。


0

VBA、69 67バイト

入力を受け取らず、自分自身を削除するサブルーチン。

以下のコードがアクティブなコードペインの最初の行であり、VBAがVBEプロジェクトモデルへのアクセスを信頼している必要があります。

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

交換用-2バイトActiveCodePaneととCodePane(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プロセッサを手に入れ、このプログラムをメモリに突っ込んで実行すると、実際に上書きされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.