Un programme qui se supprime


22

Si un langage compilé est utilisé, le programme doit supprimer l'exécutable compilé (mais n'a pas besoin de supprimer le fichier source). Si un langage interprété est utilisé, le programme doit supprimer le fichier source.

Mon offre d'ouverture:

Python (29 caractères)

import os;os.remove(__file__)

Edit: pour éviter des solutions comme rm -rf / , le programme ne doit rien supprimer sauf le fichier exécutable ou source.

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 Cette question était plus stricte, nécessitant un fichier .exe. C'est plus laxiste.
EMBLEM

Hmm ... et si je vote pour fermer dans la direction opposée, alors?
John Dvorak

3
code-golf, pas un concours de popularité ? Aww.
Justin

10
@Quincunx Je ne crois pas aux concours de popularité. Le vrai code n'est pas d'abord validé sur son élégance, mais sa justesse.
EMBLEM

Réponses:


21

Script bash (7 caractères, 7 octets)

rm "$0"

1
Ne fonctionne pas si le nom du fichier de script contient des espaces.
user80551

Bon oeil! J'ai mis à jour le script pour travailler avec des fichiers contenant des espaces. Ajoute seulement deux caractères supplémentaires. Merci!
anthony.c

Est-ce que cela fonctionne si le nom de fichier contient des guillemets doubles?
John Dvorak

1
@JanDvorak: Oui. En exécution qui serait par exemple ./the\"program, ./'the"program', './tha"program'. Tout fonctionne comme prévu. (Les citations doivent être échappées ou placées entre guillemets simples sur appel.) Fonctionneraient également sur les fichiers contenant des noms avec un
saut de

1
@ StéphaneGourichon Probablement parce qu'il s'exécute rm "$0"dans le shell Bash plutôt que dans un script batch . Vous devez éditer l'en-tête comme suit:# Bash script, 7 bytes
MD XF

15

Unix? (9):

#!/bin/rm

Un classique. Utilise rmcomme interprète, pour une auto-suppression instantanée. Pas le plus court cependant.


5
Ou si vous voulez être tricheur: un programme de 0 octet rm.
nyuszika7h

1
La #!ligne n'est pas comptée dans le score.
Pavel

@Phoenix: C'est si c'est inhabituel pour la langue que vous utilisez; seules les #!lignes complètement standard qui donnent simplement le nom de l'interpréteur par défaut de la langue comptent comme zéro. C'est une #!ligne très inhabituelle en ce qui concerne Bash. (Pas que cela fonctionne réellement dans Bash, bien qu'il existe d'autres langues où cela fonctionne.)

1
Ce n'est pas en fait un programme Bash (si vous l'exécutez explicitement en utilisant bash, il ne supprimera rien). C'est un exécutable UNIX / Linux. (Il fonctionne également en Perl, qui émule la gestion des #!lignes par UNIX / Linux afin qu'il puisse être utilisé pour exécuter des scripts shell sur des plateformes qui ne peuvent pas le faire en mode natif.)

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

10

Lot - 6 octets

Del %0

Assez simple. Remarque: fonctionne même si le nom contient des espaces.


Uniquement si le nom de fichier n'a pas d'espaces.
Isiah Meadows

@impinball, Désolé?
retirer

Soulignant juste un petit bug. Si vous spécifiez DOS, ce n'est pas le cas, mais il se cassera assez facilement dans Windows (par exemple, dans Program Files). Aucune excuse nécessaire.
Isiah Meadows

Mon mauvais ... ça va. Je me souviens mal que les citations ne sont pas nécessaires dans ce cas car elles sont automatiquement incluses dans cela.
Isiah Meadows

Tout bon. L'ajout de tilde supprime les guillemets environnants. %~0.
unclemeat

9

Rubis, 14 caractères

File.delete $0

$0 est une variable globale spéciale qui contient le nom du script en cours d'exécution.


Je suis sûr que vous pouvez laisser tomber l'espace.
Darren Stone

C'est pourquoi j'ai rendu ma version de la question beaucoup plus stricte. Les langues interprétées peuvent le faire sans problème. L'idée est qu'une application fonctionnant en mode natif ne peut pas simplement retirer le tapis de sous lui-même
Cruncher

6

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

5 octets

1 NEW

Eh bien, c'est à peu près aussi simple que possible. NEWcrée un nouveau programme, donc le mettre n'importe où dans votre programme le supprimera.

Preuve de concept sur IBM BASIC (mise NEWen ligne 40 pour plus de clarté):

* Oui, j'ai répertorié toutes les anciennes versions BASIC dans lesquelles j'ai testé cela (ou presque jamais utilisé)


2
+1, il y a quelque chose de plutôt poétique à ce sujet. Existentiel même.
Wossname

5

PHP, 17 caractères

unlink(__FILE__);

6
Je ne sais pas pourquoi quelqu'un voterait contre cela; c'est parfaitement valable. Vous voudrez peut-être inclure une balise ouverte, cependant<?unlink(__FILE__);
primo

4
Ce programme PHP s'imprime unlink(__FILE__);. Il ne supprime pas le fichier.
plié à droite

