Program, który usuwa się sam

22

Jeśli używany jest skompilowany język, program musi usunąć skompilowany plik wykonywalny (ale nie musi usuwać pliku źródłowego). Jeśli używany jest język interpretowany, program musi usunąć plik źródłowy.

Moja oferta otwarcia:

Python (29 znaków)

import os;os.remove(__file__)

Edycja: aby zapobiec rozwiązaniom takim jak rm -rf / , program nie może usuwać niczego oprócz pliku wykonywalnego lub źródłowego.

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>

GODŁO
źródło
możliwy duplikat Napisz program, który sam się usuwa
John Dvorak
2
@JanDvorak To pytanie było surowsze i wymagało pliku .exe. To jest bardziej rozluźnione.
EMBLEM
Hmm ... co jeśli głosuję na zamknięcie w przeciwnym kierunku?
John Dvorak
3
code-golf, a nie konkurs popularności ? Aww.
Justin
10
@Quincunx Nie wierzę w konkursy popularności. Prawdziwy kod nie jest najpierw sprawdzany pod względem elegancji, ale poprawności.
EMBLEM

Odpowiedzi:

21

Skrypt Bash (7 znaków, 7 bajtów)

rm "$0"
anthony.c
źródło
1
Nie działa, jeśli nazwa pliku skryptu zawiera spacje.
user80551
Dobre oko! Zaktualizowałem skrypt do pracy z plikami ze spacjami. Dodaje tylko dwa kolejne znaki. Dzięki!
anthony.c
Czy to działa, jeśli nazwa pliku zawiera podwójne cudzysłowy?
John Dvorak,
1
@JanDvorak: Tak. Przez wykonanie, która byłaby na przykład ./the\"program, ./'the"program', './tha"program'. Wszystkie działa zgodnie z przeznaczeniem. (Cytaty należy uciec lub zamknięte w apostrofach na wezwanie.) Byłyby również pracować na plikach zawierających nazwy z nowej linii itd.
Runium
1
@ StéphaneGourichon Prawdopodobnie dlatego, że działa rm "$0"w powłoce Bash zamiast w skrypcie wsadowym . Powinieneś edytować nagłówek w następujący sposób:# Bash script, 7 bytes
MD XF
15

Unix? (9):

#!/bin/rm

Klasyk. Wykorzystuje się rmjako interpreter do natychmiastowego samodzielnego usunięcia. Jednak nie najkrótszy.

