Code qui ne sera exécuté qu'une fois

223

Objectif

Le but de ce défi est d’écrire du code qui ne s’exécutera qu’une fois. Cela signifie fondamentalement que cela endommage le programme, le script ou l'environnement d'une manière ou d'une autre. Si le redémarrage du système permet au code de s'exécuter à nouveau, cela est autorisé.

Notation

Nombre de voix Toutes les hypothèses doivent être clairement énumérées. Toute réponse qui déclenche un redémarrage ou une interruption sera disqualifiée.

Règles additionnelles parce que Greg Hewgill est un demi-dieu

Aucun accès root n'est autorisé.

Date de fin

Le concours se terminera le 31 mai 2014.

Modifier

Ce concours a été changé en concours de popularité.

ojblass
la source
7
@PeterTaylor pourrait être une solution mais le résultat montre que ce n'est pas le seul.
Lukei
101
Pour un grand nombre de personnes appelant vidans un environnement de terminal unique, cet effet est impossible, sauf si vous redémarrez :) Juste une blague ici.
orion
6
Le site est gratuit pour vous permettre de proposer une telle question.
Ojblass
16
echo "If you try to execute me again, it means you are an idiot.";<- Personne ne va exécuter plus d'une fois: P
user3459110
25
Les logiciels liés aux missiles seraient-ils qualifiés? ;)
résumé le

Réponses:

518

Veillée

Enfin un cas d'utilisation pour Vigil!

def main():
  raise Exception()

Extrait de la "spécification du langage":

Il va sans dire que toute fonction qui lève une exception non capturée est fausse et doit être punie.

...

Si un serment est brisé, la fonction fautive [...] sera dûment punie.

Comment?

Simple: il sera supprimé de votre code source.

La seule façon de s’assurer que votre programme répond à ses exigences est d’interdire absolument tout code qui échoue. Avec Vigil, cela se fera automatiquement pour vous .

Il existe d'autres moyens de le faire, car Vigil fournit les mots-clés imploreet swearconstitue essentiellement le serment de respecter certaines conditions préalables et postérieures:

def main():
  swear 0 > 1
