Program yang menghapus dirinya sendiri

22

Jika bahasa yang dikompilasi digunakan, program harus menghapus executable yang dikompilasi (tetapi tidak perlu menghapus file sumber). Jika bahasa yang ditafsirkan digunakan, program harus menghapus file sumber.

Tawaran pembuka saya:

Python (29 karakter)

import os;os.remove(__file__)

Sunting: untuk mencegah solusi seperti rm -rf / , program tidak boleh menghapus apa pun kecuali file yang dapat dieksekusi atau sumber.

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>

LAMBANG
sumber
kemungkinan rangkap dari Tulis program yang menghapus dirinya sendiri
John Dvorak
2
@ JanDvorak Pertanyaan itu lebih ketat, membutuhkan file .exe. Ini lebih longgar.
EMBLEM
Hmm ... bagaimana jika saya memilih untuk menutup ke arah yang berlawanan, lalu?
John Dvorak
3
golf kode, bukan kontes popularitas ? Aww.
Justin
10
@ Quincunx Saya tidak percaya pada kontes popularitas. Kode asli tidak pertama divalidasi pada keanggunannya, tetapi kebenarannya.
EMBLEM

Jawaban:

21

Skrip Bash (7 karakter, 7 byte)

rm "$0"
anthony.c
sumber
1
Tidak berfungsi jika nama file skrip berisi spasi.
user80551
Mata yang bagus! Saya telah memperbarui skrip untuk bekerja dengan file dengan spasi di dalamnya. Hanya menambahkan dua karakter lagi. Terima kasih!
anthony.c
Apakah ini berfungsi jika nama file berisi tanda kutip ganda?
John Dvorak
1
@ JanDvorak: Ya. Dengan eksekusi yang akan misalnya ./the\"program, ./'the"program', './tha"program'. Semua berfungsi sebagaimana dimaksud. (Kutipan perlu diloloskan atau dilampirkan dalam tanda kutip tunggal pada panggilan.) Juga akan bekerja pada file yang berisi nama dengan baris baru dll.
Runium
1
@ StéphaneGourichon Mungkin karena dia berjalan rm "$0"di shell Bash alih-alih dalam skrip batch . Anda harus mengedit tajuknya seperti ini:# Bash script, 7 bytes
MD XF
15

Unix? (9):

#!/bin/rm

Sebuah klasik. Digunakan rmsebagai penerjemah, untuk penghapusan diri secara instan. Bukan yang terpendek sekalipun.

