Un programma che si elimina da solo


22

Se viene utilizzata una lingua compilata, il programma deve eliminare l'eseguibile compilato (ma non è necessario eliminare il file di origine). Se viene utilizzata una lingua interpretata, il programma deve eliminare il file di origine.

La mia offerta di apertura:

Python (29 caratteri)

import os;os.remove(__file__)

Modifica: per impedire soluzioni come rm -rf / , il programma non deve cancellare nulla tranne il file eseguibile o il file sorgente.

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 Quella domanda era più severa e richiedeva un file .exe. Questo è più rilassato.
EMBLEMA

Hmm ... cosa succede se voto per chiudere nella direzione opposta, allora?
John Dvorak,

3
code-golf, non concorso di popolarità ? Aww.
Justin

10
@Quincunx Non credo nei concorsi di popolarità. Il vero codice non viene prima validato sulla sua eleganza, ma sulla sua correttezza.
EMBLEMA

Risposte:


21

Script Bash (7 caratteri, 7 byte)

rm "$0"

1
Non funziona se il nome del file di script contiene spazi.
user80551

Buon occhio! Ho aggiornato lo script per lavorare con file con spazi al loro interno. Aggiunge solo altri due personaggi. Grazie!
anthony.c,

Funziona se il nome del file contiene virgolette doppie?
John Dvorak,

1
@JanDvorak: Sì. Dall'esecuzione che sarebbe ad esempio ./the\"program, ./'the"program', './tha"program'. Tutto funziona come previsto. (Le virgolette devono essere evase o racchiuse tra virgolette singole su chiamata.) Funzionerebbe anche su file contenenti nomi con newline ecc.
Runium

1
@ StéphaneGourichon Probabilmente perché è in esecuzione rm "$0"nella shell Bash anziché in uno script batch . È necessario modificare l'intestazione in questo modo:# Bash script, 7 bytes
MD XF,

15

Unix? (9):

#!/bin/rm

Un classico. Utilizza rmcome interprete, per la cancellazione automatica istantanea. Non il più breve però.


5
O se vuoi essere economico: un rmprogramma a 0 byte .
nyuszika7h,

1
La #!linea non viene conteggiata nel punteggio.
Pavel

@Phoenix: è se è insolito per la lingua che stai usando; solo le #!righe completamente standard che danno solo il nome dell'interprete predefinito della lingua contano come zero. Questa è una #!linea molto insolita per quanto riguarda Bash. (Non che questo

1
Questo non è in realtà un programma Bash (se lo esegui esplicitamente usando bash, non cancellerà nulla). È un eseguibile UNIX / Linux. (Funziona anche in Perl, che emula la gestione delle #!linee di UNIX / Linux in modo che possa essere utilizzato per eseguire shellscript su piattaforme che non possono farlo in modo nativo.)

@Pavel Hmm ... 0 byte?
Sepıʇǝɥʇuʎs l'

10

Lotto - 6 byte

Del %0

Abbastanza semplice. Nota: funziona anche se il nome contiene spazi.


Solo se il nome del file non ha spazi.
Isiah Meadows,

@impinball, mi dispiace?
carne

Sto solo sottolineando un piccolo bug. Se si specifica DOS, non lo è, ma si romperà abbastanza facilmente in Windows (es. In Programmi). Non sono necessarie scuse.
Isiah Meadows

Mio male ... va tutto bene. Ho sbagliato a ricordare che le citazioni non sono necessarie in questo caso perché sono automaticamente incluse in questo.
Isiah Meadows

Tutto bene. L'aggiunta di tilde rimuove le virgolette circostanti. %~0.
carne

9

Rubino, 14 personaggi

File.delete $0

$0 è una variabile globale speciale che contiene il nome dello script attualmente in esecuzione.


Sono abbastanza sicuro che puoi lasciare spazio.
Darren Stone,

Questo è il motivo per cui ho reso la mia versione della domanda molto più severa. Le lingue interpretate possono farlo senza problemi. L'idea è che un'applicazione nativa non può semplicemente estrarre il tappeto da sotto se stesso
Cruncher,

6

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

5 byte

1 NEW

Bene, è quasi semplice. NEWcrea un nuovo programma, quindi inserendolo in qualsiasi punto del programma lo eliminerai.

Prova del concetto su IBM BASIC (mettendo NEWin linea 40 per chiarezza):

* Sì, ho elencato tutte le vecchie versioni BASIC in cui l'ho testato (o quasi mai usato)


2
+1, C'è qualcosa di piuttosto poetico in questo. Anche esistenziale.
Wossname,

5

PHP, 17 caratteri

unlink(__FILE__);

6
Non sono sicuro del motivo per cui qualcuno dovrebbe sottovalutare questo; è perfettamente valido. Potresti voler includere un tag aperto, tuttavia<?unlink(__FILE__);
primo

4
Questo programma PHP stampa unlink(__FILE__);. Non elimina il file.
destra

1
@rightfold funziona come descritto se includi un tag di apertura, che avrei supposto di aggiungere
Darren H


3

Perl 5 (8 caratteri)

unlink$0

$0è il nome dello script e lo unlinkrimuove. Normalmente, si dovrebbe almeno aggiungere uno spazio in mezzo per la leggibilità.



3

k (8)

~-1!.z.f

O l'equivalente q per 14:

hdel hsym .z.f

3

Python, 18 anni

open(__file__,'w')

Si apre in modalità di sola scrittura, cancellandosi.


9
Questo tronca il file. Non lo elimina.
destra




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.


1

Lua, 17 byte

os.remove(arg[0])

Questo in realtà funziona solo se si esegue il programma digitando il percorso file completo, cioè
lua ~/Scripts/removeself.luafunzionerebbe, ma lua removeself.luanon funzionerebbe, assumendo un nome file removeself.luae una directory di lavoro corrente di ~/Scripts.

Per quanto ne so, non c'è modo di trovare il percorso file effettivo di uno script, solo gli argomenti passati ad esso. Lo so debug.getinfo(1).source, ma nei miei test quel gioco ha esattamente gli stessi risultati di arg[0]. Se qualcuno conosce un modo per trovare il percorso del file, per favore fatemelo sapere.




1

tcl, 18

file delete $argv0

demo - ATTENZIONE: è solo una volta una demo! Solo la prima volta sarà eseguibile. Si prega di riservarlo al poster originale della domanda. Per provare: premere il Executepulsante. L'area verde non segnalerà alcun errore. Successivamente, eventuali clic successivi sul Executepulsante comporteranno un not founderrore!


1

C, 32 byte

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

1
I messaggi mancanti }sono consentiti in C? Wow!
Calcolatrice