Martin Ender
la source
116
Cela mérite sans aucun doute de gagner.
Matteo Italia
77
Enfin, un langage suffisamment vigilant pour l’ère moderne! Je vais commencer à l'utiliser en production. Tous les bugs doivent être purgés.
Claudiu
13
Pour moi, il semble que ce ne soit pas nécessairement la faute de la fonction qui lève une exception non capturée, il se peut également que les fonctions de la pile d'appels soient négligentes parce qu'elles ne l'ont pas interceptée. Cela pourrait même suggérer que l'architecture de l'ensemble de l'application est défectueuse (car il n'y a peut-être aucun moyen de gérer correctement cette exception sans restructurer le code?) En bref, l'ensemble du programme devrait être supprimé.
Jonathan Pullano
10
@JonathanPullano, vous n'êtes pas le premier à le remarquer ;)
Martin Ender
32
Des points supplémentaires pour jurer. Un programme qui fait une fausse déclaration confiante doit sans aucun doute être éliminé.
orion
293

Pratiquement toutes les distributions Linux, 9 caractères

Celui-ci est un classique!

#!/bin/rm

Mettez ceci dans un fichier et lancez-le:

> ed
a
#!/bin/rm
.
wq foo
> ls
Mail mbox foo
> chmod 777 foo
> ./foo
> ls
Mail mbox

Aaand c'est parti!

Quant à ce qui se passe: je cours vraiment rm! #!s'appelle un shebang . Et si vous mettez l'un de ceux-ci suivi d'un chemin d'accès à un exécutable comme première ligne de votre script, le programme chargera votre fichier de script avec tout ce que vous avez écrit - la valeur par défaut est habituellement #!/bin/bashou #!/bin/sh(shell Bourne-again / Bourne) . Le premier argument transmis à ce script sera le nom du fichier lui-même (c'est pourquoi vous voyez tant de solutions, y compris %0ou $0et j'aime dans ce domaine); Ainsi, en faisant en sorte que mon fichier soit contenu #!/bin/rmet en l'exécutant, je ne fais que transmettre le nom de fichier de mon fichier rm.

Flonk
la source
9
Sans jamais avoir utilisé Linux moi-même, je pense que cela supprime le fichier script.
urous
56
@NateKerkhofs la #!séquence commence un shebang, qui identifie quel interprète vous allez utiliser pour le script - normalement /bin/bash. Ici, Flonk a utilisé /bin/rmcomme "interprète". rmest un programme qui supprime des fichiers. Parce que Linux pense que nous voulons rmêtre un interprète, il lui passe le nom du fichier comme argument. par conséquent, le fichier se supprime lui
19
C'est hystérique
ojblass
25
@ user80551 Je n'ai pas besoin d'un accès root pour cela.
Flonk
9
hmm ..../foo mbox
Izkata
241

binaire x86, 4 octets

F0 0F C7 C8

Hypothèse: doit être exécuté sur un processeur P5 Pentium.

L'instruction ci-dessus est communément appelée le bogue F00F . Il tente d'exécuter une instruction non valide, préfixée par lock .

Cela gèle complètement le processeur (pas d'arrêt ni de redémarrage) et ne nécessite même pas d'accès root.

Dennis
la source
4
Wow ... c'est vraiment intéressant.
Ojblass
31
@JackM: Ce sera le cas, mais c'est explicitement autorisé dans la question.
Dennis
34
@JackM, cela semble être un excellent moyen d'empêcher l'exécution du "script".
Paul Draper
5
Je me souviens quand ce virus faisait le tour. Une solution de contournement kernelside a été trouvée presque immédiatement - elle ne plantera pas l'ordinateur à moins d'exécuter un système d'exploitation sans le correctif.
dimanche
3
@RosLuP 209 différents utilisateurs, apparemment. Si vous n'êtes pas d'accord, votez vers le bas et avancez.
Dennis
150

Bash, 5

>"$0"

Se tronque à zéro.

Si le nom de fichier ne contient pas d'espaces, >$0fonctionne pour 3 caractères !


la source
2
En fait, les guillemets ne sont jamais nécessaires pour une variable utilisée dans un nom de fichier de redirection comme celui-ci, même si le programme ou le chemin d'accès au programme contient des espaces, en raison d'un cas particulier dans les règles d'analyse syntaxique du shell. Donc, vous pouvez toujours le faire en 3 caractères!
apenwarr
3
@apenwarr indique "$ 0: redirection ambiguë" sans guillemets et le nom du fichier contient des espaces
1
@apenwarr, cela est nécessaire si le shell qui interprète ce script est basé sur ksh88 ou bash n'est pas en mode posix. Ce n'est pas une question d'espace, il s'agit de n'importe quel caractère de $IFSbash et de joker pour bash et ksh88. Un script de moins-que-rien sera généralement interprété par le système sh, mais certains shells, y compris bash et ksh88, les interpréteront à la place.
sch
144

gzip

#!/bin/gzip

Trop d'ennuis pour les personnes habituées aux outils de ligne de commande non destructifs, détruit gzippar défaut le fichier d'origine en le remplaçant par une version gzippée (ajout d'un suffixe).

Ceci est une variante de l' #!/bin/rmoption, sauf que celle-ci est récupérable par une intervention humaine manuelle (appelez gunzip-la). En prime, le fichier résultant est beaucoup plus long que l'original (la différence dépend de la longueur du nom du fichier).

Attention: l'emplacement de gzippeut varier.

EDIT: comme l'a souligné WChargin, c'est plus portable:

#!/usr/bin/env gzip

Le reste du fichier peut avoir n'importe quel contenu. C'est essentiellement un fichier qui, lorsqu'il est appelé, se cache dans une boîte et refuse de sortir jusqu'à ce que vous le décompressiez de force.

orion
la source
7
Je n'y avais jamais pensé auparavant, mais vous avez absolument raison.
ojblass
très intéressant
Grijesh Chauhan
11
"Attention: l'emplacement de gzippeut varier" - ce n'est pas du code-golf , vous pouvez donc l'utiliser#!/usr/bin/env gzip
wchargin
37
+1 juste pour It's essentially a file that, when called, hides itself in a box and refuses to come out until you forcibly unpack it.You made my day, et il est 1h du matin.
applaudir le
Il s'agit essentiellement d'un fichier qui, lorsqu'il est appelé, se cache dans une boîte et refuse de sortir jusqu'à ce que vous le décompressiez de force. m'a fait rire. : D
Mischa
121

Bash, 13 12

Pas le plus court, mais il ne supprime pas le fichier et ne rend pas le système inutilisable.

chmod 0 "$0"

Si le nom de fichier ne contient pas d'espaces, vous pouvez supprimer les guillemets pour enregistrer 2 caractères.

Explication

Il supprime toutes les autorisations ( rwx) de lui-même. Lorsque vous essayez de l'exécuter, ou même d'afficher son code, une seconde fois, sans restaurer manuellement les autorisations, il affichera quelque chose comme:

bash: <FILENAME>: Permission denied

Restaurez les autorisations avec

chmod +rwx <FILENAME>

Ancienne version

Supprime seulement les permissions d'exécution, mais un caractère plus long (c'était une question de avant qu'elle ne soit modifiée en ):

chmod -x "$0"

Version sournoise de Łukasz Niemier

#!/bin/chmod 0

la source
4
chmod 0travaille aussi
gnibbler
@gnibbler thnx, ajouté
Je pense que vous pouvez appeler le programme aet économiser encore 3 caractères:chmod 0 a
le
@tohecz c'est tricher mais
5
Encore plus agréable#!/bin/chmod 0
Hauleth
112

Code machine 6800 - 1 octet

0xDD

Ceci est connu comme HCF ou Halt and Catch Fire

gnibbler
la source
78
Eh bien, les règles disent "Toute réponse qui initie juste un redémarrage ou un arrêt sera disqualifiée", mais cela ne déclenche pas simplement un arrêt, car cela prend également feu. Ainsi, +1!
Trejkaz
94

Shell + sed, 16 octets

Pas aussi destructeur que certaines des autres réponses ;-)

Ce script insère un commentaire #au début de chaque ligne:

sed -i s/^/#/ $0
Trauma numérique
la source
3
Que diriez- sed -i g $0vous
Seshoumara
91

Commodore 64 BASIC

Celui-ci ne supprime pas le programme.

1 POKE 2048,1

Auto-destruction

Selon la mappe de mémoire du Commodore 64 , l'adresse 2048est inutilisée, mais elle doit contenir une valeur 0telle que le programme BASIC puisse être exécuté.

Danko Durbić
la source
1
Poke déplace-t-il simplement une variable vers un emplacement?
Ojblass
12
@ ojblass oui, efficacement. poke a, best équivalent au code C *((unsigned char *)a) = b;.
Jules
4
Je voudrais visualiser mes pokes FaceBook de cette façon!
Sunny R Gupta
3
Oh wow ... je me souviens de PEEK et POKE de C64 BASIC!
J'écrivais
note de côté: un 0octet est utilisé pour marquer la fin des lignes de code; donc l'adresse 0x800 en a probablement besoin pour marquer le début de la première ligne de code.
Titus
89

Hypothèse: exécuter Solaris, connecté en tant que root

killall
Greg Hewgill
la source
3
Solaris a-t-il vraiment une telle chose?
ojblass
21
Oui, il fait exactement ce qui est écrit et tue tous les processus en cours.
Greg Hewgill
un vote positif pour vous!
Ojblass
9
1, la question mentionne qu'aucun accès root n'est autorisé.
user80551
119
@ user80551 il est la raison de cette règle.
Seiyria
68

Python, 18 ans

open(__file__,'w')

Tronque le fichier en l'ouvrant en mode écriture seule.

segfaultd
la source
14
Juste au cas où vous seriez sérieux, il s’ouvre tout seul ( __file__fait référence à son propre nom de fichier). L'ouverture en wmode tronque le fichier, le supprime fondamentalement.
Bob
7
Je pense que la troncature a lieu à l’ouverture, mais quel que soit le runtime Python, il devrait vider tous les fichiers ouverts à la fin du programme, et Python ou le système d’exploitation les fermera à la fin du processus. Bien sûr, il est généralement bon de fermer explicitement les poignées ouvertes lorsque vous avez terminé.
Bob
5
La "bonne" façon de gérer les fichiers en Python est avec ... er, avec. with open("myfile.txt","r") as thefile:et ensuite votre code de gestion de fichier fermera automatiquement le fichier lorsque vous aurez terminé.
Schilcote
1
Cela pourrait être réduit à quelque chose comme open("f.py","w").
Ethan Bierlein
1
Ne pas cesser de travailler tant que .pyc reste
minmaxavg
66

Lot: 5 octets

%0|%0

C'est fondamentalement le forkbomb pour Windows.

L'application commence son premier argument deux fois. Ne l'exécutez pas dans un environnement productif;)

Knerd
la source
83
Existe-t-il un environnement Windows productif? (Je plaisante bien sûr).
orion
17
ça a l'air si innocent!
Ojblass
15
Ok, certainement n'essaye pas ça. Ça ne s'est pas bien passé.
Rmobis
75
Vous n'avez pas le représentant à voter, mais cela viole "ne fonctionne qu'une fois" de la manière la plus sévère possible.
Xan
14
Je crois qu'un humain ne l'exécute qu'une fois et qu'il est admissible.
Ojblass
54

JavaScript

localStorage.x = eval(localStorage.x + localStorage.x)

La première fois que vous l'exécutez, tout se passera bien:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
NaN

Si vous essayez de l'exécuter davantage (même si vous actualisez), vous obtiendrez une erreur:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
ReferenceError: NaNNaN is not defined
Casey Chu
la source
5
Donc, si vous le lancez souvent, vous obtenez le thème Batman. +1 pour cela.
Hankrecords
2
@Hankrecords Malheureusement, pas vraiment, car cela ne sera pas exécuté plus tard ...
RedClover
@ Soou Bummer ...
Hankrecords le
@Hankrecords sauf si vous supprimez eval, mais il ne remplira pas ce défi
RedClover
46

Le système d'exploitation CMS d'IBM, qui est un système d'exploitation mono-utilisateur qui s'exécute en tant qu'invité sous le VM Hypervisor d'IBM, possède une structure de fichier intéressante.

Les fichiers se composent de trois éléments: nom de fichier, type de fichier et mode de fichier. Le mode de fichier est constitué de deux éléments, un seul alphabétique, qui, pour faciliter l’explication, peut être considéré de la même manière que la lettre de lecteur pour Windows / MS-DOS, ainsi qu’un seul chiffre.

Le chiffre numérique unique a une signification, http://publib.boulder.ibm.com/infocenter/zvm/v5r4/index.jsp?topic=/com.ibm.zvm.v54.dmsa3/hcsd0b10127.htm , et pour cette tâche c'est le chiffre 3 qui est intéressant:

Numéro de
mode de fichier 3 Le numéro de mode de fichier 3 signifie que les fichiers sont effacés après leur lecture. Vous pouvez utiliser le mode de fichier numéro 3 si vous ne souhaitez pas conserver de copies sur vos minidisques ou dans vos répertoires SFS.

Passez donc des heures à rédiger votre script et à le classer sous «LOST FOREVER A3». Exécutez-le, cela fonctionne la première fois. Partis à la maison, travail bien fait.

Remarque, aucun message indiquant l’effacement n’est produit. Après tout, tout le monde sait ce que cela 3signifie, n'est-ce pas?

C’est bien sûr très utile. Une fois les tests terminés, vous pouvez utiliser le 3pour les fichiers temporaires sans avoir à nettoyer, car ce sont des fichiers à lecture unique.

Bill Woodger
la source
44

Commodore 64 BASIC

0 NEW

NEW supprime le programme.

Danko Durbić
la source
1
Qu'est ce que c'est?
Dark Egregious
3
@ user973810 si je me souviens de base, nouveau est pour le nettoyage de la mémoire, il va donc supprimer le programme
user902383
3
Agréable. Non spécifique à Commodore 64, fonctionne probablement tel quel sur presque toutes les machines BASIC 8 bits des années 80 ...
jeudi
Vous pouvez aussi utiliser OLD ou O. back. J'ai découvert 12 mois de génie du codage de jeu pour les 12 ans; p fonctionne une fois par accident. Puis sauvé accidentellement au lieu de vieux. O. ne fonctionnait plus :( J'ai appris comment les éditeurs hexagonaux travaillaient assez bien. :)
Matt Warren
3
@ SYSAP: Ce serait plus portable s'il utilisait 1 comme numéro de ligne; toutes les implémentations BASIC ne
prennent
41

