Napisz GOLF programu montażowego, że ze względu na 64-bitową liczbę całkowitą bez znaku w rejestrze n
umieszcza niezerową wartość w rejestrze s
jeśli n
jest kwadratem, inaczej 0
się s
.
Twój plik binarny GOLF (po złożeniu) musi mieścić się w 4096 bajtach.
Twój program zostanie oceniony za pomocą następującego programu Python3 (który należy umieścić w katalogu 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)
Zaktualizuj GOLF do najnowszej wersji za pomocą git pull
. Uruchom program punktacji za pomocą python3 score.py your_source.golf
.
Wykorzystuje ziarno statyczne do wygenerowania zestawu liczb, z których około 1/16 jest kwadratem. Optymalizacja w stosunku do tego zestawu liczb jest sprzeczna z duchem pytania, mogę zmienić ziarno w dowolnym momencie. Twój program musi działać na każdym nieujemnym 64-bitowym numerze wejściowym, nie tylko na te.
Najniższy wynik wygrywa.
Ponieważ GOLF jest bardzo nowy, dołączę tutaj kilka wskazówek. Należy zapoznać się z GOLF specyfikacji ze wszystkimi instrukcjami i kosztów cyklu . W repozytorium Github można znaleźć przykładowe programy.
Do testowania ręcznego skompiluj program do pliku binarnego, uruchamiając go python3 assemble.py your_source.golf
. Następnie uruchom program za pomocą python3 golf.py -p s your_source.bin n=42
, to powinno uruchomić program z n
ustawioną wartością 42, a s
po wyjściu drukuje rejestr i liczbę cykli. Zobacz wszystkie wartości zawartości rejestru przy wyjściu programu z -d
flagą - użyj, --help
aby zobaczyć wszystkie flagi.
git pull
. Znalazłem błąd w operandzie lewostronnym, w którym nie został poprawnie zawinięty.Odpowiedzi:
Wynik: 22120 (3414 bajtów)
Moje rozwiązanie wykorzystuje tabelę odnośników 3kB do inicjowania solwera metod Newtona, który działa od zera do trzech iteracji w zależności od wielkości wyniku.
źródło
Wynik: 27462
Nadszedł czas, aby wziąć udział w wyzwaniu GOLF : D
źródło
Wynik: 161558
227038259038260038263068Wziąłem najszybszy algorytm obliczania pierwiastka kwadratowego, jaki udało mi się znaleźć, i zwróciłem, czy jego reszta to zero.
EDYCJA 1: usunięto test kwadratu, wróć! Pozostała część bezpośrednio, zapisz 3 operacje na test
EDYCJA 2: użyj n jako reszty bezpośrednio, z wyjątkiem 1 operacji na test
EDYCJA 3: uprościła warunek pętli, zapisz 32 operacje na test
EDYCJA 4: rozwinął pętlę, oszczędzając około 65 operacji na test
źródło
0x4000000000000000
jako1 << 62
:)Wynik: 344493
Wykonuje proste wyszukiwanie binarne w odstępie czasu w
[1, 4294967296)
celu przybliżeniasqrt(n)
, a następnie sprawdza, czyn
jest to idealny kwadrat.źródło