.ıʇǝɥʇuʎs
źródło
5
Lub jeśli chcesz być oszukiwany: program 0-bajtowy rm.
nyuszika7h
1
#!Linia nie jest liczona w partyturze.
Pavel
@Phoenix: To jest, jeśli jest to niezwykłe dla używanego języka; tylko całkowicie standardowe #!wiersze, które podają tylko nazwę domyślnego tłumacza języka, liczą się jako zero. Jest to bardzo nietypowa #!linia, jeśli chodzi o Bash. (Nie to, że tak naprawdę działa w Bash, chociaż istnieją inne języki, w których to działa.)
1
W rzeczywistości nie jest to program Bash (jeśli uruchomisz go jawnie przy użyciu bash, niczego nie usunie). Jest to plik wykonywalny UNIX / Linux. (Działa również w Perlu, który emuluje obsługę #!wierszy przez system UNIX / Linux, dzięki czemu można go używać do uruchamiania
@Pavel Hmm ... 0 bajtów?
11ıʇǝɥʇuʎs
10

Partia - 6 bajtów

Del %0

Dość proste. Uwaga: Działa, nawet jeśli nazwa zawiera spacje.

nieprzyzwoity
źródło
Tylko jeśli nazwa pliku nie ma spacji.
Isiah Meadows
@impinball, Przepraszamy?
niepomyślne
Wskazując tylko mały błąd. Jeśli określisz DOS, tak nie jest, ale dość łatwo psuje się w systemie Windows (np. W Program Files). Przeprosiny nie są potrzebne.
Isiah Meadows
Mój zły ... jest w porządku. Źle pamiętam, że w tym przypadku cytaty nie są potrzebne, ponieważ są one automatycznie uwzględniane w tym.
Isiah Meadows
Wszystko dobrze. Dodanie tyldy powoduje usunięcie otaczających cudzysłowów. %~0.
niepomyślne
9

Ruby, 14 znaków

File.delete $0

$0 jest specjalną zmienną globalną, która zawiera nazwę aktualnie uruchomionego skryptu.

Klamka
źródło
Jestem prawie pewien, że możesz upuścić przestrzeń.
Darren Stone
Dlatego uściśliłem moją wersję pytania. Języki zinterpretowane mogą to zrobić bez problemu. Chodzi o to, że natywnie działająca aplikacja nie może po prostu wyciągnąć dywanu spod siebie
Cruncher
6

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

5 bajtów

1 NEW

Cóż, to jest tak proste, jak to możliwe. NEWtworzy nowy program, więc umieszczenie go w dowolnym miejscu w programie spowoduje jego usunięcie.

Dowód koncepcji na IBM BASIC (wstawienie NEWlinii 40 dla przejrzystości):

* Tak, wymieniłem każdą starą wersję BASIC, w której ją testowałem (lub właściwie prawie kiedykolwiek użyłem)

MD XF
źródło
2
+1, jest w tym coś poetyckiego. Nawet egzystencjalny.
Wossname
5

PHP, 17 znaków

unlink(__FILE__);
Tobias Mädel
źródło
6
Nie jestem pewien, dlaczego ktokolwiek miałby głosować za tym; jest całkowicie poprawny. Możesz jednak dołączyć otwarty tag<?unlink(__FILE__);
primo
4
Ten program PHP zostanie wydrukowany unlink(__FILE__);. Nie usuwa pliku.
prawej strony
1
@rightfold działa tak, jak opisano, jeśli dołączasz tag otwierający, który chciałbym dodać
Darren H
3

PowerShell (32)

del $MyInvocation.MyCommand.Name
drobnoustrój
źródło
3

Perl 5 (8 znaków)

unlink$0

$0to nazwa skryptu i unlinkusuwa ją. Zwykle dodajesz przynajmniej miejsce pomiędzy, aby zapewnić czytelność.

Joachim Isaksson
źródło
3

k (8)

~-1!.z.f

Lub odpowiednik q dla 14:

hdel hsym .z.f
skeevey
źródło
3

Python, 18 lat

open(__file__,'w')

Otwiera się w trybie tylko do zapisu, usuwając się.

Nikogo tu nie ma
źródło
9
Spowoduje to obcięcie pliku. Nie usuwa go.
prawej strony
2

R, 26 znaków

unlink(sys.frame(1)$ofile)
plannapus
źródło
1

Node.js - 22 znaki

fs.unlink(__filename);
Tobias Mädel
źródło
1

Julia, 13 bajtów

rm(@__FILE__)

Prosty. Ale dłużej. : P

Rɪᴋᴇʀ
źródło
1

Vitsy + bash, 8 bajtów

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
źródło
1

Mathematica, 29 bajtów

DeleteFile@NotebookFileName[]
Simmons
źródło
1

Lua, 17 bajtów

os.remove(arg[0])

W rzeczywistości działa to tylko wtedy, gdy uruchomisz program, wpisując pełną ścieżkę do pliku , tzn. Działałby
lua ~/Scripts/removeself.lua, ale lua removeself.luanie działałby, zakładając nazwę pliku removeself.luai bieżący katalog roboczy ~/Scripts.

O ile mi wiadomo, nie ma sposobu na znalezienie rzeczywistej ścieżki pliku skryptu, tylko argumenty przekazane do niego. Wiem o tym debug.getinfo(1).source, ale podczas testowania tej gry dokładnie takie same wyniki jak arg[0]. Jeśli ktoś zna sposób na znalezienie ścieżki pliku, daj mi znać.

Jesse Paroz
źródło
1

Nodejs, 32 bajty

require("fs").unlink(__filename)
programmer5000
źródło
1

JS, 37 bajtów

document.documentElement.innerHTML=""

Czy to się liczy? Zabija javascript na stronie

tak znudzony
źródło
Nie potrzebujesz spacji wokół=
programator5000
1

tcl, 18

file delete $argv0

demo - UWAGA: To tylko jednorazowe demo! Tylko za pierwszym razem będzie można go uruchomić. Proszę zarezerwować go na oryginalny plakat pytania. Aby spróbować: naciśnij Executeprzycisk. Zielony obszar nie zgłosi żadnego błędu. Następnie każde kolejne kliknięcie Executeprzycisku spowoduje not foundbłąd!

sergiol
źródło
1

C, 32 bajty

main(c,v)char**v;{remove(v[0]);}
Josh
źródło
1
Brakuje }s są dozwolone w C? Łał!
CalculatorFeline
Nie, tylko literówka! Moja liczba postaci obejmowała zamknięcie, }ale najwyraźniej niepoprawnie skopiowałem / wkleiłem fragment kodu. Dzięki za wskazanie tego!
Josh
Cóż, ponieważ anonimowy downvoter nie ma ochoty zostawiać komentarza ani wycofywać swojego głosu, usunąłem swoją odpowiedź, którą oparłem na twojej. Możesz zagrać w golfa do 29 bajtów:main(c,v)int**v;{remove(*v);}
MD XF
@MDXF Nie jestem pewien, czy się zmieniam char** na int**technicznie jest prawidłowa. Martwię się o potencjalne problemy z wyrównaniem.
Josh
1
@Josh Cóż; to działa ... więc nie rozumiem dlaczego. Code golf polega na użyciu okropnych metod, które nie są technicznie ważne.
MD XF,
1