Bash, 12

Note: Ceci est destructif.

:(){ :|:&};:

C'est la populaire bombe à la fourche. Il consomme de manière exponentielle toute la mémoire et les PID bloquant le système. Un redémarrage brutal permettra de réexécuter le code, mais pourquoi voudriez-vous le faire?


Bash, 10

:(){ :&};:

Pour deux caractères en moins, cela consomme votre mémoire linéairement.


Bash, 7

w;PATH=

w est choisi comme l'exécutable le plus court auquel je pouvais penser.

Cela efface simplement la variable de chemin afin que le shell ne puisse pas trouver /usr/bin/wla prochaine fois. Le redémarrage du shell le corrige car le chemin est généralement stocké dans~/.profile

utilisateur80551
la source
Darn it: DI vient d'avoir la même idée: P
Knerd
1
:(){ :&};:ne devrait pas manger votre mémoire. Il s’arrête dès que la fourche est lancée, ce qui fait qu’il n’ya que de l’ O(1)activité. Vous avez fait while(fork());, ce qui mangerait votre mémoire linéairement équivaut à fork(); while(1);.
marinus
26
Hou la la! Ce sont des émoticions mortelles! Je ferais mieux de ne pas appeler mon ordinateur bown frownyface :(){ ....
Level River St
1
Si je me souviens bien ... la bombe fourchette laisse périodiquement un PID ouvert. Le script peut être exécuté à nouveau dans cet intervalle ... et si cela ne compte pas, il est possible de tuer tous les forks avec un peu d'effort. Le redémarrage est simplement la solution la plus simple.
Brilliand
11
Je ne pense pas que cela soit admissible. Cela n'empêche pas le script de s'exécuter à nouveau, mais garantit qu'il s'exécutera à nouveau (plusieurs fois).
Ben Voigt
20

C #

Code le plus court pour se supprimer

Process.Start(new ProcessStartInfo("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location + "\""));

Code pour le rendre invisible dans l'interface utilisateur

Process.Start( new ProcessStartInfo()
{
    Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location+"\"",
    WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, FileName = "cmd.exe"
});
BenVlodgi
la source
7
Enfin, une réponse en C #!
Pharap
Pourquoi le choix est-il requis?
Wizzwizz4
19

C ++ 71

Le fichier exécutable "golf" se voit refuser l'autorisation de s'exécuter la prochaine fois.

#include <stdlib.h>
int main()
{
system("chmod a-x golf");
return 0;
}

JavaScript / HTML 137, 145 avec test de la console

<script id="s"> 
function h(){
console.log(1);
var s=document.getElementById("s");
h=s.innerHTML;
h=h.replace("h","g");
s.innerHTML=h;
}
bacchusbeale
la source
11
@Templar dans le contexte de JavaScript, je pense que l'actualisation de la page compte pour un redémarrage (peut-être?)
2
Même si vous ne supprimiez pas le script de la page, il ne serait toujours exécuté qu'une fois. Cela ne sert à rien.
nderscore
2
@nderscore On dirait que la fonction h est ce qui ne sera exécuté qu'une fois. Vous devez en fait l'appeler ailleurs (comme si vous exécutiez un programme, je suppose). Dis <button onclick="h();">.
Bob
4
Étant donné que le rechargement de la page est autorisé et que votre objectif est d'empêcher que h ne soit exécutable plusieurs fois alors qu'il est déjà chargé, qu'est-ce qui ne va pas function h(){h=0}?
Keen
1
Avec #include <sys/stat.h>vous, vous pouvez accéder chmoddirectement à la fonction en économisant quelques octets ( <stdlib.h>plus nécessaire, ni plus system). En outre, non returnest nécessaire.
Ben Voigt
19

Mon nom est Shell ... PowerShell

Message classique autodestructeur:

@'
##################################
Project X is a go

Meet Eagle 1 at WP Alpha

Further comms is hereby prohibited
##################################
This message will self destruct in 
5 seconds
'@
5..1| %{$_;Sleep 1;}
"Goodbye"
rm $(.{$MyInvocation.ScriptName})
SomeShinyObject
la source
Explication, s'il vous plaît?
nozɐɹƆ
@ noɥʇʎԀʎzɐɹƆ Les lignes jusqu'à 13 ne sont que des bêtises. Après cela, comme tout autre shell, PowerShell charge le script en cours d'exécution dans la mémoire et n'a donc plus besoin du fichier de script d'origine ... il est donc supprimé.
SomeShinyObject
18

Bash (5)

rm $0

En supposant que vous n'avez pas d'espaces dans le nom du fichier.

marinus
la source
40
C'est pourquoi Unix est meilleur que Windows: rm au lieu de vous enregistrer un octet.
MadTux
1
@MadTux, je préfère * nix à Unix.
Wizzwizz4
14

sh

#!/bin/sh
curl http://runonce.herokuapp.com/

Ne fonctionnera qu'une seule fois (et le message "Hello, world!" S’il fonctionne), même si vous réinstallez le système et remettez le script à nouveau.


EDIT: Je pensais publier un script derrière runonce également. Rien de spécial, car ce n'était pas censé être publié de toute façon, mais peu importe.

<?php
$db = pg_connect("[connection information]");
$ip = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];

