Ajout de nouvelles lignes pour plus de clarté:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
Je me suis donné la restriction qu'il doit lire depuis STDIN plutôt que depuis le haut de la pile comme le ferait généralement une réponse Underload. J'ai également utilisé une entrée décimale appropriée, qui constitue la majeure partie du code.
Explication:
J'emballe le programme dans une enveloppe quine: (a(:^)*
et ):^
. Cela signifie que tout le code à l'intérieur du wrapper quine aura le code source du programme au bas de la pile.
Afin de convertir les chiffres en un chiffre d'église normal, j'utilise la technique de remplacement de chaque chiffre par le code pour multiplier par 10 et ajouter ce chiffre:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
Il y a beaucoup de répétitions ici, alors empaquetons-le dans un sous-programme qui prendra un chiffre Church du haut de la pile et l'utilisera pour construire la "chaîne de chiffres:"
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
Je mets cela dans un nouvel environnement afin qu'il soit accessible rapidement:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
Maintenant, je peux créer le code de remplacement pour R
. R
utilise les éléments supérieurs de la pile pour former une table de recherche pour remplacer une chaîne de STDIN par du code Betaload. Cela fonctionne comme ceci:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
Cependant, nous pouvons utiliser le sous-programme que nous venons de créer pour générer les segments de code:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
Lorsqu'il R
est exécuté, il transformera l'entrée en une série de sous-programmes qui construisent un chiffre d'église. Lorsque ce sous-programme est exécuté, il crée ce chiffre d'église sur l'élément suivant de la pile (0, qui a été placé plus tôt). Cela signifie que, après R^
, la valeur la plus élevée sur la pile sera le chiffre de l'Église. Nous avons ensuite ^
une fois de plus pour appliquer le chiffre de l'Église au dernier élément de la pile (le code source du programme) pour obtenir la réponse.
Fait amusant: j'ai le MD de cette soumission depuis plusieurs mois. Je l'avais gardé après avoir mal compris une question (que je n'arrive plus à trouver). J'ai dû le déterrer de ma corbeille pour le poster ici.