Scrivi un programma di assemblaggio GOLF che ha dato un intero senza segno a 64 bit nel registro n
inserisce un valore diverso da zero nel registro s
se n
è un quadrato, altrimenti 0
in 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' n
impostazione su 42 e stampa il registro s
e il conteggio dei cicli dopo essere usciti. Vedi tutti i valori dei contenuti del registro all'uscita del programma con il -d
flag - usa --help
per vedere tutti i flag.
git pull
. Ho trovato un bug nell'operando di sinistra che non si chiudeva correttamente.