J , 16 11 Bytes
(+$:)^:=1+?
Probieren Sie es online!
Erläuterung
TL; DR 1+?
führt den Würfelwurf aus und (+$:)^:=
wiederholt ihn nur, wenn er der Eingabe entspricht.
Die Funktion ist eine Folge von 4 Verben:
┌─ +
┌───┴─ $:
┌─ ^: ─┴─ =
│
──┤ ┌─ 1
└──────┼─ +
└─ ?
Ein Zug ist, wenn 2 oder mehr Verben verkettet sind. Hier ist die Antwort von der Form f g h j
:
(+$:)^:= 1 + ?
f g h j
Ein sogenannter "4-Zug" wird wie ein Haken und eine Gabel analysiert:
f g h j ⇔ f (g h j)
Die Antwort ist also äquivalent zu:
(+$:)^:= (1 + ?)
Haken: (f g) x
undx (f g) y
Ein monadischer (Einargument-) Haken aus zwei Verben mit einem gegebenen Argument x
hat die folgende Entsprechung:
(f g) x ⇔ x f (g x)
Zum Beispiel wird (* -) 5
ausgewertet bis 5 * (- 5)
, was ausgewertet bis _25
.
Dies bedeutet, dass unser 4-Zug, ein Haken von f
und (g h j)
, äquivalent ist zu:
(f (g h j)) x ⇔ x f ((g h j) x)
Aber was macht f
man hier? (+$:)^:=
ist eine Konjunktion von zwei Verben mit der Potenz- Konjunktion ^:
: ein weiterer Haken ( (+$:)
) und ein Verb ( =
). Hinweis hier , das f
ist dyadic -e hat zwei Argumente ( x
und (g h j) x
). Wir müssen uns also ansehen, wie sich das ^:
verhält. Die Potenzkonjunktion f^:o
nimmt ein Verb f
und entweder ein Verb oder ein Substantiv o
(ein Substantiv ist nur ein Datenelement) und wendet f
o
Zeiten an. Nehmen wir zum Beispiel o = 3
. Folgende Äquivalenzen gelten:
(f^:3) x ⇔ f (f (f x))
x (f^:3) y ⇔ x f (x f (x f y))
Wenn o
es sich um ein Verb handelt, wird die Potenzkonjunktion einfach o
über die Argumente ausgewertet und das Nomenergebnis als Wiederholungszahl verwendet.
Für unser Verb o
ist =
das Gleichheitsverb. Es wird 0
für unterschiedliche Argumente und 1
für gleiche Argumente ausgewertet . Wir wiederholen den Haken (+$:)
einmal für gleiche und nicht für unterschiedliche Argumente. Zur Vereinfachung der Notation für die Erklärung sei y ⇔ ((g h j) x)
. Denken Sie daran, dass unser erster Hook dem folgenden entspricht:
x (+$:)^:= ((g h j) x)
x (+$:)^:= y
Wenn Sie die Konjunktion erweitern, wird dies zu:
x ((+$:)^:(x = y)) y
Wenn x
und gleich y
sind, wird dies:
x (+$:)^:1 y ⇔ x (+$:) y
Andernfalls wird dies:
x (+$:)^:0 y ⇔ y
Jetzt haben wir monadische Gabeln gesehen. Hier haben wir eine dyadische Gabel:
x (f g) y ⇔ x f (g y)
Also, wenn x
und y
sind die gleichen, bekommen wir:
x (+$:) y ⇔ x + ($: y)
Was ist $:
? Es bezieht sich auf das gesamte Verb selbst und ermöglicht eine Rekursion. Das heißt, wann x
und y are the same, we apply the verb to
y and add
x` dazu.
Gabeln: (g h j) x
Was macht nun die innere Gabel? Dies war y
in unserem letzten Beispiel. Für eine monadische Abzweigung von drei Verben gilt bei gegebenem Argument x
die folgende Äquivalenz:
(g h j) x ⇔ (g x) h (j x)
Aus diesem nächsten Beispiel : Angenommen , wir Verben genannt haben SUM
, DIVIDE
und LENGTH
, was tun , was Sie annehmen , sie könnten. Wenn wir die drei zu einer Gabel verketten, erhalten wir:
(SUM DIVIDE LENGTH) x ⇔ (SUM x) DIVIDE (LENGTH x)
Diese Gabel ergibt den Durchschnitt von x
(vorausgesetzt, es x
handelt sich um eine Liste von Zahlen). In J würden wir dies tatsächlich als Beispiel schreiben +/ % #
.
Eine letzte Sache über Gabeln. Wenn die linke "Zacke" (in unserem obigen symbolischen Fall g
) ein Substantiv ist, wird sie als konstante Funktion behandelt, die diesen Wert zurückgibt.
Mit all dem können wir nun die obige Gabelung verstehen:
(1 + ?) x ⇔ (1 x) + (? x)
⇔ 1 + (? x)
?
[ 0 , x )[ 1 , x ]
Alles zusammen
Angesichts all dieser Dinge ist unser Verb gleichbedeutend mit:
((+$:)^:=1+?) x ⇔ ((+$:)^:= 1 + ?) x
⇔ ((+$:)^:= (1 + ?)) x
⇔ x ((+$:)^:=) (1 + ?) x
⇔ x ((+$:)^:=) (1 + (? x))
⇔ x (+$:)^:(x = (1 + (? x))
(let y = 1 + (? x))
if x = y ⇒ x + $: y
otherwise ⇒ y
Dies drückt die gewünschte Funktionalität aus.