Einführung: Kombinatorische Logik
Die kombinatorische Logik (CL) basiert auf sogenannten Kombinatoren , die im Grunde genommen Funktionen sind. Es gibt zwei grundlegende "eingebaute" Kombinatoren S
und K
, die später erklärt werden.
Linke Assoziativität
CL ist linksassoziativ , was bedeutet, dass Klammern (die etwas enthalten), die sich ganz links von einem anderen Klammerpaar befinden, entfernt werden können, wobei das betreffende Material freigegeben wird. Zum Beispiel so etwas:
((a b) c)
Kann auf reduziert werden
(a b c)
Befindet (a b)
sich der ganz links von der größeren Halterung ((a b) c)
, so kann er entfernt werden.
Ein viel größeres Beispiel für Linksassoziationen (eckige Klammern sind Erklärungen):
((a b) c ((d e) f (((g h) i) j)))
= (a b c ((d e) f (((g h) i) j))) [((a b) c...) = (a b c...)]
= (a b c (d e f (((g h) i) j))) [((d e) f...) = (d e f...)]
= (a b c (d e f ((g h i) j))) [((g h) i) = (g h i)]
= (a b c (d e f (g h i j))) [((g h i) j) = (g h i j)]
Klammern können auch reduziert werden, wenn mehr als ein Paar um dieselben Objekte gewickelt ist. Beispiele:
((((a)))) -> a
a ((((b)))) -> a b
a (((b c))) -> a (b c) [(b c) is still a group, and therefore need brackets.
Note that this doesn't reduce to `a b c`, because
`(b c)` is not on the left.]
Builtins
CL verfügt über zwei "eingebaute" Kombinatoren, S
mit K
denen Objekte (einzelne Kombinatoren oder eine Gruppe von Kombinatoren / Gruppen, die in eckige Klammern eingeschlossen sind) wie folgt gewechselt werden können:
K x y = x
S x y z = x z (y z)
Wo x
, y
undz
kann Stand-In für alles sein.
Ein Beispiel für S
und K
sind wie folgt:
(S K K) x [x is a stand-in for anything]
= S K K x [left-associativity]
= K x (K x) [S combinator]
= x [K combinator]
Ein anderes Beispiel:
S a b c d
= a c (b c) d [combinators only work on the n objects to the right of it,
where n is the number of "arguments" n is defined to have -
S takes 3 arguments, so it only works on 3 terms]
Das Obige sind Beispiele für normale CL-Anweisungen, bei denen die Anweisung nicht weiter ausgewertet werden kann und ein Endergebnis in einer endlichen Zeitspanne erzielt wird. Es gibt nicht normale Anweisungen (CL-Anweisungen, die nicht enden und für immer ausgewertet werden), aber sie liegen nicht im Rahmen der Herausforderung und müssen nicht behandelt werden.
Wenn Sie mehr über CL erfahren möchten, lesen Sie diese Wikipedia-Seite .
Aufgabe:
Ihre Aufgabe ist es, zusätzliche Kombinatoren zu erstellen, die die Anzahl der Argumente und die Auswertung als Eingabe berücksichtigen.
{amount_of_args} = {evaluated}
Wo {amount_of_args}
ist eine positive ganze Zahl gleich der Anzahl der Argumente und {evaluated}
besteht aus:
- Argumente bis zur Menge der
1
Argumente, mit dem ersten Argument,2
wobei das das zweite usw. ist.- Es wird garantiert, dass Argumentnummern über der Anzahl der Argumente (also nur
4
wenn ) nicht in angezeigt werden .{amount_of_args}
3
{evaluated}
- Es wird garantiert, dass Argumentnummern über der Anzahl der Argumente (also nur
- Klammern
()
Beispiele für Eingaben sind:
3 = 2 3 1
4 = 1 (2 (3 4))
Bei der ersten Eingabe wird nach einem Kombinator (z. B. R
) mit drei Argumenten ( R 1 2 3
) gefragt , der dann ausgewertet wird zu:
R 1 2 3 -> 2 3 1
Die zweite Eingabe fragt danach (mit einem Kombinator-Namen A
):
A 1 2 3 4 -> 1 (2 (3 4))
In Anbetracht der Eingabe in diesem Format, müssen Sie eine Reihe von zurückgeben S
, K
und ()
, die , wenn sie mit einem combinator Namen ersetzt und mit Argumenten ausführen, gibt das gleiche ausgewertete Aussage wie die{evaluated}
Block , wenn der Befehlsblock wird wieder für diesen combinator Namen ersetzt.
Bei der Ausgabe-Kombinator-Anweisung werden möglicherweise die Leerzeichen und die äußeren Klammern entfernt, sodass so etwas wie umgewandelt werden (S K K (S S))
kannSKK(SS)
.
Wenn Sie Ihr Programms der Ausgänge zu testen, hat @aditsu einen kombinatorischen Logik - Parser gemacht (einschließlich S
, K
, I
und auch andere , die gerne B
und C
) hier .
Ergebnis:
Da es sich um einen Metagolf handelt , besteht das Ziel dieser Herausforderung darin, die geringstmögliche Anzahl von Bytes in der angegebenen Ausgabe zu erzielen diesen 50 Testfällen . Bitte geben Sie Ihre Ergebnisse für die 50 Testfälle in die Antwort ein oder erstellen Sie ein Pastebin (oder ähnliches) und veröffentlichen Sie einen Link zu diesem Pastebin.
Bei einem Gleichstand gewinnt die früheste Lösung.
Regeln:
- Ihre Antwort muss eine RICHTIGE Ausgabe zurückgeben. Bei einer Eingabe muss die korrekte Ausgabe gemäß der Definition in der Task zurückgegeben werden.
- Ihre Antwort muss für jeden Testfall innerhalb einer Stunde auf einem modernen Laptop ausgegeben werden.
- Eine Hardcodierung von Lösungen ist nicht zulässig. Sie können jedoch bis zu 10 Kombinatoren fest codieren.
- Ihr Programm muss jedes Mal dieselbe Lösung für dieselbe Eingabe zurückgeben.
- Ihr Programm muss für jede Eingabe ein gültiges Ergebnis liefern, nicht nur für Testfälle.
1
, können Sie 1
von allem subtrahieren und dann die Lösung für diese Antwort einpacken K()
. Beispiel: Lösung für 2 -> 1
ist K
, also Lösung für 3 -> 2
ist KK
, Lösung für 4 -> 3
ist K(KK)
usw.