Esta pregunta se origina en este hilo de reddit por el usuario de reddit taho_teg pero se expande a un 'rompecabezas' más general.
Tiene una centrífuga con 24 orificios para los viales distribuidos uniformemente en un círculo alrededor del eje central. Si ahora tiene varios viales y desea iniciar la centrífuga, debe asegurarse de que se coloquen de manera equilibrada. Los únicos números de viales que no puede equilibrar son 1 y 23. Obviamente, puede equilibrar 4, pero también puede equilibrar 5 haciendo un 'triángulo' con 3 viales y colocando los otros dos en dos sitios opuestos.
Objetivo
Debe escribir un programa que acepte el número de agujeros (que se distribuyen uniformemente en un círculo alrededor del eje giratorio) de su centrífuga como entrada, y que genere una lista de números de viales que no pueden equilibrarse en la centrífuga.
Tiene que hacer el cálculo y no puede simplemente codificar las soluciones precalculadas.
La entrada y la salida deben implementarse de manera que el código del programa no tenga que cambiarse para llamar al programa para diferentes entradas. También es aceptable escribir una función (o una construcción similar en su idioma) que se pueda llamar a través de una consola.
También tenga en cuenta que si tiene 6 orificios en su centrífuga, puede centrifugar 2 y 3 viales, pero no puede equilibrar 5 ya que el 'triángulo' y los dos opuestos se superpondrán en un punto. Otro ejemplo sería para n = 15, no puede equilibrar 11 viales, puede equilibrar 6 y 5 viales, pero la combinación de esas soluciones se superpondrá (por supuesto, este aún no es el criterio de que sea imposible hacerlo).
Actualizar
Parece que algunas personas no entendieron el ejemplo dado, así que hice un gráfico aquí. POR FAVOR, escriba una breve descripción de cómo funciona su algoritmo, así como algunos resultados de ejemplo para verificación. Por favor incluya los siguientes ejemplos:
n = 1, 6, 10, 24, 63, 100 = 10^2, 163 (prime), 40320 = 8!, 65536=2^2^2^2^2, 105953 (prime)
Tenga en cuenta que 40320 y 65536 producirán grandes listas, tal vez sea una buena idea indicar solo la longitud de esas listas.
Si conoce algunos números interesantes para agregar a esa lista, ¡hágamelo saber! El algoritmo debería funcionar al menos hasta n = 1'000'000.
Salidas de ejemplo:
Estos son algunos resultados de ejemplo, pero quizás defectuosos porque los calculé manualmente.
1: 1
2: 1
3: 1,2
4: 1,3
5: 1,2,3,4
6: 1,5
7: 1,2,3,4,5,6
8: 1,3,5,7
9: 1,2,4,5,7,8
10:1,3,7,9
11:1,2,3,4,5,6,7,8,9,10
12:1,11
13:1,2,3,4,5,6,7,8,9,10,11,12
14:1,3,5,9,11,13
15:1,2,4,7,8,11,13,14
Insinuación
Si tiene una centrífuga con n agujeros, y no puede equilibrar, por ejemplo, 6 viales, tampoco podrá equilibrar n-6 viales: es básicamente la misma tarea equilibrar m viales en una centrífuga vacía o equilibrar una centrífuga llena quitando m viales. Entonces, si tiene el número m en su lista, también deberá incluir nm .
7 spoke wheel
y eche un vistazo.Respuestas:
Salvia -
102104/115¿Por qué usar la teoría de números, cuando hay fuerza bruta?
Para un número determinado de viales, esto abarca todas las formas de colocar los viales y calcula su centro de masa mediante el uso de aritmética compleja. Si el centro de masa es cero para ninguna de estas formas, se devuelve el número.
Desafortunadamente, esto no funciona en ciertos casos (10,14), porque Sage no puede simplificar algunas expresiones a cero (lo que puede estar relacionado con este error ). Uno podría considerar esto como una falla del intérprete y no del programa y aún así decir que el algoritmo y el programa están bien.
La siguiente alternativa de 113 caracteres se basa en flotantes en lugar de símbolos y no sufre estos problemas:
Salida de prueba de la versión de 113 caracteres (
for n in range(14): print n,v(n)
):No quería esperar el tiempo de ejecución por más
n
.Esto se origina en la siguiente solución de Python. La aritmética exacta y no tener que importar algunos módulos es algo bastante.
Python -
173 154156Salida de prueba de esta variante (
for n in range(24): print n,v(n)
):No quería esperar el tiempo de ejecución por más
n
.fuente
Lua - 197
Un método de fuerza no bruta, crea una lista de factores y los descarta. También descarta los números que se pueden obtener con la suma de esos factores, siempre que el factor más grande utilizado sea menor que la cantidad de agujeros sin llenar. Uno siempre se imprime y no se usa en el algoritmo.
Ejemplo de salida: (algunos se ponen como rangos para que no exceda el límite de caracteres)
fuente
Pyth -
3937 bytesUna traducción directa de la respuesta de Python de @ Wrzlprmft.
Explicación y probablemente más golf próximamente.
Pruébelo en línea aquí .
fuente