pg_query("DELETE FROM users WHERE time < now() - interval '1 day'");

$result = pg_query_params($db, "SELECT * FROM users WHERE ip = $1 LIMIT 1", array($ip));

if (!pg_fetch_row($result)) {
    echo "Hello, world!\n";
    pg_query_params($db, "INSERT INTO users (ip) VALUES ($1)", array($ip));
}

Ainsi que le schéma de base de données

CREATE TABLE users (
    ip inet PRIMARY KEY,
    time timestamp with time zone NOT NULL DEFAULT now()
);
CREATE INDEX ON users (time);

Les données sont stockées dans la base de données Heroku, n'hésitez pas à consulter leur politique de confidentialité si vous le souhaitez. Je ne vérifie pas les données stockées dans une base de données, elles le sont uniquement pour permettre au code de s'exécuter une fois.

Konrad Borowski
la source
4
Je dirais que cela fonctionnera plusieurs fois, cela ne produira aucun résultat après le premier.
Brilliand
5
Cela n'a même pas une fois montré "Hello World" pour moi.
Paŭlo Ebermann
1
@ StéphaneGourichon: Oui, il se souvient des adresses IP et il n'y a aucun moyen de supprimer une adresse IP avant son retrait automatique. J'ai décidé de mettre le code source, afin que vous puissiez vérifier ce qu'il fait.
Konrad Borowski
1
@ StéphaneGourichon: pg_query_paramsprotège assez bien de l'injection SQL. Toutefois, il ne sera pas enregistré, car il '; DROP TABLE users;--ne s'agit pas d'une adresse IP valide ( inetaccepte uniquement les adresses IP). Par conséquent, si vous avez un faux en- X-Forwarded-Fortête, votre visite ne sera pas enregistrée. Je ne considère pas cela comme un problème moi-même.
Konrad Borowski
2
Je pense qu’il s’agit d’une violation d’une échappatoire standard: externaliser la vraie réponse .
juniorRubyist
12

