Debería escribir un programa de Brainfuck (BF) de 100 bytes de longitud.
Un personaje se eliminará de todas las formas posibles de los 100 nuevos programas resultantes (99 bytes de longitud). Por ejemplo, para el programa de ++.>.
las 5 subprogramas son +.>.
, +.>.
, ++>.
, ++..
y ++.>
.
Su puntaje será el número de resultados únicos que generan los 100 programas. Mayor puntaje es mejor.
Detalles
- Sus programas finalizarán después de generar el primer carácter.
- Los programas no válidos o que no terminan y los programas que generan salidas vacías no se cuentan para la puntuación.
- Las celdas BF son envolturas de 8 bits. (255 + 1 = 0, 0-1 = 255)
- Su programa no recibe ninguna entrada. Si usa
,
en el código, establece la celda actual en0
. - No hay celdas en el lado izquierdo de la posición inicial. Por ejemplo,
<.
no es válido pero.<
es válido ya que la ejecución finaliza en.
. La cinta no tiene límites en la otra dirección. - Los programas con corchetes desequilibrados (
[
y]
) no son válidos. - Su programa original puede tener menos de 100 bytes, ya que es fácil extenderlo a 100 bytes sin cambiar la puntuación.
- Su programa original no tiene que ser un código BF válido.
Puede usar este programa python3 (enlace ideone) para determinar el puntaje de su respuesta. (Para programas de larga ejecución, es posible que deba modificar la maxstep
variable).
Ejemplo
(Para simplificar, este programa es más corto que 100 bytes).
Solution: ++,+[-]+><.-,-.
Score: 3
Explanation:
Subprogram => Output
+,+[-]+><.-,-. => 1
+,+[-]+><.-,-. => 1
+++[-]+><.-,-. => 1
++,[-]+><.-,-. => 1
++,+-]+><.-,-. => None
++,+[]+><.-,-. => None
++,+[-+><.-,-. => None
++,+[-]><.-,-. => 0
++,+[-]+<.-,-. => None
++,+[-]+>.-,-. => 0
++,+[-]+><-,-. => 255
++,+[-]+><.,-. => 1
++,+[-]+><.--. => 1
++,+[-]+><.-,. => 1
++,+[-]+><.-,- => 1
Unique outputs are [0, 1, 255]
Score is 3 for ++,+[-]+><.-,-. (length = 15)
En caso de empate, el ganador es el que tiene el código más corto. (Su programa puede tener menos de 100 bytes como se indica en la sección Detalles). Si los códigos tienen la misma longitud, el ganador es el cartel anterior.
Bonus puzzle: sin la restricción en negrita, ¿puedes encontrar un programa con puntaje 100?
fuente
Respuestas:
Puntuación:
354169787983(Elimine la nueva línea).
Pruébalo en línea!
No estoy seguro exactamente por qué funciona ...
Puntuación: 79
Pruébalo en línea!
Se suponía que debía sumar 2 * mem [i] * i y agregar el número de celdas (+ const) donde las direcciones se cuentan de derecha a izquierda. El multiplicador 2 y el número de celdas pueden hacer que eliminar + y> tengan una paridad diferente.
De hecho, funcionó así en la versión de 69 puntos. Pero la última versión rompió eso y obtuvo algo más por coincidencia. Calcula la suma (mem [i] * i + i + 1) y eliminar + y> hace casi lo mismo, excepto por la suma (i) que tiene una diferencia del número de celdas, que también es el número de resultados diferentes para eliminar + y>.
Por el bono:
fuente
maxstep
valor (indef evaluate(r,maxstep=20000):
) ya que algunos subprogramas se ejecutan durante mucho tiempo.79
reemplazando->+>+> ...
con->,>+> ...
Puntuación:
3743EDITAR: ahora mi programa permite algunos corchetes. No voy a ganar ningún premio con eso, pero eso es lo que obtengo por hacer que algunos RNG pesados hagan el trabajo ocupado por mí.
Esto fue generado por un programa que escribí en C.
Para cada
N
carácter eliminado, aquí están las salidas:Hay un total de 37 salidas únicas, que son (en orden numérico):
Estoy
90%100% seguro de que esta solución no es óptima, peroestoyprobando que puede ser extremadamente difícil. Hay algunas cosas que están claras. No tener.
símbolos hasta el último carácter parece ser el camino a seguir, y los corchetes (. Pensé un poco aquí, lo que me gustaría resumir:[]
) parecen ser bastante inútilesSea
L
la longitud del código en bytes (en el desafío100
) yn
el número de salidas únicas de los subprogramas.Para
L=3
, hay varias soluciones óptimas de la forma+-.
, donden=2
(en este caso, las salidas son 1 y 255 para+.
y-.
, respectivamente.) Esto pone la mejor relación paraL = 3
atn/L = 66.67%
. Tenga en cuenta que esta proporción no puede ser superada por al menosL<10
.Para
L=10
, las soluciones son lo suficientemente simples como para aplicar fuerza bruta. Aquí están todas las mejores soluciones, enn = 6
:Lo que produce una relación de puntuación de
n/L = 60%
.Como
L->infinity
, está claro que la relación debe acercarse a 0, ya que solo hay 255 posibles salidas para un potencial infinitoL
.Sin embargo, la relación NO disminuye uniformemente. No es posible construir una solución para
n=6, L=9
, por lo que la mejor relación posible paraL=9
es5/9 = 55.56% < 60%
.Esto plantea la pregunta, ¿qué tan rápido y en qué materia desciende la relación? Para
L = 100
, y en10^9 checks/second
, tomaría varios órdenes de magnitud más tiempo que la vida del universo para imponer una solución óptima. ¿Hay una manera elegante de hacer esto?Dudo mucho que se ha reducido a37%
paraL = 100
.La proporción en realidad aumenta, hasta
L=100
. Ver otras respuestas para confirmar.Me encantaría escuchar sus evaluaciones de lo anterior. Yo
podría estarera atrozmente mal, después de todo.fuente