Antecedentes
Este acertijo es una variación del acertijo de cuatro patas (el tema de una pregunta pasada ). Al igual que ese rompecabezas, el objetivo es encontrar expresiones matemáticas para diferentes números enteros, utilizando solo cuatro dígitos y ciertos operadores matemáticos. En este caso, sin embargo, los dígitos permitidos son solo 2, 0, 1 y 5 . Cada uno debe aparecer precisamente una vez en la solución y en el orden correcto. Sorprendentemente, muchos números enteros se pueden representar de esta manera. Se recomienda a los solucionadores que intenten resolverlo a mano primero, ya que es extrañamente divertido.
Reglas
Las constantes pueden construirse a partir de dígitos simples o múltiples:
- Enteros: por ejemplo, 2, 0, 15, etc.
- Decimales: por ejemplo, .2, .01, 1.5, etc.
- Decimales periódicos : por ejemplo, 0,2 ~ (= 0,222 ...), 0,15 ~ (= 0,1555 ...), 20.15 ~~ (= 20,1515 ...)
Se permiten las siguientes operaciones unarias:
- Negación unaria: -x
- Raíz cuadrada: sqrt (x)
- Factorial entero: x!
Se permiten las siguientes operaciones binarias:
- Operadores aritméticos estándar: x + y, xy, x * y y x / y
- Exponenciación arbitraria: x ^ y
- Raíces arbitrarias: rt [x] (y) (= raíz x de y)
Tarea
Su programa debe imprimir expresiones para todos los enteros entre 0 y 100 que pueda, y luego generar el número de expresiones que ha producido.
- Las soluciones deben imprimirse en orden en el formato n = [expr].
- Las expresiones deben usar todos los dígitos 2, 0, 1, 5, una vez en cada orden.
- Las expresiones deben imprimirse utilizando la notación descrita anteriormente. Los paréntesis innecesarios están permitidos pero no son obligatorios, al igual que los espacios en blanco. El orden de precedencia del operador es negación unaria, factorial, exponenciación, multiplicación / división y suma / resta.
- El programa no necesita devolver soluciones para todos los números. Por lo tanto, un programa que simplemente genera 0 es válido; sin embargo, vea la sección de puntuación a continuación.
- El programa debería ejecutarse en menos de 15 minutos en una computadora moderna.
Puede escribir un programa o función. Las expresiones deben imprimirse en STDOUT (o la alternativa más cercana). El número de expresiones puede imprimirse en STDOUT o devolverse como un entero. Se aplican restricciones de código estándar de golf.
Salida de ejemplo
0=2*0*1*5
10=20*1*.5
42=((2+0!)!+1)!/5!
100=20*1*5
4
Puntuación
Actualización : @orlp ha notado una falla en el sistema de puntuación. Ver http://meta.codegolf.stackexchange.com/questions/5106/way-of-salvaging-two-zero-one-five-puzzle-challenge para una discusión sobre cómo o si esto debería solucionarse.
Las soluciones se puntúan primero por el número de expresiones que producen y luego por la longitud de su código en bytes. Por lo tanto, un programa de 1000 bytes que produce 80 resultados superará a un programa de 100 bytes que produce solo 79 (aunque este último podría ampliarse fácilmente para incluir los resultados faltantes).
Para aquellos que desean un objetivo motivador, a continuación hay un límite inferior en la cantidad de expresiones que se pueden representar. No planeo enviar una entrada, ¡así que puede ser posible ganar con menos!
Al menos 85 (de 101), aunque puede ser más alto.
Marcador
Como incentivo adicional, aquí hay un resumen de la progresión de la puntuación. Cada vez que supere la puntuación más alta, siéntase libre de agregarse a la cima de la tabla (o pedirle a alguien más que lo haga).
- 0 expresiones, 1 byte (Pyth): implementación que solo genera 0
Respuestas:
85, ~ 2400 bytes
Estoy un poco triste porque este es un desafío de código de golf, ya que siento que todos mis esfuerzos anteriores han sido bastante inútiles ahora que voy a publicar esto:
De aquí en adelante es solo un desafío de compresión. Tal vez competiré más tarde, tal vez no. Para mí, la mayor parte de la diversión estaba en el desafío de encontrar la mayoría de las fórmulas.
Una pista para aquellos que luchan por escribir un solucionador: el tiempo de ejecución no debería ser un problema. Si tiene demasiadas fórmulas para verificar, necesita mejores heurísticas para desechar soluciones y duplicados sin remedio. El código que escribí para generar lo anterior se ejecuta en ~ 5 segundos en Python.
fuente