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) xundx (f g) y
Ein monadischer (Einargument-) Haken aus zwei Verben mit einem gegebenen Argument xhat die folgende Entsprechung:
(f g) x ⇔ x f (g x)
Zum Beispiel wird (* -) 5ausgewertet bis 5 * (- 5), was ausgewertet bis _25.
Dies bedeutet, dass unser 4-Zug, ein Haken von fund (g h j), äquivalent ist zu:
(f (g h j)) x ⇔ x f ((g h j) x)
Aber was macht fman hier? (+$:)^:=ist eine Konjunktion von zwei Verben mit der Potenz- Konjunktion ^:: ein weiterer Haken ( (+$:)) und ein Verb ( =). Hinweis hier , das fist dyadic -e hat zwei Argumente ( xund (g h j) x). Wir müssen uns also ansehen, wie sich das ^:verhält. Die Potenzkonjunktion f^:onimmt ein Verb fund entweder ein Verb oder ein Substantiv o(ein Substantiv ist nur ein Datenelement) und wendet f oZeiten 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 oes sich um ein Verb handelt, wird die Potenzkonjunktion einfach oüber die Argumente ausgewertet und das Nomenergebnis als Wiederholungszahl verwendet.
Für unser Verb oist =das Gleichheitsverb. Es wird 0für unterschiedliche Argumente und 1fü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 xund gleich ysind, 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 xund ysind 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 xund y are the same, we apply the verb toy and addx` dazu.
Gabeln: (g h j) x
Was macht nun die innere Gabel? Dies war yin unserem letzten Beispiel. Für eine monadische Abzweigung von drei Verben gilt bei gegebenem Argument xdie folgende Äquivalenz:
(g h j) x ⇔ (g x) h (j x)
Aus diesem nächsten Beispiel : Angenommen , wir Verben genannt haben SUM, DIVIDEund 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 xhandelt 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.