¡Inspirado en The Great API Easter Egg Hunt!
Resumen
Su tarea es buscar un número entero predeterminado en el "espacio de Collatz" (que se explicará más adelante) utilizando el menor número de pasos posible.
Introducción
Este desafío se basa en la famosa conjetura de Collatz de la que esperamos que al menos todos aquí hayan oído hablar. Aquí hay un resumen tomado de Imprimir los números de Super Collatz .
La secuencia de Collatz (también llamada problema 3x + 1) es donde comienzas con cualquier número entero positivo, para este ejemplo usaremos 10 y le aplicaremos este conjunto de pasos:
if n is even: Divide it by 2 if n is odd: Multiply it by 3 and add 1 repeat until n = 1
La distancia de Collatz C(m,n)
entre los dos números m
y n
, para el propósito de este desafío, es la distancia entre dos números en el gráfico de Collatz (Créditos a @tsh para contarme sobre este concepto), que se define de la siguiente manera: (usando 21
y 13
como ejemplos ):
Escriba la secuencia de Collatz para m
(en este caso 21
):
21, 64, 32, 16, 8, 4, 2, 1
Escriba la secuencia de Collatz para n
(en este caso 13
):
13, 40, 20, 10, 5, 16, 8, 4, 2, 1
Ahora cuente cuántos números aparecen solo en una de las secuencias. Esto se define como la distancia de Collatz entre m
y n
. En este caso 8
, a saber,
21, 64, 32, 13, 40, 20, 10, 5
Entonces tenemos la distancia de Collatz entre 21
y 13
como C(21,13)=8
.
C(m,n)
tiene las siguientes propiedades agradables:
C(m,n)=C(n,m)
C(m,n)=0 iff. m=n
Esperemos que la definición de C(m,n)
ahora sea clara. ¡Comencemos a buscar huevos en el espacio de Collatz!
Al comienzo del juego, un controlador decide la posición de un huevo de pascua, que se expresa mediante su coordenada unidimensional: un número entero en el intervalo [p,q]
(en otras palabras, un número entero entre p
y q
, ambos extremos inclusive).
La posición del huevo permanece constante durante todo el juego. Denotaremos esta coordenada como r
.
Ahora puede hacer una suposición inicial a 0 , y el controlador lo grabará. Esta es tu 0ª ronda. Si eres tan afortunado de haber acertado en el primer lugar (es decir, un 0 = r), el juego termina y tu puntaje es 0
(Cuanto más bajo sea el puntaje, mejor). De lo contrario, ingresas a la primera ronda y haces una nueva aproximación a 1 , esto continúa hasta que lo has hecho bien, es decir, a n = r, y tu puntaje será n
.
Para cada ronda posterior al 0, el controlador le ofrece una de las siguientes retroalimentaciones para que pueda adivinar mejor en función de la información proporcionada. Supongamos que se encuentra actualmente en la n
tercera ronda y, por lo tanto, su suposición es un n
- "¡Lo encontraste!" si a n = r, en cuyo caso el juego termina y usted anota
n
. - "Estás más cerca :)" si C (a n , r) <C (a n-1 , r)
- "Estás dando vueltas alrededor del huevo" si C (a n , r) = C (a n-1 , r)
- "Estás más lejos :(" si C (a n , r)> C (a n-1 , r)
Para guardar algunos bytes, llamaré a las respuestas como "Correcto", "Más cerca", "Mismo", "Más lejos", en el orden presentado anteriormente.
Aquí hay un ejemplo de juego con p=1,q=15
.
- a 0 = 10
- a 1 = 11, respuesta: "Más cerca"
- a 2 = 13, respuesta: "Más lejos"
- a 3 = 4, respuesta: "Más lejos"
- a 4 = 3, respuesta: "Más cerca"
- a 5 = 5, respuesta: "Mismo"
- a 6 = 7, respuesta: "Correcto"
Puntuación: 6
.
Desafío
Diseña una estrategia determinista para jugar p=51, q=562
con el mejor puntaje.
Las respuestas deben describir los algoritmos en detalle. Puede adjuntar cualquier código que ayude a dilucidar el algoritmo. Esto no es codegolf, por lo que se recomienda escribir código legible.
Las respuestas deben incluir el peor puntaje que puedan lograr para todos los casos posibles r
, y el que tenga el puntaje más bajo gana. En el caso de empate, r
ganan los algoritmos que tienen un mejor puntaje promedio para todos los posibles s (que también deben incluirse en las respuestas). No hay más desempates y podemos tener múltiples ganadores al final.
Especificaciones
- Para reiterar,
r
radica en el intervalo[51,562]
. - Se aplican las lagunas predeterminadas .
Recompensa (agregado después de que se publique la primera respuesta)
Personalmente, puedo ofrecer una recompensa por una respuesta en la que todas las suposiciones se hacen dentro del rango [51,562]
sin dejar de tener un puntaje peor razonablemente bajo.
fuente
Respuestas:
Rubí, 196
Esto fue mucho más difícil de lo que inicialmente pensé. Tuve que manejar muchos casos oscuros y terminé con mucho código feo. ¡Pero fue muy divertido! :)
Estrategia
Cada secuencia de Collatz termina con una secuencia de poderes de 2 (ej .: [16, 8, 4, 2, 1]). Tan pronto como se encuentre una potencia de 2, dividimos por 2 hasta llegar a 1. Llamemos a la primera potencia de 2 en una secuencia pow2 más cercana (ya que esta también es la potencia más cercana de 2 a nuestro número usando Collatz Distance). Para el rango dado (51-562), todos los números de pow2 más cercanos posibles son: [16, 64, 128, 256, 512, 1024]
Version corta
El algoritmo realiza:
Versión detallada
Dado un juego con el número objetivo
r
, la estrategia es la siguiente:r
en la menor cantidad de pasos posible.Los resultados
Ejecutar el algoritmo para todos los números en el rango 51-562 toma alrededor de un segundo en una PC normal y el puntaje total es 38665.
El código
Pruébalo en línea!
fuente
peor puntaje: 11, puntaje total: 3986
Todas las conjeturas están dentro del alcance
[51,562]
.Mi algoritmo:
vals
, inicialmente el conjunto contiene todos los números dentro del rango[51,562]
.En cada paso, haga lo siguiente:
guess
en el rango[51,562]
de tal manera que, cuando los valores devals
(excluyendoguess
sí mismo) se divide en 3 series correspondientes a los posibles resultadosCloser
,Same
yFarther
, el tamaño máximo de los 3 conjuntos es mínimo.Si hay varios valores posibles para
guess
satisfacer lo anterior, elija el más pequeño.guess
.vals
modo que no puedan dar ese resultado.Mi implementación de referencia escrita en C ++ y Bash se ejecuta en aproximadamente 7,6 segundos en mi máquina y proporciona la peor puntuación / puntaje de suma como se describe en el título.
Probar todos los valores de primera aproximación posibles llevará aproximadamente 1,5 horas en mi máquina. Puedo considerar hacer eso.
fuente