Levenquine cyclique

45

Contexte

Comme le savent la plupart des habitués des PPCG, un est un programme qui génère son propre code source lors de son exécution. et la distance de Levenshtein entre deux chaînes est le nombre minimal d'insertions, de suppressions et de modifications nécessaires pour changer une chaîne en une autre. Dans ce défi, nous combinons les deux concepts dans une "levenquine": un programme qui génère son propre code source, mais avec une instance d'un caractère inséré, supprimé ou remplacé par un autre caractère. (En d’autres termes, la distance de Levenshtein entre le programme et sa sortie est égale à 1).

La tâche

Écrivez une levenquine de sorte que sa sortie soit une levenquine, le résultat de ce programme est également une levenquine, et ainsi de suite. De plus, à un moment donné, la séquence d'exécution répétée du programme, de sa sortie, de sa sortie, etc. doit finalement revenir au programme d'origine.

Une restriction supplémentaire rend les choses beaucoup plus difficiles: il doit y avoir deux programmes distincts quelque part dans ce cycle qui n'ont pas de caractères en commun (en d'autres termes, aucun caractère n'existe dans un programme et existe également dans l'autre programme). Votre programme va donc devoir se transformer progressivement en un jeu de caractères différent, et inversement.

Si vous utilisez un langage de programmation qui nécessite inévitablement un passe-partout dans tout programme produisant une sortie (par exemple, il n'a qu'un seul moyen d'écrire une printinstruction et aucune autre forme utile de sortie), vous pouvez considérer ce passe-passe comme inexistant à cette fin. de déterminer quels personnages deux programmes ont en commun. Cependant, vous devez toujours compter ce passe-partout pour déterminer la propriété de Levenquine du code.

Des clarifications

  • Chacun des "programmes" du cycle peut être un programme complet ou une fonction. Ils ne doivent pas tous être identiques, par exemple, certains peuvent être des programmes complets et d'autres des fonctions.
  • Tous les programmes du cycle ne doivent pas nécessairement utiliser la même forme de sortie. Par exemple, certains peuvent sortir via une sortie standard et d'autres via une erreur standard.
  • Vos programmes seront exécutés sans entrée (ou dans des langues qui nécessitent une entrée pour faire quoi que ce soit, l'entrée la plus simple possible).
  • Des règles appropriées s'appliquent; bien que la Levenquine ne soit pas une vraie quine, vous ne pouvez rien faire qui soit illégal en écrivant une bonne quine. En particulier, le programme null n'est jamais une sortie valide d'une Levenquine appropriée (et ne peut donc pas faire partie de votre cycle).
  • La restriction de Levenquine est mesurée en termes de caractères plutôt qu'en octets (par exemple, êun caractère même lorsque la source est codée en UTF-8). La restriction de non-caractères-en-commun est également mesurée en termes de caractères. La condition de victoire compte toutefois en octets.

Condition de victoire

Veuillez soumettre au moins les trois programmes suivants du cycle: le programme le plus court (mesuré en octets); et deux programmes du cycle qui n'ont pas de caractères en commun. Il est possible que deux d'entre eux soient identiques et il est également possible que les trois soient distincts. Le score est basé sur la longueur en octets du programme le plus court, le plus court étant le meilleur, ce qui en fait une sorte de compétition de .


la source
Pour les personnes qui peuvent voir les messages supprimés: le message Sandbox était ici .
Je pense qu'il serait également bon que les réponses incluent la longueur du cycle.
mbomb007
Que se passe-t-il si, par exemple, le langage dispose de plusieurs fonctions pour effectuer une sortie, mais qu'elles partagent toutes des caractères par paire?
Ørjan Johansen
2
@ ØrjanJohansen: Je suppose que je ne serais pas trop opposé à la sélection de l'un d'entre eux et à son maintien dans ce cas. Cependant, on peut dire que c'est non compétitif; Je voulais que la règle soit objective, car sinon, les gens ont tendance à essayer de créer des échappatoires, et si vous essayez de rendre la règle trop complexe, il y a généralement des arguments sur sa signification.
Peut-il être un peu levenquine sage? Comme dans la distance du code source original est de 1 octet?
Urne magique Octopus

Réponses:

34

Gol> <> , 252 167 octets

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_

Essayez-le en ligne!

Et le programme mutuellement distinct ( vérification ):

0<CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Essayez-le en ligne!

Ceci est principalement inspiré par ma réponse au défi Mutuellement Exclusif de Quines , les félicitations allant également à la réponse de Bubbler Gol> <> .

Voici un programme de vérification que vous pouvez exécuter. Malheureusement, le délai expire, mais vous pouvez voir comment une section de code génère l’autre section, puis vous pouvez copier la dernière version imprimée et la coller dans l’entrée pour continuer. Finalement, vous atteindrez le premier programme que vous avez mis en place.

Explication

Les deux sections de code sont composées de deux sections, la partie d'exécution réelle et les données contenant l'autre section de code. Ils fonctionnent tous les deux pratiquement de la même manière:

Ils dépendent d'un drapeau (le premier caractère du code, 1ou 0). Si le drapeau est défini, ils commenceront à créer l'autre section de code en supprimant le 252ème caractère, en ajoutant / soustrayant 28de celui-ci et en l'ajoutant au code.

Par exemple, voici les deux premières itérations du code après le premier programme ci-dessus:

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_C

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽ

Finalement, lorsqu'il atteint la fin de la section en cours, il retourne le second caractère du code ( <vers >et de nouveau) pour pointer sur l'autre section.

Voici les deux sections ensemble, sur le point de passer de l’exécution de la première à l’exécution de la seconde.

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Essayez-le en ligne!

Les indicateurs sont opposés pour chaque section, de sorte que la nouvelle section en cours d'exécution commence à supprimer l'autre section de code jusqu'à ce qu'elle atteigne son propre code. À ce stade, le drapeau est retourné et le cycle se répète à nouveau.

Jo King
la source