J , 16 11 bytes
(+$:)^:=1+?
Pruébalo en línea!
Explicación
TL; DR 1+?
realiza el lanzamiento del dado, (+$:)^:=
reitera solo cuando es igual a la entrada.
La función es un tren de 4 verbos:
┌─ +
┌───┴─ $:
┌─ ^: ─┴─ =
│
──┤ ┌─ 1
└──────┼─ +
└─ ?
Un tren es cuando 2 o más verbos se concatenan. Aquí, la respuesta es de la forma f g h j
:
(+$:)^:= 1 + ?
f g h j
Un llamado "tren 4" se analiza como un gancho y un tenedor:
f g h j ⇔ f (g h j)
Por lo tanto, la respuesta es equivalente a:
(+$:)^:= (1 + ?)
Ganchos: (f g) x
yx (f g) y
Un gancho monádico (un argumento) de dos verbos, dado un argumento x
, se cumple la siguiente equivalencia:
(f g) x ⇔ x f (g x)
Por ejemplo, (* -) 5
evalúa a 5 * (- 5)
, que evalúa a _25
.
Esto significa que nuestro 4-tren, un gancho de f
y (g h j)
, es equivalente a:
(f (g h j)) x ⇔ x f ((g h j) x)
¿Pero qué hace f
aquí? (+$:)^:=
es una conjunción de dos verbos que usan la conjunción Power^:
: otro hook ( (+$:)
) y un verbo ( =
). Tenga en cuenta que esto f
es diádico: tiene dos argumentos ( x
y (g h j) x
). Entonces tenemos que ver cómo se ^:
comporta. La conjunción de poder f^:o
toma un verbo f
y un verbo o un sustantivo o
(un sustantivo es solo un dato) y aplica f
o
tiempos. Por ejemplo, toma o = 3
. Se cumplen las siguientes equivalencias:
(f^:3) x ⇔ f (f (f x))
x (f^:3) y ⇔ x f (x f (x f y))
Si o
es un verbo, la conjunción de potencia simplemente evaluará o
los argumentos y usará el resultado del sustantivo como recuento repetido.
Para nuestro verbo, o
es =
, el verbo de igualdad. Se evalúa 0
para diferentes argumentos y 1
para argumentos iguales. Repetimos el gancho (+$:)
una vez para argumentos iguales y no para los diferentes. Para facilitar la notación de la explicación, dejemos y ⇔ ((g h j) x)
. Recuerde que nuestro gancho inicial es equivalente a esto:
x (+$:)^:= ((g h j) x)
x (+$:)^:= y
Expandiendo la conjunción, esto se convierte en:
x ((+$:)^:(x = y)) y
Si x
y y
son lo mismo, esto se convierte en:
x (+$:)^:1 y ⇔ x (+$:) y
De lo contrario, esto se convierte en:
x (+$:)^:0 y ⇔ y
Ahora, hemos visto tenedores monádicos. Aquí tenemos un tenedor diádico:
x (f g) y ⇔ x f (g y)
Entonces, cuando x
y y
son lo mismo, obtenemos:
x (+$:) y ⇔ x + ($: y)
¿Qué es $:
? Se refiere al verbo completo y permite la recursividad. Esto significa que, cuando x
y y are the same, we apply the verb to
y and add
x`.
Tenedores: (g h j) x
Ahora, ¿qué hace la horquilla interna? Esto fue y
en nuestro último ejemplo. Para una bifurcación monádica de tres verbos, dado un argumento x
, se cumple la siguiente equivalencia:
(g h j) x ⇔ (g x) h (j x)
Para el siguiente ejemplo, supongamos que hemos llamado verbos SUM
, DIVIDE
y LENGTH
que haga lo que supongo que podría hacerlo. Si concatenamos los tres en una bifurcación, obtenemos:
(SUM DIVIDE LENGTH) x ⇔ (SUM x) DIVIDE (LENGTH x)
Esta bifurcación evalúa el promedio de x
(suponiendo que x
sea una lista de números). En J, realmente escribiríamos esto como ejemplo como +/ % #
.
Una última cosa sobre tenedores. Cuando el "diente" más a la izquierda (en nuestro caso simbólico anterior g
) es un sustantivo, se trata como una función constante que devuelve ese valor.
Con todo esto en su lugar, ahora podemos entender el tenedor anterior:
(1 + ?) x ⇔ (1 x) + (? x)
⇔ 1 + (? x)
?
[ 0 , x )[ 1 , x ]
Poniendolo todo junto
Dadas todas estas cosas, nuestro verbo es equivalente a:
((+$:)^:=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
Esto expresa la funcionalidad deseada.