Maintenant, nous savons tous que la plupart des langages ont des moyens très simples de «s'auto-modifier». Cependant, que se passerait-il si vous deviez réellement modifier le code et en éditer des parties ... sur le disque?
Votre objectif est de créer un code qui imprime un nombre, puis édite son propre fichier pour remplacer le numéro par le suivant dans la séquence de Fibonacci comme suit:
$ ./program
1
$ ./program
1
$ ./program
2
$ ./program
3
$ ./program
5
[etc...]
Règles
- Vous ne pouvez pas enregistrer le (s) numéro (s) "en dehors" du code. Aucun commentaire, aucun ordre de quitter le script, aucun EOF, etc.
- Si votre code fonctionne avec n'importe quel nom de fichier, soustrayez 2 de votre nombre d'octets et inscrivez
$BYTESNOW ($ORIGINALBYTES - 2)
votre titre. (Les noms de fichiers sont supposés être dans la plage de tout chemin de fichier alphanumérique.) - Votre code doit écrire la sortie dans le fichier seul, sans aucune assistance de tuyauterie externe.
- Votre code peut commencer à partir de un ou de zéro. Ça n'a pas d'importance.
perl6 program
), ou doit-il inclure la ligne shebang afin qu'il puisse être appelé comme./program
?program
, et pouvons-nous supposer qu'il se trouve dans le répertoire de travail actuel?"a"
place dearg[0]
. Cela ne semble pas en valoir la peine.Réponses:
Frapper,
5247 (49-2) octetsMODIFICATIONS:
Golfé
Tester
la source
-?
du regex. Et puisque vous y êtes, vous pouvez également supprimer le premier groupe de capture :)Python 2,
118111octets (113-2)Il fonctionne avec n'importe quel nom de fichier valide. Il n'y a pas grand-chose à expliquer ici, le code lui-même est très bavard.
Merci à FlipTack de me le rappeler, ce
close()
n'est pas obligatoire.la source
f=open(...)
place de lawith
déclaration?Lot, 81 octets
Remarque: la nouvelle ligne de fin est significative. Nécessite que le script soit appelé en utilisant son nom complet, y compris l'extension. La sortie commence à 0.
Étant donné que Batch ne peut pas modifier un fichier de manière réaliste, j'ajoute simplement des lignes supplémentaires à la fin du fichier, afin qu'il sache finalement quel est le prochain numéro à imprimer. L'
>>%0
emplacement enregistre un octet car je ne peux pas le faire précéder d'un chiffre.la source
C, 142 octets (144-2)
C'est assez simple. Tout d'abord, il lit puis enregistre les deux caractères à la position 0x1A dans l'en-tête. J'aurais probablement pu chercher plus profondément pour trouver un endroit plus sûr pour enregistrer les données, mais cela fonctionne pour moi sur ma machine exécutant OSX, compilé avec GCC 4.2ish et je doute qu'il soit très portable. De plus, comme il est basé sur des caractères, il déborde après la 13e itération.
Il donne la sortie:
la source
Node.js,
152137octets (139-2)Séparé par des sauts de ligne pour plus de clarté, ne fait pas partie du nombre d'octets.
Explication:
Usage:
la source
Python 3.6,
9691 (93-2) octetscoder en dur le nom de fichier permettrait d'économiser 5 octets (88 octets):
Enregistré quelques octets grâce à @Artyer
la source
a,b=0,1
f=open('f','r+');next(f);f.write(f'a,b={b,a+b}\n{next(f)}{f.seek(0)}');print(b)#
utilitaires bash + Unix, 43 octets (45-2)
La première fois qu'il est exécuté, il utilise dc pour calculer le 1er nombre de Fibonacci via la formule de Binet. Chaque appel à sed modifie le programme en changeant la chaîne passée à dc; ce changement indique à dc d'ajouter un 1 supplémentaire à l'exposant dans la formule, ce qui lui fait calculer le nombre suivant dans la séquence de Fibonacci à chaque fois.
Tester
Pour illustrer comment cela fonctionne, à ce stade, après l'impression du 55, le programme a été modifié pour lire:
donc le relancer donne
et le programme se lit maintenant:
la source
SmileBASIC 3, 99 octets (101 -2)
Bonus de -2 octets car il fonctionne avec n'importe quel nom de fichier.
Celui-ci fonctionne, et il a en quelque sorte fini par être de la même taille que mon cassé!
la source
PRGEDIT
commandes pour remplacer la première ligne (et ajoutez un saut de ligne aprèsA=0B=1
) Et vous n'avez pas non plus besoin deA=0
la première fois.R, 145 octets (147-2)
(A une nouvelle ligne de fin). Il fonctionne avec n'importe quel nom de fichier valide.
la source
Perl 6 ,
6762 octets (64-2)la source
Empilé, non compressif, 65 (67 - 2) octets
Certains problèmes concernant les entrées-sorties de fichiers ont été corrigés dans la dernière série de validations. Ainsi, non compétitif.
Voici un lien vers le github.
Exemple d'exécution
(J'ai omis le chemin réel pour plus de clarté.)
Explication
Comment cela fonctionne consiste à prendre une paire de nombres pour commencer la séquence (
2:>
dans ce cas, la plage entière[0, 2)
, qui est(0 1)
), puis à effectuer la transformation de Fibonacci sur eux, comme suit:À chaque exécution, cette transformation est exécutée en haut de la pile. Ensuite, la pile est poussée vers la pile, dupliquée et son premier membre obtenu (
stack:0#
). Cet élément est ensuite sorti et est le numéro de Fibonacci souhaité.repr
prend ensuite la représentation de la pile et ajoute une nouvelle ligne. Ensuite, le programme est poussé vers la pile et divisé sur les nouvelles lignes. Ensuite, nous prenons le dernier membre (la dernière ligne) et l'ajoutons à la chaîne susmentionnée. Enfin, nous poussonsd0
(le fichier lui-même; pensezd
au signe ollar0
==$0
.) Et écrivons dessus.la source
Rubis, 68 octets (70-2)
la source
Clojure,
209204195 octets-5 octets en basculant pour analyser les nombres comme un long au lieu d'un entier, et en supprimant quelques espaces manqués.
-9 octets en supprimant l'espace entre le deuxième nombre et
(let...)
(l'espace le plus cher jamais!).Voir les commentaires du code pré-golfé pour une description.
Testé à nouveau et il ne génère plus d'erreurs de support inégalées. Il fonctionne jusqu'à 7540113804746346429, auquel cas il lève une exception de dépassement d'entier.
Notez également que cela suppose que le code source se trouve dans "./src/s.clj".
la source