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) xyx (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, (* -) 5evalúa a 5 * (- 5), que evalúa a _25.
Esto significa que nuestro 4-tren, un gancho de fy (g h j), es equivalente a:
(f (g h j)) x ⇔ x f ((g h j) x)
¿Pero qué hace faquí? (+$:)^:=es una conjunción de dos verbos que usan la conjunción Power^: : otro hook ( (+$:)) y un verbo ( =). Tenga en cuenta que esto fes diádico: tiene dos argumentos ( xy (g h j) x). Entonces tenemos que ver cómo se ^:comporta. La conjunción de poder f^:otoma un verbo fy un verbo o un sustantivo o(un sustantivo es solo un dato) y aplica f otiempos. 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 oes un verbo, la conjunción de potencia simplemente evaluará olos argumentos y usará el resultado del sustantivo como recuento repetido.
Para nuestro verbo, oes =, el verbo de igualdad. Se evalúa 0para diferentes argumentos y 1para 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 xy yson 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 xy yson lo mismo, obtenemos:
x (+$:) y ⇔ x + ($: y)
¿Qué es $:? Se refiere al verbo completo y permite la recursividad. Esto significa que, cuando xy y are the same, we apply the verb toy and addx`.
Tenedores: (g h j) x
Ahora, ¿qué hace la horquilla interna? Esto fue yen 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, DIVIDEy LENGTHque 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 xsea 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.