No, solo un errore di battitura! Il mio conteggio dei personaggi includeva la chiusura, }ma apparentemente ho copiato / incollato lo snippet in modo errato. Grazie per segnalarlo!
Josh,

Bene, dato che l'anonimo downvoter non ha voglia di lasciare un commento o di ritirare il proprio voto, ho cancellato la mia risposta, che ho basato sulla tua. Puoi giocare a golf fino a 29 byte:main(c,v)int**v;{remove(*v);}
MD XF

@MDXF Non sono sicuro che la modifica char**a int**sia tecnicamente valida. Sono preoccupato per potenziali problemi di allineamento.
Josh,

1
@Josh Bene; funziona ... quindi non vedo perché no. Il code golf si basa sull'utilizzo di metodi orribili che non sono tecnicamente validi.
MD XF,

1

JavaScript (ES6), 13 byte

f=_=>delete f

Provalo

Registra l'origine di f, chiama f(che elimina f), tenta di accedere fnuovamente ma genera un errore perché non fè definito.

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



0

Julia - 25 byte

Scrivi questo in un file, quindi includi il file con include("<filename here>")ed esegui f():

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

Questa è, ovviamente, una funzione - Non sono sicuro di come si possa rilevare il nome del file di un file che viene eseguito direttamente (come un'istruzione include senza una definizione di funzione in esso).


0

C ++, 137 byte.

Funziona la maggior parte delle volte su 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);} 

La maggior parte delle volte?
Addison Crump

1
È possibile salvare molti byte rimuovendo gli inutilizzati #include <string>, rimuovendo gli spazi estranei e creando questa C, che consente di rimuovere inte return. Inoltre, devi #include <stdio.h>farlo funzionare, poiché è lì che sprintfviene dichiarato.
Mego

0

MATLAB, 36 byte

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

Salva il codice sopra come file m seguendo le linee guida del nome file di Matlab.


0

VBA, 69 67 byte

Sottoprogramma che non accetta input e si elimina da solo.

Richiede che il codice seguente sia la prima riga nel riquadro del codice attivo e che VBA abbia un accesso sicuro al modello di progetto VBE.

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

-2 byte per la sostituzione ActiveCodePaneconCodePane(1)


0

T-SQL, 28 byte

CREATE PROC d AS DROP PROC d

Elimina / rimuove semplicemente la procedura e il codice durante l'esecuzione. Uso:

EXECUTE d

0

shortC , 10 byte

Aremove(*@

Come funziona:

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

Programma C equivalente:

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

0

Codice macchina 8086/8088, 1 byte

aa    stosb

ipotesi:

  • I registri CS, IP, ES, DI e AL sono inizialmente tutti 0.
  • Questo codice è inserito all'indirizzo 0.

L' stosbistruzione memorizza il byte nel registro AL nella posizione di memoria indicata da ES e DI, quindi incrementa o decrementa DI. In questo caso, memorizza il byte 0 all'indirizzo di memoria 0, che si trova dove si trova l'istruzione stessa.

Concesso, questo programma non elimina un file o altro. Ma se riesci a mettere le mani su un processore 8086, mettere in memoria questo programma ed eseguirlo, in realtà si sovrascriverà da solo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.