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>



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"

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.


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.


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.


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)


2
+1, jest w tym coś poetyckiego. Nawet egzystencjalny.
Wossname

5

PHP, 17 znaków

unlink(__FILE__);

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

Perl 5 (8 znaków)

unlink$0

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








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.


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ć.




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!


1

C, 32 bajty

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

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)



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).


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

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.


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)


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

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.