PHP, 22 20 caractères

<?=unlink(__FILE__);

EDIT: Suppression de deux caractères à la fin par commentaires.

geai
la source
2
Ceci peut être encore simplifié comme: <?unlink(__FILE__);la traîne ?>n'est pas nécessaire
leepowers
Vous devez commencer avec <?=ou la balise de début n'est pas reconnue.
Michael Mior
2
PHP se détruisant ... ha! E_NOTICE line 3048
métadings
<?+ l'espace est également ok. Vous ne pouvez pas utiliser une lettre après la balise courte.
Titus
11

Ruby, 14 ans

Il réécrit le code source sous le nom du programme.

IO.write $0,$0
Mhmd
la source
3
Et si le programme s'appelle "IO.write $ 0, $ 0"? "Hypothèse: nommez le programme quelque chose qui n’est pas un code valide dans aucune langue."
Brilliand
@Brill, un programme ruby ​​doit toujours se terminer par .rbet même si son nom est "IO.write $ 0, $ 0 # .rb", cela ne fonctionnera pas car lors de l'écriture, il inclura le chemin d'accès complet.
Mhmd
3
@Mhmd Un programme Ruby peut se terminer par n'importe quoi. Par exemple gemet irbsont des programmes Ruby sans extension.
bfontaine
@ bfontaine qui ont des shebangs. Cela ne veut pas.
Wizzwizz4
@ wizzwizz4 Les shebangs n'ont rien à voir avec l'extension. ruby fooet ruby foo.rbtravaillera la même chose avec ou sans shebang. ./fooet ./foo.rb(en supposant qu’ils soient exécutables) échouera sans shebang et réussira (en supposant que le code soit correct, etc.).
bfontaine
10

