eolymp
bolt
Спробуйте наш новий інтерфейс для відправки розв'язків
Задачі

Програмування EDSAC

Програмування EDSAC

Ліміт часу 1 секунда
Ліміт використання пам'яті 64 MiB

Первым полномасштабным электронным цифровым компьютером в мире был EDSAC (Автоматический вычислитель на электронных линиях задержки). EDSAC имел набор команд, который работал с 17-битовыми словами (и 35-битовыми двойными словами), а также использовал 5-битовый телетайп код для ввода и вывода данных.

Программирование EDSAC совершалось при помощи простого языка ассемблера: одна буква представляла собой код операции, за которой следовал беззнаковый десятичный адрес и буква "F" (для полного слова) или "D" (для двойного слова). Например, инструкция "A 128 F" означала "добавить полное слово в ячейку 128 аккумулятора", и преобразовывалась в 17-битовый бинарный код 11100000100000000, состоящий из 5-битового кода операции (11100="add"), 11-битового операнда (00010000000 = 128), и одного 0 бита указывающего на операцию над полным словом (1 бит указывал на операцию над двойным словом).

И хотя арифметика в EDSAC была с фиксированной точкой, это была не просто целочисленная арифметика (как в обычных современных машинах). Считалось, что десятичная точка в EDSAC аппаратно находится между самым левым битом и битом справа от него. Таким образом, аппаратно можно было оперировать только на значениях в промежутке -1.0x < 1.0. Например:

Как можно заметить, наибольшее возможное положительное значение равно:

01111111111111111 = 0.9999847412109375

а наименьшее возможное положительное значение равно:

00000000000000001 = 2^{-16} = 0.0000152587890625

(оно также равно прирасту между двумя последовательными значениями в EDSAC).

По любопытному совпадению (или элегантному дизайнерскому решению), код операции прибавления (11100) совпадал с кодом буквы "A" телетайпа. Код операции вычитания совпадал с кодом буквы "S" (01100) телетайпа и так далее. Это упрощало программирование под ассемблер (команды которого состояли всего лишь из 31инструкции). Алфавит телетайпа EDSAC был "PQWERTYUIOJ#SZK*?F@D!HNMLXGABCV" (где "P"=00000, "Q"=00001, и так далее до "V"=11111).

К несчастью, ассемблер EDSAC не имел специальных директив для обработки данных. С другой стороны, не было никаких оснований, что обычные команды не могут для этого использоваться. Поэтому программист EDSAC, желая зарезервировать место под константу 3/4 (представляемую как 01100000000000000), использовал инструкцию "S O F" а под 1/3 (представляемую приблизительно как 00101010101010101) "T 682 D", и так далее.

Вам следует написать программу, которая преобразует десятичные значения в соответствующие команды EDSAC.

Вхідні дані

Первая строка содержит одно целое число P (1P1000) - количество тестов. Каждый тест представляет собой одну строку и содержит два числа N и D. N представляет собой номер теста. D - десятичное значение в видеsd.ddd...., где s - необязательный знак минус, а d - любая из десятичных цифр (0-9). После десятичной точки присутствует как минимум 1 и не более 16 цифр.

Вихідні дані

Для каждого теста вывести одну строку. Она должна содержать номер теста (N), пробел и команду EDSAC, достаточную для задания указанной константы. Команду следует выводить следующим образом: символ кода операции "opcode", пробел, операнд (неотрицательное десятичное целое), пробел и символ 'F' или 'D' (по мере необходимости). Если константу нельзя точно представить 17 битами, то значение следует округлить в сторону нуля (вверх для отрицательных и вниз для положительных чисел). Если значение D не лежит в промежутке -1.0D1.0, то следует вывести строку "INVALID VALUE" вместо команды EDSAC.

Приклад

Вхідні дані #1
16
1 0.5
2 -0.5
3 -1.0000000
4 0.1
5 0.0000152587890625
6 0.0000152587890624
7 0.0000152587890626
8 -0.0000152587890625
9 -0.0000152587890624
10 -0.0000152587890626
11 0.9999999999999999
12 -0.9999999999999999
13 -5.3
14 9.1
15 -1.0000000000000001
16 0.31415926
Вихідні дані #1
1 I 0 F
2 & 0 F
3 ? 0 F
4 Q 1228 D
5 P 0 D
6 P 0 F
7 P 0 D
8 V 2047 D
9 P 0 F
10 V 2047 D
11 * 2047 D
12 ? 0 D
13 INVALID VALUE
14 INVALID VALUE
15 INVALID VALUE
16 T 54 F
Джерело 2011 Greater New York Regional