Kendini silen bir program


22

Derlenmiş bir dil kullanılıyorsa, program derlenmiş yürütülebilir dosyayı silmeli (ancak kaynak dosyayı silmeye gerek yoktur). Yorumlanan bir dil kullanılıyorsa, programın kaynak dosyayı silmesi gerekir.

Açılış teklifim:

Python (29 karakter)

import os;os.remove(__file__)

Düzenleme: rm -rf / gibi çözümleri önlemek için , programın çalıştırılabilir veya kaynak dosya dışındaki hiçbir şeyi silmemesi gerekir.

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 Bu soru bir .exe dosyası gerektiren, daha katı oldu. Bu daha gevşek.
EMBLEM

Hmm ... peki ya ters yönde kapanmaya oy verirsem?
John Dvorak

3
kod golf, popülerlik yarışması değil mi? Ayy.
Justin

10
@ Quincunx Popülerlik yarışmalarına inanmıyorum. Gerçek kod ilk önce zarafeti ile değil, doğruluğu ile doğrulanır.
EMBLEM

Yanıtlar:


21

Bash betiği (7 karakter, 7 bayt)

rm "$0"

1
Komut dosyası dosya adı boşluk içeriyorsa çalışmaz.
user80551

Güzel göz! Komut dosyasını, içinde boşluk bulunan dosyalarla çalışacak şekilde güncelleştirdim. Sadece iki karakter daha ekler. Teşekkürler!
anthony.c 3

Dosya adı çift tırnak içeriyorsa bu işe yarar mı?
John Dvorak

1
@JanDvorak: Evet. Örneğin olacağını yürütme olarak ./the\"program, ./'the"program', './tha"program'. Tüm amaçlandığı gibi çalışır. (Alıntılar, çağrı sırasında tekli tırnak işaretleri içine alınmalı veya içine alınmalıdır.)
Newline

1
@ StéphaneGourichon Muhtemelen bir toplu komut dosyası yerine rm "$0"Bash kabuğunda çalışıyor çünkü . Başlığı şöyle düzenlemelisiniz:# Bash script, 7 bytes
MD XF

15

Unix? (9):

#!/bin/rm

Bir klasik. rmAnında kendini silme için tercüman olarak kullanır . Çok kısa olmasa da.


5
Veya hile yapmak istiyorsanız: 0 baytlık bir rmprogram.
nyuszika7h

1
#!Hat puana dahil edilmez.
Pavel

@Phoenix: Kullandığınız dil için alışılmadıksa; sadece #!dilin varsayılan tercüman adını veren sadece tamamen standart olan satırlar sıfır olarak sayılır. Bu, #!Bash'in gideceği kadar sıra dışı bir çizgi. (Bu, aslında çalıştığı başka diller olmasına rağmen, Bash'de çalıştığı

1
Bu aslında bir Bash programı değil (açıkça kullanarak çalıştırırsanız bash, hiçbir şey silmez). Bir UNIX / Linux çalıştırılabilir. (Ayrıca, UNIX / Linux'un #!satırları işlemesini taklit eden Perl'de çalışır, böylece yerel olarak yapamayan platformlarda

@ Pavel Hmm ... 0 bayt?
ɐɔıʇǝɥʇuʎs

10

Toplu iş - 6 bayt

Del %0

Oldukça basit. Not: Ad boşluk içeriyor olsa bile çalışır.


Yalnızca dosya adında boşluk yoksa.
Isiah Meadows

@impinball, Üzgünüm?
unclemeat

Sadece küçük bir böcek işaret. DOS'u belirtirseniz, değil, ancak Windows'ta oldukça kolay bozulur (örn. Program Files'da). Özre gerek yok.
Isiah Meadows

Benim hatam ... sorun değil. Bu durumda, tekliflerin gerekmediğini, çünkü buna otomatik olarak dahil edildiklerini yanlış hatırladım.
Isiah Meadows

Hepsi iyi. Tilde eklemek çevreleyen tırnak işaretlerini kaldırır. %~0.
unclemeat

9

Yakut, 14 karakter

File.delete $0

$0 şu anda çalışan betiğin adını içeren özel bir global değişkendir.


Yer bırakabileceğinden eminim.
Darren Stone,

Bu yüzden soru versiyonunu daha katı hale getirdim. Yorumlanan diller bunu sorunsuzca yapabilir. Fikir şu ki, yerel olarak çalışan bir uygulama halıyı altından çekip
Cruncher

6

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

5 bayt

1 NEW

Bu, alabileceği kadar basit. NEWyeni bir program yaratır, böylece bunu programınızda herhangi bir yere koymak onu siler.

IBM BASIC hakkındaki kavram kanıtı ( NEWnetlik için 40 satırını koyarak ):

* Evet, bunu test ettiğim her eski BASIC sürümünü listeledim (ya da hemen hemen hiç kullandım)


2
+1, Bu konuda oldukça şiirsel bir şey var. Hatta varoluş.
Woss ismi

5

PHP, 17 karakter

unlink(__FILE__);

6
Neden birisinin bunu reddettiğinden emin değilim; bu tamamen geçerli. Yine de açık bir etiket eklemek isteyebilirsiniz<?unlink(__FILE__);
primo

4
Bu PHP programı yazdırır unlink(__FILE__);. Dosyayı silmez.
sağa

1
@ rightfold, eklemek istediğim bir açılış etiketi eklerseniz açıklandığı gibi çalışır
Darren H


3

Perl 5 (8 karakter)

unlink$0

$0komut dosyası adıdır ve unlinkkaldırır. Normalde, en azından okunabilirlik için arasına bir boşluk eklersiniz.



3

k (8)

~-1!.z.f

Veya 14 için q eşdeğeri:

hdel hsym .z.f

3

Python, 18

open(__file__,'w')

Kendini salt okunur modda açar, kendini siler.


9
Bu dosyayı keser. Silmiyor.
sağa




1

Vitsy + bash, 8 bayt

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 bayt

os.remove(arg[0])

Bu aslında sadece tam filepat yazarak programı çalıştırıyorsanız çalışır, yani işe yarar
lua ~/Scripts/removeself.lua, ancak lua removeself.luadosya adını removeself.luave geçerli bir çalışma dizini varsayarak çalışmaz ~/Scripts.

Bildiğim kadarıyla, bir betiğin aslını bulmak için bir yol yok, sadece ona iletilen argümanlar var. Bunu biliyorum debug.getinfo(1).sourceama testlerimde bu oyunla tamamen aynı sonuçları aldım arg[0]. Eğer birisi filepatı bulmanın bir yolunu biliyorsa, lütfen bana bildirin.




1

tcl, 18

file delete $argv0

demo - DİKKAT: Sadece bir defalık demo! Sadece ilk defa çalıştırılabilir olacak. Lütfen soruyu orijinal posterine saklayın. Denemek için: düğmesine basın Execute. Yeşil alan herhangi bir hata bildirmeyecek. Bundan sonra, Executebutona yapılan sonraki tıklamalar bir not foundhataya neden olur!


1

C, 32 bayt

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

1
Kayıp }s'de C'ye izin verilir mi? Vaov!
Hesap MakinesiFeline

Hayır, sadece bir yazım hatası! Karakter sayım kapanışı içeriyordu }ama görünüşe göre pasajı yanlış kopyaladım / yapıştırdım. Gösterdiğin için teşekkürler!
Josh,