Lot (6 caractères)

En supposant que nous ayons la permission de supprimer le fichier, nous pouvons bien entendu le faire sous Windows (peut-être aussi MS-DOS).

del %0
Justin Krejcha
la source
10

Bash 9 8 personnages

nc -l 1&

Ne fonctionnera qu'une fois, car le port est bloqué pour toujours.

Falco
la source
1
Je pense que cela ne fonctionne pas, car 0c'est un port spécial (c'est réservé). Lorsque je lance ceci sur mon ordinateur, je peux l'ouvrir plusieurs fois. De plus, c'est un port < 1024, ce qui signifie qu'il nécessite un accès root pour être écouté.
heinrich5991
nc -l 1&résoudrait le problème avec 0un octet plus court, car le dernier espace n’est pas nécessaire.
Kasperd
@kasperd Merci pour l'entrée :-)
Falco le
@ heinrich5991 ok - il me faudrait 11 caractères sans accès root pour utiliser un port comme 9654
Falco
Vous voulez expliquer pourquoi vous avez voté?
Falco
9

NodeJS - 33 octets

require('fs').unlink(__filename);
cPu1
la source
Pouvez-vous décrire ce que cela fait pour ceux qui ne sont pas familiers avec la langue?
Kyle Kanos
1
@KyleKanos Il récupère le module du système de fichiers fset le nom de fichier actuel, __filenamepuis le supprime du système de fichiers.
Keen
7
Vous pouvez supprimer le point-virgule, car ils sont facultatifs en JavaScript.
nalply
8

