Zeilenumbrüche zur Verdeutlichung hinzugefügt:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
Ich gab mir die Einschränkung, dass es von STDIN lesen muss, anstatt von der Spitze des Stapels, wie es eine Unterlast-Antwort normalerweise tun würde. Ich habe auch die richtige Dezimaleingabe verwendet, die den größten Teil des Codes ausmacht.
Erläuterung:
Ich packe das Programm in einen Quine-Wrapper: (a(:^)*
und):^
. Dies bedeutet, dass der Quellcode des Programms für den gesamten Code im Quine-Wrapper ganz unten im Stapel angezeigt wird.
Um Ziffern in eine normale Kirchenzahl umzuwandeln, ersetze ich jede Ziffer durch den Code, multipliziere mit 10 und addiere diese Ziffer:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
Es gibt hier eine Menge Wiederholungen, also packen wir es in ein Unterprogramm, das eine Church-Ziffer von der Oberseite des Stapels nimmt und sie verwendet, um die "Ziffernfolge" zu konstruieren:
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
Ich habe dies in eine neue Umgebung gestellt, damit schnell darauf zugegriffen werden kann:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
Jetzt kann ich den Ersatzcode für erstellen R
. R
Verwendet die obersten Elemente des Stapels, um eine Nachschlagetabelle zu erstellen, in der eine Zeichenfolge aus STDIN durch Betaload-Code ersetzt wird. Das funktioniert so:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
Wir können jedoch das soeben erstellte Unterprogramm verwenden, um die Codesegmente zu generieren:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
Beim R
Ausführen wird die Eingabe in eine Reihe von Unterprogrammen umgewandelt, die eine Kirchenzahl bilden. Wenn dieses Unterprogramm ausgeführt wird, erstellt es diese Church-Ziffer für das nächste Element auf dem Stapel (0, das zuvor abgelegt wurde). Dies bedeutet, dass R^
der oberste Wert auf dem Stapel die Church-Ziffer ist. Wir dann^
wenden die Church-Nummer noch einmal auf das letzte Element im Stapel (den Quellcode des Programms) an, um die Antwort zu erhalten.
Lustige Tatsache: Ich habe den MD für diese Einreichung seit mehreren Monaten. Ich hatte es behalten, nachdem ich eine Frage missverstanden hatte (die ich anscheinend nicht mehr finde). Ich musste es aus meinem Papierkorb ausgraben, um es hier zu posten.