Escreva um programa de montagem GOLF que, dado um número inteiro não assinado de 64 bits, registre num valor diferente de zero no registrador, sse nfor um quadrado, caso contrário, 0em s.
Seu binário GOLF (após a montagem) deve caber em 4096 bytes.
Seu programa será pontuado usando o seguinte programa Python3 (que deve ser colocado dentro do diretório GOLF ):
import random, sys, assemble, golf, decimal
def is_square(n):
nd = decimal.Decimal(n)
with decimal.localcontext() as ctx:
ctx.prec = n.bit_length() + 1
i = int(nd.sqrt())
return i*i == n
with open(sys.argv[1]) as in_file:
binary, debug = assemble.assemble(in_file)
score = 0
random.seed(0)
for i in range(1000):
cpu = golf.GolfCPU(binary)
if random.randrange(16) == 0: n = random.randrange(2**32)**2
else: n = random.randrange(2**64)
cpu.regs["n"] = n
cpu.run()
if bool(cpu.regs["s"]) != is_square(n):
raise RuntimeError("Incorrect result for: {}".format(n))
score += cpu.cycle_count
print("Score so far ({}/1000): {}".format(i+1, score))
print("Score: ", score)
Certifique-se de atualizar o GOLF para a versão mais recente com git pull. Execute o programa de pontuação usando python3 score.py your_source.golf.
Ele usa uma semente estática para gerar um conjunto de números dos quais aproximadamente 1/16 é quadrado. A otimização em relação a esse conjunto de números é contrária ao espírito da pergunta. Posso mudar a semente a qualquer momento. Seu programa deve funcionar para qualquer número de entrada não negativo de 64 bits, não apenas esses.
Menor pontuação ganha.
Como o GOLF é muito novo, incluirei alguns indicadores aqui. Você deve ler a especificação GOLF com todas as instruções e custos de ciclo . No repositório Github, exemplos de programas podem ser encontrados.
Para teste manual, compile seu programa para um binário executando python3 assemble.py your_source.golf. Em seguida, execute o programa usando python3 golf.py -p s your_source.bin n=42, isso deve iniciar o programa com n42, e imprime o registro se a contagem do ciclo após a saída. Veja todos os valores do conteúdo do registro na saída do programa com o -dsinalizador - use --helppara ver todos os sinalizadores.
git pull. Encontrei um bug no operando à esquerda, que não era encapsulado corretamente.