Lot, 7 caractères

Enregistrez le travail non enregistré avant d'essayer cela.

Suppose un système 64 bits ou un système 32 bits avec <2 Go de mémoire RAM. Doit être enregistré dans un fichier .bat ou .cmd avant son lancement. Il ne suffit pas de le saisir dans cmd.exe.

^ nul<^

Il consomme un cœur de processeur complet et remplit votre mémoire RAM à une vitesse de plusieurs centaines de mégaoctets par seconde. Si vous ne l'arrêtez pas à temps (Gestionnaire des tâches), il utilisera chaque octet de RAM de votre ordinateur, tout votre système se figera et vous ne pourrez rien faire avant de forcer votre ordinateur à s'arrêter et à le redémarrer par découpage. alimentation ou en maintenant le bouton d'alimentation enfoncé.

Tous les crédits vont à txtechhelp sur StackOverflow, voir plus d’informations ici: https://stackoverflow.com/q/23284131/1955334

bilde2910
la source
Comment cela serait-il possible? Qu'en est-il de la pagination? Processus prioritaire ?
Nicolas Barbulesco
J'ai couru ce script, rien ne s'est passé.
Pavel
@Pavel Je suppose que c'est résolu dans Windows 10 alors. Je ne peux pas le reproduire sous Windows 10, mais cela fonctionne sous Windows 8.1.
bilde2910
1
"Il consomme un cœur de processeur complet et remplit votre mémoire RAM à une vitesse de plusieurs centaines de mégaoctets par seconde. Si vous ne l'arrêtez pas à temps (Gestionnaire des tâches), il consommera chaque octet de RAM de votre ordinateur, l'intégralité de votre système. va geler et vous ne pouvez rien faire avant d’arrêter de force et de redémarrer votre ordinateur en coupant l’alimentation ou en maintenant le bouton marche / arrêt enfoncé. " Cela ressemble à une histoire d'horreur pour les ordinateurs ...
no
7

