J , 16 11 octets
(+$:)^:=1+?
Essayez-le en ligne!
Explication
TL; DR 1+?
effectue le jet de dé, (+$:)^:=
réitère uniquement lorsqu'il est égal à l'entrée.
La fonction est un train de 4 verbes:
┌─ +
┌───┴─ $:
┌─ ^: ─┴─ =
│
──┤ ┌─ 1
└──────┼─ +
└─ ?
Un train, c'est quand 2 verbes ou plus sont concaténés. Ici, la réponse est de la forme f g h j
:
(+$:)^:= 1 + ?
f g h j
Un soi-disant "4-train" est analysé comme un crochet et une fourchette:
f g h j ⇔ f (g h j)
Ainsi, la réponse équivaut à:
(+$:)^:= (1 + ?)
Crochets: (f g) x
etx (f g) y
Un crochet monadique (un argument) de deux verbes, étant donné un argument x
, l'équivalence suivante est valable:
(f g) x ⇔ x f (g x)
Par exemple, (* -) 5
évalue à 5 * (- 5)
, qui évalue à _25
.
Cela signifie que notre 4-train, un crochet de f
et (g h j)
, équivaut à:
(f (g h j)) x ⇔ x f ((g h j) x)
Mais que fait f
-on ici? (+$:)^:=
est une conjonction de deux verbes utilisant la conjonction Power^:
: un autre hook ( (+$:)
) et un verbe ( =
). Notez ici que f
c'est dyadique - il a deux arguments ( x
et (g h j) x
). Nous devons donc regarder comment ^:
se comporte. La conjonction de puissance f^:o
prend un verbe f
et soit un verbe soit un nom o
(un nom n'est qu'un élément de données) et applique des f
o
temps. Par exemple, prenez o = 3
. Les équivalences suivantes sont valables:
(f^:3) x ⇔ f (f (f x))
x (f^:3) y ⇔ x f (x f (x f y))
Si o
est un verbe, la conjonction de puissance évaluera simplement o
les arguments et utilisera le résultat du nom comme nombre de répétitions.
Pour notre verbe, o
est =
, le verbe d'égalité. Il évalue à 0
des arguments différents et à 1
des arguments égaux. Nous répétons le crochet (+$:)
une fois pour des arguments égaux et pas de temps pour des arguments différents. Pour faciliter la notation de l'explication, let y ⇔ ((g h j) x)
. N'oubliez pas que notre crochet initial est équivalent à ceci:
x (+$:)^:= ((g h j) x)
x (+$:)^:= y
En élargissant la conjonction, cela devient:
x ((+$:)^:(x = y)) y
Si x
et y
sont les mêmes, cela devient:
x (+$:)^:1 y ⇔ x (+$:) y
Sinon, cela devient:
x (+$:)^:0 y ⇔ y
Maintenant, nous avons vu des fourches monadiques. Ici, nous avons une fourche dyadique:
x (f g) y ⇔ x f (g y)
Donc, quand x
et y
sont les mêmes, nous obtenons:
x (+$:) y ⇔ x + ($: y)
Qu'est-ce que c'est $:
? Il fait référence à l'ensemble du verbe lui-même et permet la récursivité. Cela signifie que, quand x
et y are the same, we apply the verb to
y and add
x` à elle.
Fourches: (g h j) x
Maintenant, que fait la fourche intérieure? C'était y
dans notre dernier exemple. Pour une fourche monadique de trois verbes, étant donné un argument x
, l'équivalence suivante est vérifiée:
(g h j) x ⇔ (g x) h (j x)
Pour cet exemple suivant, supposons que nous avons des verbes du nom SUM
, DIVIDE
et LENGTH
qui font ce que vous supposez qu'ils pourraient. Si nous concaténons les trois en une fourchette, nous obtenons:
(SUM DIVIDE LENGTH) x ⇔ (SUM x) DIVIDE (LENGTH x)
Cette fourchette est évaluée à la moyenne de x
(en supposant qu'il x
s'agit d'une liste de nombres). En J, nous écrivions en fait ceci comme exemple +/ % #
.
Une dernière chose à propos des fourches. Lorsque la "dent" la plus à gauche (dans notre cas symbolique ci-dessus, g
) est un nom, elle est traitée comme une fonction constante renvoyant cette valeur.
Avec tout cela en place, nous pouvons maintenant comprendre la fourchette ci-dessus:
(1 + ?) x ⇔ (1 x) + (? x)
⇔ 1 + (? x)
?
donne ici un entier aléatoire dans la plage , nous devons donc transformer la plage pour représenter les dés; l'incrémentation donne la plage .[0,x)[1,x]
Mettre tous ensemble
Compte tenu de toutes ces choses, notre verbe équivaut à:
((+$:)^:=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
Cela exprime la fonctionnalité souhaitée.