Scrivi un programma di assemblaggio GOLF che ha dato un intero senza segno a 64 bit nel registro ninserisce un valore diverso da zero nel registro sse nè un quadrato, altrimenti 0in s.
Il file binario GOLF (dopo il montaggio) deve contenere 4096 byte.
Il tuo programma verrà valutato usando il seguente programma Python3 (che deve essere inserito nella directory 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)
Assicurati di aggiornare GOLF all'ultima versione con git pull. Eseguire il programma di punteggio utilizzando python3 score.py your_source.golf.
Usa un seme statico per generare un insieme di numeri di cui circa 1/16 è quadrato. L'ottimizzazione verso questo insieme di numeri è contro lo spirito della domanda, posso cambiare il seme in qualsiasi momento. Il programma deve funzionare per qualsiasi numero di input a 64 bit non negativo, non solo per questi.
Il punteggio più basso vince.
Poiché GOLF è molto nuovo, includerò alcuni suggerimenti qui. Dovresti leggere il GOLF specifiche con tutte le istruzioni e i costi del ciclo . Nel repository Github sono disponibili esempi di programmi.
Per i test manuali, compilare il programma su un file binario eseguendo python3 assemble.py your_source.golf. Quindi eseguire il programma utilizzando python3 golf.py -p s your_source.bin n=42, questo dovrebbe avviare il programma con l' nimpostazione su 42 e stampa il registro se il conteggio dei cicli dopo essere usciti. Vedi tutti i valori dei contenuti del registro all'uscita del programma con il -dflag - usa --helpper vedere tutti i flag.
git pull. Ho trovato un bug nell'operando di sinistra che non si chiudeva correttamente.