Voici un couple. Contrairement à beaucoup, ceux-ci ne sont pas destructifs, juste créatifs et peu orthodoxes.

Frapper

#!/usr/bin/env bash
read <<< ''
printf "$REPLY" > "$0"

Celui-ci est assez simple. La variable $REPLYest créée implicitement par read, mais remplie d'une chaîne vide. Cette chaîne vide est ensuite printfinsérée dans le script en cours. C'est un équivalent assez obscur de ce qui suit:

#!/usr/bin/env bash
cat <<< '' > "$0" # probably a lot more portable

Lot Windows

copy con %0 < nul

La seconde copie essentiellement l’entrée de la console, lue depuis nul, dans le fichier actuel.

Isiah Meadows
la source
Publié après que cela soit devenu un concours de popularité
Isiah Meadows
1
Le premier ne fonctionnera pas sans autorisations root. Pourquoi essayez-vous de remplacer le périphérique nul? Lorsqu'il est exécuté en tant que root, le système se comportera de manière erratique. Vous écrasez également le null en écrivant :) Pourquoi ne pas le déplacer ailleurs? Tels que mv "$ 0" "$ {0} x" ou quelque chose? Ça devrait faire l'affaire.
orion
Le fichier existe-t-il toujours après?
Isiah Meadows
J'ai maintenant complètement changé l'exemple Bash.
Isiah Meadows
Comment ne sont-ils pas destructeurs?
YSAP
7

Sinclair BASIC

10 POKE 23635,255

Déplace l'adresse du programme BASIC en mémoire loin de l'endroit où elle devrait se trouver (203) afin que l'interpréteur trouve les données erronées.

kitcar2000
la source