1
@rightfold cela fonctionne comme décrit si vous incluez une balise d'ouverture, que j'aurais supposé ajouter
Darren H


3

Perl 5 (8 caractères)

unlink$0

$0est le nom du script et le unlinksupprime. Normalement, vous ajouteriez au moins un espace entre les deux pour plus de lisibilité.



3

k (8)

~-1!.z.f

Ou l'équivalent q pour 14:

hdel hsym .z.f





1

Vitsy + bash, 8 octets

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 octets

os.remove(arg[0])

En fait, cela ne fonctionne que si vous exécutez le programme en tapant le chemin de fichier complet, c'est
lua ~/Scripts/removeself.lua-à- dire que cela fonctionnerait, mais lua removeself.luane fonctionnerait pas, en supposant un nom de fichier removeself.luaet un répertoire de travail actuel de ~/Scripts.

Pour autant que je sache, il n'y a aucun moyen de trouver le chemin de fichier réel d'un script, juste les arguments qui lui sont passés. Je sais debug.getinfo(1).source, mais lors de mes tests, ce jeu a exactement les mêmes résultats que arg[0]. Si quelqu'un connaît un moyen de trouver le chemin de fichier, faites-le moi savoir.



1

JS, 37 octets

document.documentElement.innerHTML=""

Est-ce que cela compte? Il tue javascript sur la page


Vous n'avez pas besoin des espaces autour du=
programmer5000

1

tcl, 18

file delete $argv0

démo - ATTENTION: Ce n'est qu'une démo unique! Ce n'est que la première fois qu'il sera exécutable. Veuillez le réserver sur l'affiche originale de la question. Pour essayer: appuyez sur le Executebouton. La zone verte ne signalera aucune erreur. Après cela, tout clic ultérieur sur le Executebouton entraînera une not founderreur!


1

C, 32 octets

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

1
Les }s manquants sont autorisés en C? Hou la la!
CalculatorFeline

Non, juste une faute de frappe! Mon nombre de caractères incluait la fermeture, }mais j'ai apparemment copié / collé l'extrait incorrect. Merci de l'avoir signalé!
Josh

Eh bien, comme l'électeur anonyme n'a pas envie de laisser un commentaire ou de retirer son vote, j'ai supprimé ma réponse, que j'ai basée sur la vôtre. Vous pouvez jouer au golf jusqu'à 29 octets:main(c,v)int**v;{remove(*v);}
MD XF

@MDXF Je ne sais pas si le passage char**à int**est techniquement valide. Je m'inquiète des problèmes d'alignement potentiels.
Josh

1
@Josh Well; ça marche ... donc je ne vois pas pourquoi pas. Le golf de code consiste à utiliser des méthodes horribles qui ne sont pas techniquement valables.
MD XF

1

JavaScript (ES6), 13 octets

f=_=>delete f

Essayez-le

Enregistre la source de f, appelle f(qui supprime f), tente de se reconnecter fmais renvoie une erreur car elle fn'est plus définie.

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



0

Julia - 25 octets

Écrivez ceci dans un fichier, puis incluez le fichier avec include("<filename here>")et exécutez f():

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

Il s'agit, évidemment, d'une fonction - je ne sais pas comment on pourrait détecter le nom de fichier d'un fichier en cours d'exécution directement (en tant qu'instruction include sans définition de fonction).


0

C ++, 137 octets.

Fonctionne la plupart du temps sur 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 octets

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

Le plus souvent?
Addison Crump

1
Vous pouvez économiser beaucoup d'octets en supprimant les #include <string>espaces inutilisés , en supprimant les espaces superflus et en créant ce C, qui vous permet de supprimer le intet return. De plus, vous devez #include <stdio.h>faire ce travail, car c'est là que sprintfest déclaré.
Mego

0

MATLAB, 36 octets

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

Enregistrez le code ci-dessus en tant que fichier m en suivant les directives de Matlab sur les noms de fichiers.


0

VBA, 69 67 octets

Sous-programme qui ne prend aucune entrée et se supprime.

Nécessite que le code ci-dessous soit la première ligne du volet de code actif et que VBA dispose d'un accès approuvé au modèle de projet VBE.

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

-2 octets pour remplacer ActiveCodePanepar parCodePane(1)


0

T-SQL, 28 octets

CREATE PROC d AS DROP PROC d

Il supprime / supprime simplement la procédure et le code lors de son exécution. Usage:

EXECUTE d

0

shortC , 10 octets

Aremove(*@

Comment ça marche:

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

Programme C équivalent:

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

0

Code machine 8086/8088, 1 octet

aa    stosb

Hypothèses:

  • Les registres CS, IP, ES, DI et AL sont tous initialement 0.
  • Ce code est placé à l'adresse 0.

le stosb instruction stocke l'octet dans le registre AL à l'emplacement de mémoire indiqué par ES et DI, puis incrémente ou décrémente DI. Dans ce cas, il stocke l'octet 0 à l'adresse mémoire 0, qui se trouve être là où se trouve l'instruction elle-même.

Certes, ce programme ne supprime pas un fichier ou quoi que ce soit. Mais si vous parvenez à mettre la main sur un processeur 8086, mettez ce programme en mémoire et exécutez-le, il se remplacera en fait.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.