ɐɔıʇǝɥʇu
sumber
5
Atau jika Anda ingin curang: program 0-byte rm.
nyuszika7h
1
The #!garis tidak dihitung dalam skor.
Pavel
@Phoenix: Itu jika tidak biasa untuk bahasa yang Anda gunakan; hanya #!garis yang sepenuhnya standar yang hanya memberi nama jumlah penerjemah default bahasa sebagai nol. Ini adalah garis yang sangat tidak biasa #!sejauh Bash pergi. (Bukannya ini benar-benar berfungsi di Bash, meskipun ada bahasa lain di mana ia bekerja.)
1
Ini sebenarnya bukan program Bash (jika Anda menjalankannya secara eksplisit bash, ia tidak akan menghapus apa pun). Ini adalah UNIX / Linux yang dapat dieksekusi. (Ini juga bekerja di Perl, yang mengemulasi penanganan #!garis UNIX / Linux sehingga dapat digunakan untuk menjalankan skrip shell pada platform yang tidak dapat melakukannya secara asli.)
@Pavel Hmm ... 0 byte?
ɐɔıʇǝɥʇuʎ
10

Batch - 6 byte

Del %0

Cukup mudah. Catatan: Bekerja meskipun namanya mengandung spasi.

hapus clemeat
sumber
Hanya jika nama file tidak memiliki spasi.
Isiah Meadows
@impinball, Maaf?
hapus tanda
Hanya menunjukkan sedikit bug. Jika Anda menentukan DOS, itu tidak, tapi itu akan rusak dengan mudah di Windows (mis. Dalam Program Files). Tidak perlu permintaan maaf.
Isiah Meadows
Buruk saya ... tidak apa-apa. Saya salah ingat bahwa kutipan tidak diperlukan dalam kasus ini karena mereka secara otomatis termasuk dalam ini.
Isiah Meadows
Semuanya bagus. Menambahkan tilde menghapus tanda kutip di sekitarnya. %~0.
hapus tanda
9

Ruby, 14 karakter

File.delete $0

$0 adalah variabel global khusus yang berisi nama skrip yang sedang berjalan.

Gagang pintu
sumber
Saya cukup yakin Anda bisa menjatuhkan ruang.
Darren Stone
Inilah mengapa saya membuat versi pertanyaan saya jauh lebih ketat. Bahasa yang diinterpretasikan dapat melakukannya tanpa masalah. Idenya adalah bahwa aplikasi yang berjalan secara asli tidak bisa begitu saja mengeluarkan karpet dari bawahnya sendiri
Cruncher
6

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

5 byte

1 NEW

Yah, itu sesederhana yang didapat. NEWmembuat program baru, jadi menempatkan ini di mana saja di program Anda akan menghapusnya.

Bukti konsep pada IBM BASIC (memakai NEWjalur 40 untuk kejelasan):

* Ya, saya mencantumkan setiap versi BASIC lama yang telah saya uji ini (atau cukup banyak digunakan)

MD XF
sumber
2
+1, Ada sesuatu yang agak puitis tentang ini. Bahkan eksistensial.
Wossname
5

PHP, 17 karakter

unlink(__FILE__);
Tobias Mädel
sumber
6
Saya tidak yakin mengapa ada orang yang akan menurunkan suara ini; ini sangat valid. Anda mungkin ingin memasukkan tag terbuka,<?unlink(__FILE__);
primo
4
Program PHP ini dicetak unlink(__FILE__);. Itu tidak menghapus file.
sayap kanan
1
@ rightfold berfungsi seperti yang dijelaskan jika Anda menyertakan tag pembuka, yang saya asumsikan akan tambahkan
Darren H
3

PowerShell (32)

del $MyInvocation.MyCommand.Name
mikrobia
sumber
3

Perl 5 (8 karakter)

unlink$0

$0adalah nama skrip, dan unlinkmenghapusnya. Biasanya, Anda setidaknya akan menambahkan ruang di antara untuk keterbacaan.

Joachim Isaksson
sumber
3

k (8)

~-1!.z.f

Atau q setara dengan 14:

hdel hsym .z.f
skeevey
sumber
3

Python, 18

open(__file__,'w')

Buka sendiri dalam mode hanya-tulis, hapus sendiri.

Tidak Ada Di Sini
sumber
9
Ini memotong file. Itu tidak menghapusnya.
sayap kanan
2

R, 26 karakter

unlink(sys.frame(1)$ofile)
plannapus
sumber
1

Node.js - 22 karakter

fs.unlink(__filename);
Tobias Mädel
sumber
1

Julia, 13 byte

rm(@__FILE__)

Sederhana. Tapi lebih lama. : P

Rɪᴋᴇʀ
sumber
1

Vitsy + bash, 8 byte

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.
Addison Crump
sumber
1

Mathematica, 29 byte

DeleteFile@NotebookFileName[]
A Simmons
sumber
1

Lua, 17 byte

os.remove(arg[0])

Ini sebenarnya hanya berfungsi jika Anda menjalankan program dengan mengetikkan filepath lengkap, yaitu
lua ~/Scripts/removeself.luaakan berfungsi, tetapi lua removeself.luatidak, dengan asumsi nama file removeself.luadan direktori kerja saat ini dari ~/Scripts.

Sejauh yang saya tahu, tidak ada cara untuk menemukan file sebenarnya dari sebuah skrip, hanya argumen yang diteruskan ke sana. Saya memang tahu debug.getinfo(1).source, tetapi dalam pengujian saya bahwa permainan itu persis sama dengan hasil arg[0]. Jika ada yang tahu cara menemukan filepath, beri tahu saya.

Jesse Paroz
sumber
1

Nodejs, 32 byte

require("fs").unlink(__filename)
programmer5000
sumber
1

JS, 37 byte

document.documentElement.innerHTML=""

Apakah ini masuk hitungan? Itu membunuh javascript di halaman

sangat bosan
sumber
Anda tidak perlu ruang di sekitar=
programmer5000
1

tcl, 18

file delete $argv0

demo - PERHATIAN: Ini hanya demo satu kali! Hanya pertama kali itu akan bisa dijalankan. Harap simpan di poster asli pertanyaan. Untuk mencoba: tekan Executetombol. Area hijau tidak akan melaporkan kesalahan apa pun. Setelah itu, klik berikutnya pada Executetombol akan menghasilkan not foundkesalahan!

sergiol
sumber
1

C, 32 byte

main(c,v)char**v;{remove(v[0]);}
Josh
sumber
1
Yang hilang }diizinkan dalam C? Wow!
CalculatorFeline
Tidak, hanya salah ketik! Hitungan karakter saya termasuk penutup }tetapi ternyata saya salah menyalin / menempelkan cuplikan. Terima kasih telah menunjukkannya!
Josh
Yah, karena downvoter anonim tidak merasa ingin meninggalkan komentar atau menarik kembali suara mereka, saya telah menghapus jawaban saya, yang saya ambil dari Anda. Anda dapat melakukan golf hingga 29 byte:main(c,v)int**v;{remove(*v);}
MD XF
@ MDXF Saya tidak yakin apakah beralih char**ke int**secara teknis valid. Saya khawatir tentang masalah penyelarasan potensial.
Josh
1
@ Ya Tuhan; itu bekerja ... jadi saya tidak melihat mengapa tidak. Code golf adalah tentang menggunakan metode mengerikan yang secara teknis tidak valid.
MD XF
1