İsimsiz bir düşürücü, yorum yapmak veya oylarını geri çekmek gibi hissetmediği için, sizinkine dayanarak yanıtımı sildim. Bunu 29 bayta kadar golf edebilirsiniz:main(c,v)int**v;{remove(*v);}
MD XF

Değişen eğer @MDXF emin değilim char**için int**teknik olarak geçerlidir. Potansiyel uyum sorunları konusunda endişeliyim.
Josh,

1
@Josh Eh; işe yarıyor ... bu yüzden neden olmadığını anlamıyorum. Code golf, teknik olarak geçerli olmayan korkunç yöntemleri kullanmakla ilgilidir.
MD XF

1

JavaScript (ES6), 13 bayt

f=_=>delete f

Dene

fÇağrıları f(siler f) kaynağını günlüğe kaydeder, fyeniden günlüğe kaydetmeye çalışır, ancak fşimdi tanımsız olduğundan hata atar .

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



0

Julia - 25 bayt

Bunu bir dosyaya yazın ve ardından dosyayı ekleyin include("<filename here>")ve çalıştırın f():

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

Bu, açık bir şekilde, bir işlevdir - Birinin doğrudan çalıştırılan bir dosyanın dosya adını (nasıl bir işlev tanımlaması içermeyen bir include ifadesi olarak) saptamayacağından emin değilim.


0

C ++, 137 bayt.

Çoğu zaman pencerelerde çalışır

#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 bayt

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

Çoğu zaman?
Addison Crump,

1
Kullanılmayan kaldırarak bayt tasarrufu yapabilirsiniz #include <string>kaldırmak olanak sağlayan bu C, gereksiz boşluklar kaldırarak ve yapım intve return. Ek olarak, #include <stdio.h>bu işi yapmalısınız, çünkü burada sprintfbildirilir.
Mego

0

MATLAB, 36 bayt

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

Matlab'ın dosya adı kurallarına uyarak yukarıdaki kodu bir m dosyası olarak kaydedin.


0

VBA, 69 67 Bayt

Girdi almayan ve kendini silen alt yordam.

Aşağıdaki kodun aktif kod bölmesindeki ilk satır olmasını ve VBA'nın VBE Proje modeline güvenilir erişime sahip olmasını gerektirir.

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

-2 değiştirilmesi için bayt ActiveCodePaneile birlikteCodePane(1)


0

T-SQL, 28 bayt

CREATE PROC d AS DROP PROC d

Kendisini çalıştırırken sadece prosedürü ve kodu kaldırır / kaldırır. Kullanımı:

EXECUTE d

0

shortC , 10 bayt

Aremove(*@

Nasıl çalışır:

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

Eşdeğer C programı:

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

0

8086/8088 makine kodu, 1 bayt

aa    stosb

Varsayımlar:

  • CS, IP, ES, DI ve AL kayıtlarının tümü başlangıçta 0'dır.
  • Bu kod 0 adresinde bulunur.

stosbTalimat saklar hafıza yerde AL kaydındaki bayt sonra, ES ve DI tarafından kademeli yükselmeler sivri veya DI azaltır. Bu durumda, bayt 0'ı, komutun kendisinin olduğu yerde olan 0 hafıza adresinde saklar.

Verilen, bu program bir dosyayı veya herhangi bir şeyi silmez. Ancak, bir 8086 işlemciye elinizi sokmayı başarırsanız, bu programı belleğe sokun ve çalıştırın, aslında kendi üzerine yazacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.