Autrement dit, votre objectif est de créer un programme complet qui modifie son propre code source jusqu'à ce que chaque caractère de la source soit différent de ce qu'il était au départ.
Veuillez inclure la source de début ainsi que la source de fin dans votre message, ainsi qu'une description. Par exemple, décrivez ce que fait (autrement) votre programme, le langage que vous avez utilisé, votre stratégie, etc.
Règles
- Votre programme doit s'arrêter quelque temps après la fin de la modification.
- Il doit en fait modifier son propre code source en cours d'exécution (pas nécessairement le fichier que vous avez passé à l'interpréteur, il modifie ses instructions), ne pas imprimer un nouveau programme ou écrire un nouveau fichier.
- Les failles standard ne sont pas autorisées.
Le programme le plus court gagne.
Si votre langue peut modifier son propre fichier et exécuter un nouveau processus de compilation, mais ne peut pas modifier son propre code source (en cours d'exécution), vous pouvez écrire un tel programme à la place avec une pénalité de + 20% octets, arrondie. Les vrais langages auto-modifiants devraient avoir un avantage.
Edit : Si votre programme s'arrête avec des erreurs, veuillez le spécifier comme tel (et peut-être dire quelles sont les erreurs.)
la source
Réponses:
/// , 1 octet
Le programme trouve un
/
(le début d'un groupe de remplacement de modèle) et le supprime en préparation pour effectuer le remplacement. Ensuite, il atteint EOF, donc il abandonne et s'arrête.la source
Labyrinthe , 2 octets
Le
>
fait pivoter la source pour qu'elle devienneLe pointeur d'instruction est maintenant dans une impasse et se retourne pour frapper le
@
qui termine le programme.Bien sûr,
<@
cela fonctionnerait aussi.la source
Python 2, 225 octets
Le code source de fin est une chaîne de
"0"
s dont la longueur est égale au nombre d'octets dans l'objet de code compilé d'origine.Le code trouve l'objet de code en cours d'exécution
sys._getframe().f_code.co_code
et crée une structure qui représente les objets chaîne de python. Il obtient ensuite la mémoire que le code prend réellement et la remplace"0"*len(c)
.Lorsqu'il est exécuté, le programme se termine avec le retraçage suivant:
Cela montre que l'écrasement a réussi et que le programme meurt parce qu'il
0
n'est pas un opcode valide.Je suis surpris que cela soit même possible en python, les objets frame sont en lecture seule, je ne peux pas en créer de nouveaux. La seule chose compliquée que cela fait est de changer un objet immuable (une chaîne).
la source
"1"
chaîne dans le code ne fait pas partie du «code», c'est juste une constante à laquelle se réfère le bytecode. Ce que je change en fait, ce sont les opcodes de machine virtuelle python compilés, pas les constantes ou les variables. Donc ce que je change n'est pas le code source proprement dit, juste le code compilé. Je pouvais changer le code source tel qu'il était stocké, mais cela n'affecterait pas réellement le code au moment de l'exécution car il aurait déjà été compilé. Si vous le vouliez, je pourrais poster ceci dans un «opcodes Python 2.7 compilés avec des constantes», mais ce serait idiot IMO."1"
à<backtick>1+1<backtick>
seulement 2 octets1+1
de ma suggestion est transformé en un2
dans la version compilée ... Le compilateur est trop intelligent pour son propre bien!mal , 1 octet
evil a plusieurs magasins de mémoire - l'un est le code source lui-même et l'autre est la roue qui est une file d'attente circulaire qui est initialisée à un seul zéro.
q
échange le code source et la roue, de sorte qu'il remplace la source par un octet nul. Cependant, seules les lettres minuscules sont de véritables opérateurs dans le mal, de sorte que le caractère est simplement un no-op et le programme se termine.la source
MSM , 8 octets
Transforme le code source en
pqpqpqpq
MSM fonctionne sur une liste de chaînes. Les commandes sont prises depuis la gauche et elles traitent le côté droit comme une pile. MSM fonctionne toujours sur sa propre source.
Trace d'exécution:
la source
Malbolge, 1 ou 2 octets.
Le langage Malbolge "crypte" chaque instruction après l'avoir exécutée, donc cette lettre (Malbolge NOP) deviendra un
!
(qui est aussi un nop), puis se terminera. Pour une raison quelconque, l'interpréteur Malbolge que j'utilise nécessite deux octets pour s'exécuter, ce qui donneDC
(les deux étant nops) devenant!U
(les deux étant également nops)Modifier: l'état initial de la mémoire Malbolge dépend des deux derniers caractères du code, il n'est donc pas bien défini pour les programmes à un caractère. (Bien que ce code ne se soucie pas de l'état initial de la mémoire)
la source
x86 asm - 6 octets
Je ne sais pas si "jusqu'à ce que chaque caractère de la source soit différent de ce qu'il a commencé comme" fait référence à chaque octet, à chaque modification némonique ou générale. si je ne suis pas valide, je peux changer le xor en un xor de répétition pour que chaque bit change les valeurs mais espérait ne pas le faire pour économiser 6 octets de plus pour rester au moins un peu comparable à ces langages de golf spécialisés.
Tout cela ne fait que changer un c2 en un c3 retn en obtenant l'adresse live de eip et xoring 5 octets en face.
la source
SMBF , 92 octets
Peut être joué au golf, et je vais probablement y travailler plus tard.
Explication
Le programme génère les commandes suivantes à la fin de sa bande pour s’effacer, il doit donc générer les valeurs suivantes sur la bande:
Faites un tas de
91
s, avec des_
valeurs nulles (affichées comme ) entre à utiliser pour les valeurs temporaires.Ajustez les valeurs par les différences
La bande après l'exécution sera entièrement composée de zéros, à l'exception du code généré
[_[_-_]_<_]
.Remarque:
Ce programme m'a fait réaliser que mon interprète Python pour SMBF a un bogue ou deux,
et je n'ai pas encore trouvé de correctif.C'est réparé maintenant.la source
Emacs Lisp 22 octets
Exécutez à partir de REPL:
La fonction est désormais évaluée à
nil
.Alternativement (se délier) 30 octets
Évaluer et erreurs comme
void-function
. La fonction existait avant d'être exécutée.la source
Redcode , 7 octets, 1 instruction (Juste un exemple. Pas en compétition)
Ceci est un exemple trivial.
Déplace l'emplacement de mémoire suivant sur lui-même, puis s'arrête (car toute la mémoire est initialisée à
DAT 0 0
, ce qui arrête le programme lorsqu'il est exécuté.)la source
Powershell 65 octets
Définissez une fonction qui se réécrit en null.
Évaluez-le une fois et il s’élimine.
Alternativement (se supprime de la mémoire) 36 octets
L'appeler d'abord le supprime puis tente d'évaluer de manière récursive. Erreur en tant que commande inconnue.
la source
MIXAL, 6 octets (comptant 2 onglets)
Le programme démarre à l'emplacement de mémoire 0, puis écrit 0 à l'emplacement de mémoire 0, s'effaçant ainsi lui-même. La machine s'arrête automatiquement.
Il s'agit du langage d'assemblage de l'ordinateur hypothétique MIX de Donald Knuth, qui peut être assemblé et exécuté à l'aide du kit de développement GNU MIX ( https://www.gnu.org/software/mdk/ ).
la source
> <> ,
403430 octetsEssayez-le ici!
Explication:
Fondamentalement, cela met un tas de 3 blocs de caractères dans la pile comme suit: (ypos, xpos, caractère ASCII) qui est inversé à la fin de sorte que la commande finale 'p' se lit (caractère, xpos, ypos) et définit cette position dans le code à ce caractère. Le premier caractère est défini manuellement comme «<», de sorte que le code finit par être «> p <» à la fin pour boucler la commande. Ensuite, chaque autre caractère est remplacé par un '', y compris le caractère p. Le '' est en fait "ASCII CHAR 0" qui n'est PAS un NOP et donnera une erreur lors de la lecture.
Il doit également y avoir un nombre impair (?) De caractères avant la commande 'p', sinon il ne sera pas rebouclé une dernière fois et écrasé.
la source
Lot, 11 octets
Modifie le code source en
ECHO is on.
Le
@
est là pour que la commande ne soit pas répercutée, mais surtout pour que les deuxecho
ne s'alignent pas.la source
@
peut être supprimé, carECHO
(majuscule)! =echo
(minuscule)echo
s ne peuvent pas s'aligner.Jolf, 4 octets, sans concurrence
Ceci
₯S
ets la₯C
valeur de l'élément ode à l'entrée,undefined
car aucun n'est donné. Essayez-le ici!la source
(Système de fichiers) Befunge 98, 46 octets
Notez que ce programme crée et manipule un fichier nommé
a
. Comment ça fonctionne:a
contenant le code entier (jusqu'à 256 caractères dans chaque dimension) décalé d'un espace vers le haut et deux vers la gauche.a
comme une seule ligne, remplaçant la première ligne entière par le contenu dua
fichier.a
fichier dans la deuxième ligne a décalé de deux places vers la droite.Comme effet secondaire, le code source final n'est même pas valide Befunge! (car il contient des sauts de ligne sous forme de données sur une seule ligne)
la source
Python 2, 238 octets + 20% = 285,6
Fondamentalement, cela bascule l'encodage du fichier actuel de la source python entre
ascii
etutf-8
, changeant ainsi essentiellement chaque caractère de la source!la source
) as
->)as
,) else
->)else
,"utf-8"if
,'w',encoding
.