Russian Nesting Quine

18

Une poupée gigogne russe, plus communément appelée poupée Matriochka , est une poupée qui contient une version plus petite d'elle-même, qui contient ensuite une autre version plus petite d'elle-même, qui contient une version plus petite d'elle-même, qui contient une version plus petite d'elle-même, qui contient une version plus petite de lui-même ... - jusqu'à ce que finalement, la dernière soit vide. Un exemple:

Poupées matriochka <3

Aujourd'hui, votre objectif est d'imiter cette tradition russe en écrivant un programme ou une fonction qui, lorsqu'elle se contient N fois, s'imprime contenant N-1 copies d'elle-même fois.

Par exemple, le programme poupée abcdaura le programme N = 3 abababcdcdcd, qui imprimera le programme N = 2 ababcdcd, qui imprime le programme N = 1 original abcd, qui imprime finalement N = 0, qui est vide. Cela devrait théoriquement fonctionner pour toute valeur raisonnable de N.

Règles:

  • Voici un programme TIO pour aider à générer des programmes de poupée basés sur votre programme
  • Les règles standard de Quine s'appliquent
  • Les échappatoires standard s'appliquent
  • «Contient» signifie directement au centre de la version précédente, donc votre solution doit avoir un nombre pair d'octets positif. Un programme de longueur 10 aura une copie de l'original insérée après le cinquième octet, puis une autre après le dixième octet, etc.
  • Un seul espace de fin est autorisé dans la sortie
  • Comme il s'agit de , votre objectif est de rendre votre programme N = 1 aussi court que possible.
  • Une explication de votre code serait appréciée
Jo King
la source
Publication Sandbox (supprimée)
Jo King
Pour quelle Ntaille de code est mesurée?
flawr
@flawr N = 1 .....
Jo King
12
Est-ce que cette animation est vraiment nécessaire?!
Shaggy

Réponses:

9

JavaScript, 36 32 octets

Profite du fait qu'il Function.prototype.toString()ne prend aucun argument et ignorera donc tous ceux qui lui sont transmis.

Partiellement inspiré par la solution de user202729 .

f=_=>f.toString( ).slice(14,-16)

Essayez-le

o.innerHTML=["<span>Five</span>",(f=_=>f.toString(f=_=>f.toString(f=_=>f.toString(f=_=>f.toString(f=_=>f.toString( ).slice(14,-16) ).slice(14,-16) ).slice(14,-16) ).slice(14,-16) ).slice(14,-16))(),"<span>Four</span>",(f=_=>f.toString(f=_=>f.toString(f=_=>f.toString(f=_=>f.toString( ).slice(14,-16) ).slice(14,-16) ).slice(14,-16) ).slice(14,-16))(),"<span>Three</span>",(f=_=>f.toString(f=_=>f.toString(f=_=>f.toString( ).slice(14,-16) ).slice(14,-16) ).slice(14,-16))(),"<span>Two</span>",(f=_=>f.toString(f=_=>f.toString( ).slice(14,-16) ).slice(14,-16))(),"<span>One</span>",(f=_=>f.toString( ).slice(14,-16))(),"<span>Thunderbirds Are Go!</span>"].join`\n`
span{font-weight:bold;font-size:16px;line-height:1.5em;text-transform:uppercase;}span:last-child{font-size:8px;}
<pre id=o></pre>

Hirsute
la source
5

Gelée , 16 octets

Ṿḣ-9Ḋð}“““““““““

Essayez-le en ligne!

Doublé: Essayez-le en ligne!

Triplé: Essayez-le en ligne!


Jelly n'a pas de structure emboîtable, mais ses littéraux de chaîne sont terminés automatiquement.


Ṿḣ-9Ḋ    First chain. (monadic)
Ṿ        Uneal. (to string)
 ḣ-9     Take the ead, ends at the -9'th character.
    Ḋ    equeue, remove the first character.

     ð             Terminate the first chain, start a new one.
      }            Convert the last monadic chain to a dyadic one.
       “““““““““   String literal.
                   This matches the pattern <dyad> <nilad>, so applies
                   the the corresponding rules. This way a link can take data
                   to the right of it.

Va essayer différentes approches pour voir si elles peuvent être plus courtes.

user202729
la source
2

dc , 4 octets

 []p

Semblable à d'autres réponses, puisque les chaînes dans dcont des délimiteurs start ( [) et end ( ]) (c'est-à-dire qu'elles "n'exécutent pas les deux fonctions, etc.), elles sont imbriquables sans effort réel. pimprimer.

N = 1: Essayez-le en ligne!

N = 2: Essayez-le imbriqué!

N = 3: Essayez-le nesteder!

brhfl
la source