JavaScript (ES6), 13 byte

f=_=>delete f

Cobalah

Log sumber f, panggilan f(yang menghapus f), mencoba untuk log flagi tetapi melemparkan kesalahan karena fsekarang tidak terdefinisi.

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

Shaggy
sumber
0

PowerShell v3 - 17

ri $PSCommandPath
Berasal
sumber
0

Julia - 25 byte

Tulis ini ke dalam file, lalu sertakan file dengan include("<filename here>")dan jalankan f():

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

Ini jelas merupakan suatu fungsi - saya tidak yakin bagaimana cara mendeteksi nama file dari suatu file yang sedang dijalankan secara langsung (sebagai pernyataan sertakan tanpa definisi fungsi di dalamnya).

Glen O
sumber
0

C ++, 137 byte.

Sebagian besar waktu berfungsi di 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 byte

void main(int n,char**v){char c[99];sprintf(c,"start cmd /C del \"%s\"/Q", *v);system(c);} 
Johan du Toit
sumber
Sebagian besar waktu?
Addison Crump
1
Anda dapat menyimpan banyak byte dengan menghapus ruang yang tidak digunakan #include <string>, menghapus ruang asing, dan membuat C ini, yang memungkinkan Anda menghapus intdan return. Selain itu, Anda perlu #include <stdio.h>membuat karya ini, karena di situlah sprintfdinyatakan.
Mego
0

MATLAB, 36 byte

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

Simpan kode di atas sebagai file-m mengikuti panduan nama file Matlab.

slvrbld
sumber
0

VBA, 69 67 Bytes

Subrutin yang tidak mengambil input dan menghapus sendiri.

Mengharuskan kode di bawah ini menjadi baris pertama di panel kode aktif, dan bahwa VBA memiliki akses tepercaya ke model Proyek VBE.

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

-2 byte untuk diganti ActiveCodePanedenganCodePane(1)

Taylor Scott
sumber
0

T-SQL, 28 byte

CREATE PROC d AS DROP PROC d

Itu hanya menjatuhkan / menghapus prosedur dan kode ketika menjalankan sendiri. Pemakaian:

EXECUTE d
WORNG ALL
sumber
0

shortC , 10 byte

Aremove(*@

Bagaimana itu bekerja:

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

Program C Setara:

int main(int argc, char **argv){remove(*argv);}
MD XF
sumber
0

8086/8088 kode mesin, 1 byte

aa    stosb

Asumsi:

  • Register CS, IP, ES, DI, dan AL semuanya awalnya 0.
  • Kode ini ditempatkan di alamat 0.

Itu stosb toko instruksi byte dalam AL mendaftar di lokasi memori yang ditunjuk oleh ES dan DI, maka kenaikan atau decrements DI. Dalam hal ini, ia menyimpan byte 0 pada alamat memori 0, yang kebetulan merupakan tempat instruksi itu sendiri.

Memang, program ini tidak menghapus file atau apa pun. Tetapi jika Anda berhasil mendapatkan prosesor 8086, mencolek program ini ke dalam memori, dan menjalankannya, itu sebenarnya akan menimpa dirinya sendiri.

Tanner Swett
sumber