Tienes que escribir un programa, implementando una función digitsum(int i)
. El programa tiene que modificar su propio código (para los idiomas, donde esto no es posible con una reflexión fe , por favor sea creativo) para resolver el objetivo.
Empiezas con
function digitsum(int i){
return i;
}
e implementar un algoritmo evolutivo que modificará la función anterior hasta que devuelva dígitos válidos en la llamada a la función.
Como este es un concurso de popularidad, tienes muchas manos libres, ¡sé creativo!
Pautas:
- Comience con la función definida (traducida a su idioma, por supuesto).
- Imprima al menos la función más adecuada de cada generación.
- Imprima su solución de trabajo probada para 0 <i <10000.
- ¡Ser creativo!
No haga:
- Indique a su programa la solución, ¡utilice todas las opciones de idioma!
- Lanzar errores a la consola.
- Use cualquier entrada externa. Puede escribir y guardar en archivos creados por su programa. Sin internet.
¡La solución válida con más votos a favor gana!
popularity-contest
reggaemuffin
fuente
fuente
no libraries
Permitido significa que no hay libc?no libraries
que sería para imo complejo, para que los votantes puedan decidir si se usan muchas bibliotecas!Respuestas:
C#
Solución de ensamblaje casi completamente aleatoria y cruda. En cuanto a C # y casi cualquier otra plataforma, este es el nivel más bajo posible. Afortunadamente, C # le permite definir métodos durante el tiempo de ejecución en IL (IL es lenguaje intermedio, el código de bytes de .NET, similar al ensamblado). La única limitación de este código es que elegí algunos códigos de operación (de cientos) con una distribución arbitraria que sería necesaria para la solución perfecta. Si permitimos todos los códigos de operación, las posibilidades de que un programa funcione sea escasa o nula, por lo que esto es necesario (como puede imaginar, hay muchas maneras en que las instrucciones de ensamblaje aleatorio pueden fallar, pero afortunadamente, no derriban todo el programa en la red). Además del rango de posibles códigos de operación, es completamente aleatorio cortar y cortar en cubos los códigos de operación IL sin ningún tipo de insinuación.
Lo siento, no tengo resultados hasta ahora porque incluso con las pruebas para 1..99 (en lugar de 1..9999) es bastante lento y estoy demasiado cansado. Nos pondremos en contacto contigo mañana.
EDITAR: Terminé el programa y lo modifiqué mucho. Ahora, si presiona CTRL-C, finalizará la ejecución actual y mostrará los resultados en archivos. Actualmente, las únicas soluciones viables que produce son programas que siempre devuelven un número constante. Estoy empezando a pensar que las posibilidades de un programa de trabajo más avanzado son astronómicamente pequeñas. De todos modos lo mantendré funcionando por algún tiempo.
EDITAR: Sigo modificando el algoritmo, es un juguete perfecto para un geek como yo. Una vez vi un programa generado que realmente hacía algunos cálculos aleatorios y no siempre devolvía un número constante. Sería increíble ejecutarlo en unos pocos millones de CPU a la vez :). Lo seguirá ejecutando.
EDITAR: Aquí está el resultado de algunas matemáticas completamente al azar. Salta y permanece en 17 para el resto de los índices. No se volverá consciente en el corto plazo.
EDITAR: Se está volviendo más complicado. Por supuesto, como era de esperar, no se parece en nada al algoritmo digitsum adecuado, pero se está esforzando mucho. ¡Mira, un programa de ensamblaje generado por computadora!
fuente
C#
Puede que esto no sea completamente lo que imaginabas, pero es lo mejor que puedo hacer en este momento. (Al menos con C # y CodeDom).
Entonces, cómo funciona:
((i & v1) >> v2)
. Estos términos serán los genes que mutarán a lo largo de la carrera.El código:
Probado en OSX con el compilador Mono C # versión 3.2.6.0.
En cada iteración imprime el valor de aptitud del cálculo actual. Al final, imprimirá la mejor solución junto con su aptitud. El ciclo se ejecutará hasta que uno de los resultados tenga un valor de aptitud de 0.
Asi es como empieza:
Y después de un tiempo (toma alrededor de 30 minutos), así es como termina (mostrando la última y casi la última iteración):
Notas:
a >> b
usara / 2^b
return i;
requerida por el problema.i & a >> a
lugar dei & a >> b
, ya que en el último caso la evolución fue simplemente demasiado lenta para ser práctica.return (i&a>>b)+(i&c>>d)+...
, ya que cualquier otro tipo (como tratar de generar un código "adecuado", con bucles, asignaciones, verificaciones de condición, etc.) simplemente convergería demasiado lentamente. También de esta manera es muy fácil definir los genes (cada uno de los términos), y es muy fácil mutarlos.0..10000
(si marca la solución encontrada, puede ver que no funcionará para números mayores que 16384)fuente
Javascript
Bueno, obtuve un problema de precisión de punto flotante con mi respuesta, que probablemente se puede resolver usando una biblioteca BigDecimal, cuando los números de entrada son mayores que
55
.Sí, eso está lejos de ser
10000
así que no espero ganar, pero sigue siendo un método interesante basado en este tema .Calcula una [interpolación polinómica] ( http://en.wikipedia.org/wiki/Polynomial_interpolation ) basada en un conjunto de puntos, por lo que solo utiliza multiplicación, división y suma, sin módulos ni operadores bit a bit.
Función de salida:
Esta función polinómica (simplificada hasta el grado 25 y sin redondeo) trazada, mira los valores para números enteros (legible para [6; 19]):
Pruebas:
fuente