La nueva nave de Teseo

9

La nave de Teseo es una vieja pregunta que se parece a:

Si un barco ha tenido todas sus piezas originales reemplazadas, ¿sigue siendo el mismo barco?

Para este golf, vamos a reemplazar lentamente las "partes" en un "barco", y veremos cuánto tiempo lleva obtener un barco completamente nuevo.

Tarea

Un barco se compone de al menos dos partes. Las partes se dan como una matriz de enteros positivos (no cero), que representan la condición de la parte.

En cada ciclo, elija aleatoriamente una parte de la lista de manera uniforme. La condición de esa parte se reducirá en uno. Cuando la condición de una parte llega a cero, se reemplaza por una nueva parte. La nueva parte comienza con el mismo valor de condición que el original.

En el primer ciclo donde todas las partes han sido reemplazadas (al menos) una vez, pare y emita el número de ciclos que tomó.

Por ejemplo (suponga que estoy eligiendo partes al azar aquí):

2 2 3  <- starting part conditions (input)
2 1 3  <- second part reduced
2 1 2  ...
2 1 1 
2 2 1  <- second part reduced to zero, replaced
1 2 1 
1 2 3  <- third part replaced
1 1 3 
2 1 3  <- first part replaced

La salida para este ejemplo sería 8, ya que se necesitaron ocho ciclos para reemplazar todas las partes. La salida exacta debe diferir para cada ejecución.

I / O

La única entrada es la lista / matriz de enteros para la condición de parte. La única salida es un número de ciclos. Puede tomar / dar estos valores de cualquiera de las formas habituales: STDIO, argumentos / devoluciones de funciones, etc.

Casos de prueba

Como la salida no es fija, puede usar lo que quiera probar, pero aquí hay un par para fines de estandarización:

1 2 3 4

617 734 248 546 780 809 917 168 130 418

19384 74801 37917 81706 67361 50163 22708 78574 39406 4051 78099 7260 2241 45333 92463 45166 68932 54318 17365 36432 71329 4258 22026 23615 44939 74894 19257 49875 39764 62550 23750 4731 54121 8386 45639 54604 77456 58661 34476 49875 35689 5311 19954 80976 9299 59229 95748 42368 13721 49790
Geobits
fuente
1
¿Me estoy perdiendo algo o no importa que cuando una parte llegue a 0, sea reemplazada por una nueva?
xnor
@xnor Bueno, no importa obtener la respuesta, no (y parece ser lo que hay que hacer para omitirla). Pero temáticamente , las partes del barco necesitan ser reemplazadas: P
Geobits

Respuestas:

4

Pyth, 12 bytes

f!eSXOUQQtZ1

Demostración.

Cómo funciona:

Esto se basa en el filtro infinito de Pyth, que prueba una expresión con entradas crecientes hasta que devuelve algo verdadero, luego devuelve la entrada que hizo que esto sucediera. Sin embargo, la expresión que se probará no utilizará el valor de entrada.

En cambio, la expresión modificará la lista de entrada al disminuir una entrada aleatoria. Esto se logra a través de la expresión XOUQQtZ. Esto significa aumentar el índice OUQen la lista Qpor tZ. OUQes un índice aleatorio en la longitud de Q, y tZes -1. Qse inicializa en la lista de entrada.

Después de modificar Qde esta manera, tomamos su valor actual, que Xregresa, tomamos su entrada máxima con eSy tomamos el valor lógico no de ese valor con !. Esto devuelve un valor verdadero por primera vez cuando cada elemento de Qse ha reducido ao por 0debajo por primera vez.

Para garantizar que el número devuelto sea exactamente el número de veces que Qse modificó, comenzaremos el recuento en 1, indicando que la primera vez que se llama, ha habido 1 modificación. Para ver cómo se Qve después de cada iteración del código, consulte la versión aquí .

isaacg
fuente
5

GolfScript ( 26 24 bytes) / CJam ( 20 18 bytes)

GolfScript:

~{$)*}{.,rand{(+}*((+}/,

Demostración en línea

CJam (misma idea pero implementación ligeramente diferente):

q~{_mr((+_$)*}g;],

Demostración en línea

La entrada está en stdin en el formulario [2 2 3].

Esta es una de esas raras ocasiones en las que el operador de despliegue de GolfScript es útil. Nos permite acumular los estados por los que pasa el barco y luego contarlos al final. Tenga en cuenta que la matriz que se cuenta incluye el estado inicial (entrada) pero no el estado final en el que el último elemento se ha reducido a 0.

Sin embargo, aunque CJam no ha desplegado su capacidad de mezclar una matriz de manera uniforme por solo 2 caracteres cuenta mucho y le permite estar en la cima.

Peter Taylor
fuente
3

Python 3, 91 71 bytes

20 (!) Bytes guardados gracias a @xnor.

from random import*
def f(p):shuffle(p);p[0]-=1;return max(p)<1or-~f(p)

La función recursiva se llama a sí misma con valores de pieza más pequeños hasta que todos los valores de pieza sean 0 o negativos y cada función devuelva el valor de retorno de su hijo + 1 y el último llamado uno devuelva 1.

randomra
fuente
Puede verificar la presencia de un número positivo con max(p)>0.
xnor
Y negar la condición como le max(p)<1or-~f(p)permite evitar el or 1, desde entonces True==1.
xnor
Puede disminuir efectivamente un elemento aleatorio de pcon shuffle(p);p[0]-=1.
xnor
@xnor Wow, gracias! ¡Todos estos son geniales!
randomra
1

Python 3, 175 bytes

import random
p,t=input().split(),0;f,r=[int(i)for i in p],[0]*len(p)
while 0 in r:
 f[random.randint(0,len(f)-1)]-=1;t+=1
 for x in range(len(f)):
  r[x]=int(f[x]<1)
print(t)

No especialmente bien golfizado .

Pruébalo en línea aquí

Tim
fuente
Comentario de autodestrucción
Tim