Написати GOLF програму збирання , що дана 64-бітове ціле число без знака в регістрі n
ставить нульове значення в регістр , s
якщо n
є квадрат, в іншому випадку 0
в s
.
Ваш двійковий код GOLF (після складання) повинен містити 4096 байт.
Ваша програма буде оцінена за допомогою наступної програми Python3 (яку потрібно помістити всередині каталогу 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)
Не забудьте оновити GOLF до останньої версії с git pull
. Запустіть програму за допомогою, використовуючи python3 score.py your_source.golf
.
Він використовує статичне насіння, щоб генерувати набір чисел, приблизно 1/16 - квадрат. Оптимізація до цього набору чисел суперечить духу питання, я можу змінити насіння в будь-який момент. Ваша програма повинна працювати на будь-яке невід’ємне 64-бітове число введення, не тільки на це.
Виграє найнижчий рахунок.
Оскільки GOLF зовсім новий, я включу сюди декілька покажчиків. Ви повинні прочитати ГОЛЬФ специфікацію та зрозумійте всі інструкції і витрат циклу . У репозиторії Github можна знайти приклади програм.
Для тестування вручну складіть програму до двійкового файлу, запустивши python3 assemble.py your_source.golf
. Потім запустіть програму, використовуючи python3 golf.py -p s your_source.bin n=42
цю програму , слід запустити програму зі n
значенням 42, а s
після виходу з друку реєструвати та кількість циклів. Переглянути всі значення вмісту регістра при виході з програми з -d
прапором - використовуйте --help
для перегляду всіх прапорів.
git pull
. Я знайшов помилку в операнді лівої зміни, де він не був належним чином завернутий.