JavaScript (ES6), 13 bajtów

f=_=>delete f

Spróbuj

Rejestruje źródło fpołączeńf (które usuwa f), próbuje zalogować się fponownie, ale generuje błąd, ponieważ fjest teraz niezdefiniowany.

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

Kudłaty
źródło
0

PowerShell v3 - 17

ri $PSCommandPath
Rynant
źródło
0

Julia - 25 bajtów

Zapisz to w pliku, a następnie dołącz plik do include("<filename here>")i uruchom f():

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

Jest to oczywiście funkcja - nie jestem pewien, jak można by było wykryć nazwę pliku uruchamianego bezpośrednio (jako instrukcja include bez definicji funkcji).

Glen O
źródło
0

C ++, 137 bajtów.

Działa przez większość czasu w systemie 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 bajtów

void main(int n,char**v){char c[99];sprintf(c,"start cmd /C del \"%s\"/Q", *v);system(c);} 
Johan du Toit
źródło
Większość czasu?
Addison Crump
1
Możesz zaoszczędzić wiele bajtów, usuwając nieużywane #include <string>, usuwając zewnętrzne przestrzenie i tworząc ten C, który pozwala usunąć inti return. Dodatkowo musisz #include <stdio.h>sprawić, by to zadziałało, ponieważ tam sprintfwłaśnie zadeklarowano.
Mego
0

MATLAB, 36 bajtów

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

Zapisz powyższy kod jako plik m zgodnie ze wskazówkami Matlab dotyczącymi nazw plików.

slvrbld
źródło
0

VBA, 69 67 bajtów

Podprogram, który nie pobiera danych wejściowych i sam się usuwa.

Wymaga, aby poniższy kod był pierwszym wierszem w aktywnym okienku kodu i aby VBA miał zaufany dostęp do modelu projektu VBE.

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

-2 bajtów zastąpienia ActiveCodePanezzCodePane(1)

Taylor Scott
źródło
0

T-SQL, 28 bajtów

CREATE PROC d AS DROP PROC d

Po prostu upuszcza / usuwa procedurę i kod podczas wykonywania. Stosowanie:

EXECUTE d
NOSIĆ WSZYSTKO
źródło
0

shortC , 10 bajtów

Aremove(*@

Jak to działa:

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

Odpowiednik programu C:

int main(int argc, char **argv){remove(*argv);}
MD XF
źródło
0

Kod maszynowy 8086/8088, 1 bajt

aa    stosb

Założenia:

  • Rejestry CS, IP, ES, DI i AL mają początkowo wartość 0.
  • Ten kod jest umieszczony pod adresem 0.

The stosb sklepach instrukcji bajt w rejestrze AL w miejscu pamięci wskazywanego przez ES i DI, a następnie zwiększa lub zmniejsza DI. W tym przypadku zapisuje bajt 0 pod adresem pamięci 0, który zdarza się tam, gdzie jest sama instrukcja.

To prawda, że ​​ten program nie usuwa pliku ani niczego. Ale jeśli uda ci się zdobyć procesor 8086, włóż ten program do pamięci i uruchom go, w rzeczywistości się nadpisze.

Tanner Swett
źródło