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) xetx (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 fet (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 fc'est dyadique - il a deux arguments ( xet (g h j) x). Nous devons donc regarder comment ^:se comporte. La conjonction de puissance f^:oprend un verbe fet soit un verbe soit un nom o(un nom n'est qu'un élément de données) et applique des f otemps. 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 oest un verbe, la conjonction de puissance évaluera simplement oles arguments et utilisera le résultat du nom comme nombre de répétitions.
Pour notre verbe, oest =, le verbe d'égalité. Il évalue à 0des arguments différents et à 1des 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 xet ysont 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 xet ysont 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 xet y are the same, we apply the verb toy and addx` à elle.
Fourches: (g h j) x
Maintenant, que fait la fourche intérieure? C'était ydans 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, DIVIDEet LENGTHqui 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 xs'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.