Todo dia, todo minuto, ... todo microssegundo, muitas decisões são tomadas pelo seu computador. Em linguagens de alto nível, elas geralmente assumem a forma de declarações como if
, while
e for
, mas no nível mais básico, existem instruções em linguagem de máquina chamadas instruções de desvio / salto . Os processadores modernos enfileiram as instruções em um pipeline , e isso significa que o processador precisa decidir se deve preencher o pipeline com instruções imediatamente após uma ramificação (ou seja, não é utilizada ) ou com as instruções no destino da ramificação.
Se o processador não acertar corretamente, as instruções que foram inseridas incorretamente no pipeline precisam ser ignoradas e as instruções corretas devem ser buscadas, causando um atraso. O trabalho do preditor de ramificação é tentar adivinhar se a ramificação será executada para evitar a ação cara de recarregar o pipeline.
Você deve escrever um preditor que, dada uma sequência de decisões passadas, adivinhe a próxima decisão corretamente. Seu programa pode ser escrito em qualquer idioma, desde que você especifique o link para o intérprete, se for um idioma obscuro / de golfe. Ele deve levar o histórico real do passado como seu primeiro argumento de linha de comando, mas não será fornecido para a primeira estimativa da sequência. Você deve retornar seu palpite, imprimindo-o em stdout. Uma decisão é da forma "y" ou "n". Cada caso de teste é uma sequência de 72 decisões, portanto, você pode assumir que o argumento histórico especificado nunca terá mais de 71 caracteres. Por exemplo, o teste "Alternando 1":
ynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynyn
Você será desqualificado se o seu programa:
- não retorna um resultado dentro de um segundo
- não retorna a
y
oun
(novas linhas não importam e são ignoradas) - tenta modificar qualquer código ou arquivo associado a esse desafio, incluindo o código de outros concorrentes
- contém qualquer coisa maliciosa
Você pode usar um arquivo para persistência, se desejar, mas ele deve ter um nome exclusivo e estar em conformidade com o acima.
Este é um desafio de código , não de golfe de código . A vitória será concedida pelo preditor de preditor de ramificação ao candidato cuja solução predizer com sucesso a maioria dos ramos em todo o conjunto de testes. Testes:
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
O conjunto completo de testes e o programa runner estão situados neste repositório do GitHub . Basta adicionar seu preditor src/predictors.txt
no formulário <name>,<command to run>
e executar main.py
. Já forneci dois preditores muito básicos para testes simples. Eu recomendaria uma largura de coluna de pelo menos 92 ao executar o corredor para obter uma saída agradável. Se você encontrar algum erro, entre em contato. :)
fonte
Respostas:
Compressor (Ruby), pontuação 1502/1656 ≈ 90.7%
Verifica se a cadeia atual seria mais compressível se 'y' ou 'n' fossem adicionados ao final. Se igualmente compressível, use o que é mais mostrado.
fonte
DéjàVu (Mathematica), pontuação 503/552 ≈ 91.123%
Procura uma recorrência linear no padrão e calcula o próximo termo. Para testar, salve como
DéjàVu,MathematicaScript -script <file>
.fonte
Historiador (Kotlin), pontuação 1548/1656 ≈ 93,478%
Prevê o futuro do passado.
Compilar com:
kotlinc Historian.kt
Executar com:
kotlin HistorianKt
fonte
Localizador de padrões (Java), pontuação 1570/1656 (≈94,8%)
1532/1656 (≈92,5%)Pequenas melhorias para padrões complexos.
fonte
Fatorio (Python3), pontuação 1563/1656 ≈ 94.38%
Fatora a sequência da esquerda para a direita em uma série de padrões repetidos e alternados. Favorece principalmente comprimentos de correspondência mais longos, mas escolhe repetir sobre padrões alternados e mais curtos ao longo de ciclos mais longos em caso de empate.
fonte
Repetidor (Python), pontuação 1173/1656 ≈ 70,83%
Esse preditor simplesmente adivinha que sim se não houver histórico; caso contrário, repete o resultado real anterior.
Repetidor! (Python), pontuação 483/1656 ≈ 29,17%
Se não houver histórico, esse indicador adivinhar que não, caso contrário, repetirá o oposto do último resultado real.
2-toucher (Python), pontuação 1087/1656 ≈ 65.64%
Se houver pelo menos dois resultados anteriores iguais ou se houver um até agora, esse preditor escolherá o mesmo. Se não houver histórico, ele escolherá "y". Se houver pelo menos dois resultados e os dois mais recentes não forem os mesmos, ele escolherá o oposto dos mais recentes.
fonte
Gostaria de deixar um comentário, mas o requisito de 50 representantes me impede.
Conseguiu uma pequena melhoria na resposta do @ histocrat
Compressor (Ruby), pontuação 1504/1656 ≈ 90.82%
Eu o aprimorei de várias maneiras diferentes, e uma melhoria de + 0,12% foi a melhor que encontrei.
fonte