Todos los días, cada minuto, ... cada microsegundo, su computadora toma muchas decisiones. En lenguajes de alto nivel, estos típicamente toman la forma de declaraciones como if
, while
y for
, pero en el nivel más básico existen instrucciones de lenguaje de máquina llamadas instrucciones de salto / rama . Los procesadores modernos ponen en cola las instrucciones en una tubería , y esto significa que el procesador necesita decidir si llenar la tubería con instrucciones inmediatamente después de una rama (es decir, no se toma ) o las instrucciones en el destino de la rama.
Si el procesador no adivina correctamente, las instrucciones que se ingresaron incorrectamente en la tubería deben ignorarse y las instrucciones correctas deben buscarse, lo que provoca un retraso. El trabajo del predictor de rama es tratar de adivinar si se tomará la rama para evitar la costosa acción de rellenar la tubería.
Debe escribir un predictor que, dada una secuencia de decisiones pasadas, adivine la siguiente decisión correctamente. Su programa se puede escribir en cualquier idioma, siempre que especifique el enlace a su intérprete si es un lenguaje oscuro / de golf. Debe tomar el historial real pasado como su primer argumento de línea de comandos, pero no se proporcionará para la primera aproximación de la secuencia. Luego debe devolver su suposición imprimiéndola en stdout. Una decisión tiene la forma "y" o "n". Cada caso de prueba es una secuencia de 72 decisiones, por lo que puede suponer que el argumento del historial especificado nunca tendrá más de 71 caracteres. Por ejemplo, la prueba "Alternar 1":
ynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynyn
Será descalificado si su programa:
- no devuelve un resultado dentro de un segundo
- no devuelve ni a
y
nin
(las nuevas líneas no importan y se ignoran) - intenta modificar cualquier código o archivo asociado con este desafío, incluido el código de otro contendiente
- contiene cualquier otra cosa maliciosa
Puede usar un archivo para persistencia si lo desea, pero debe tener un nombre único y cumplir con lo anterior.
Este es un desafío de código , no un código de golf . El predictor de rama otorgará la victoria al contendiente cuya solución predice con éxito la mayoría de las ramas en todo el conjunto de pruebas. Pruebas:
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy,All yes
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn,All no
ynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynyn,Alternating 1
nnyynnyynnyynnyynnyynnyynnyynnyynnyynnyynnyynnyynnyynnyynnyynnyynnyynnyy,Alternating 2
yyynnnyyynnnyyynnnyyynnnyyynnnyyynnnyyynnnyyynnnyyynnnyyynnnyyynnnyyynnn,Alternating 3
nnnnyyyynnnnyyyynnnnyyyynnnnyyyynnnnyyyynnnnyyyynnnnyyyynnnnyyyynnnnyyyy,Alternating 4
yyyyyynnnnnnyyyyyynnnnnnyyyyyynnnnnnyyyyyynnnnnnyyyyyynnnnnnyyyyyynnnnnn,Alternating 5
nnnnnnnnnnnnyyyyyyyyyyyynnnnnnnnnnnnyyyyyyyyyyyynnnnnnnnnnnnyyyyyyyyyyyy,Alternating 6
yyyyyyyyyyyyyyyyyynnnnnnnnnnnnnnnnnnyyyyyyyyyyyyyyyyyynnnnnnnnnnnnnnnnnn,Alternating 7
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyynnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn,Alternating 8
yynyynyynyynyynyynyynyynyynyynyynyynyynyynyynyynyynyynyynyynyynyynyynyyn,2-1
ynnnynnnynnnynnnynnnynnnynnnynnnynnnynnnynnnynnnynnnynnnynnnynnnynnnynnn,1-3
nyyyyynyyyyynyyyyynyyyyynyyyyynyyyyynyyyyynyyyyynyyyyynyyyyynyyyyynyyyyy,5-1
nnnnnnnnnnnynnnnnnnnnnnynnnnnnnnnnnynnnnnnnnnnnynnnnnnnnnnnynnnnnnnnnnny,1-11
nyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyynyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy,35-1
yynnnnyynnnnyynnnnyynnnnyynnnnyynnnnyynnnnyynnnnyynnnnyynnnnyynnnnyynnnn,2-4
ynnyyynyynnnynnyyynyynnnynnyyynyynnnynnyyynyynnnynnyyynyynnnynnyyynyynnn,1-2-3
ynynynynynynynynynynynynynynynynynynyyyyyyyyyyyyyyyyyynnnnnnnnnnnnnnnnnn,A1/A7
yyyyyynnnnnnyyyyyynnnnnnyyyyyynnnnnnnnyynnyynnyynnyynnyynnyynnyynnyynnyy,A5/A2
nnnnnnnnnnnnyyyyyyyyyyyynnnnnnnnnnnnyyyynnnnyyyynnnnyyyynnnnyyyynnnnyyyy,A6/A4
nyyyyynyyyyynyyyyynyyyyynyyyyynyyyyynyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy,5-1/35-1
yyynnnyyynnnyyynnnnyyyyyyyyyyyyyyyyyyyyyyynyyyyynyyyyyyynnnnyynnnnyynnnn,A3/Y/5-1/2-4
yynnnnyynnnnyynnnnnyynnnynnyyynyynnnnnnynnnynnnynnnynnyynyynyynyynyynyyn,2-4/1-2-3/1-3/2-1
El conjunto completo de pruebas y el programa runner se encuentran en este repositorio de GitHub . Simplemente agregue su predictor src/predictors.txt
en el formulario <name>,<command to run>
y ejecútelo main.py
. Ya he proporcionado dos predictores muy básicos para pruebas simples. Recomendaría un ancho de columna de al menos 92 al ejecutar el corredor para obtener una buena salida. Si encuentra algún error con él, hágamelo saber. :)
fuente
Respuestas:
Compresor (Ruby), puntaje 1502/1656 ≈ 90.7%
Comprueba si la cadena actual sería más comprimible si 'y' o 'n' se agregaran al final. Si es igualmente compresible, use el que se muestra más.
fuente
DéjàVu (Mathematica), puntaje 503/552 ≈ 91.123%
Busca una recurrencia lineal en el patrón y calcula el siguiente término. Para probar, guardar como
DéjàVu,MathematicaScript -script <file>
.fuente
Historiador (Kotlin), puntaje 1548/1656 ≈ 93.478%
Predice el futuro del pasado.
Compilar con:
kotlinc Historian.kt
Ejecutar con:
kotlin HistorianKt
fuente
Buscador de patrones (Java), puntaje 1570/1656 (≈94.8%)
1532/1656 (≈92.5%)Ligeras mejoras para patrones complejos.
fuente
Factorio (Python3), puntaje 1563/1656 ≈ 94.38%
Factores de la secuencia de izquierda a derecha en una serie de patrones repetitivos y alternos. Principalmente favorece la duración de los partidos más largos, pero elige repetir sobre patrones alternos y más cortos sobre ciclos más largos en caso de empate.
fuente
Repetidor (Python), puntaje 1173/1656 ≈ 70.83%
Este predictor simplemente adivina sí si no hay historial, de lo contrario repite el resultado real anterior.
! Repetidor (Python), puntuación 483/1656 ≈ 29.17%
Si no hay historial, este predictor adivinará que no, de lo contrario repetirá lo contrario del último resultado real.
2-toucher (Python), puntaje 1087/1656 ≈ 65.64%
Si hubo al menos dos resultados anteriores que fueron iguales, o ha habido un resultado hasta ahora, este predictor elegirá lo mismo. Si no hay historial, elegirá "y". Si hubo al menos dos resultados y los dos más recientes no fueron iguales, se elegirá lo opuesto al más reciente.
fuente
Dejaría un comentario, pero el requisito de 50 repeticiones me lo impide.
Pude obtener una pequeña mejora en la respuesta de @ histocrat
Compresor (Ruby), puntaje 1504/1656 ≈ 90.82%
Lo modifiqué de varias maneras diferentes, y una mejora de + 0.12% fue lo mejor que encontré.
fuente