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

Программирование EDSAC

Программирование EDSAC

Первым полномасштабным электронным цифровым компьютером в мире был EDSAC (Автоматический вычислитель на электронных линиях задержки). EDSAC имел набор команд, который работал с \textbf{17}-битовыми словами (и \textbf{35}-битовыми двойными словами), а также использовал \textbf{5}-битовый телетайп код для ввода и вывода данных. Программирование EDSAC совершалось при помощи простого языка ассемблера: одна буква представляла собой код операции, за которой следовал беззнаковый десятичный адрес и буква "\textbf{F}" (для полного слова) или "\textbf{D}" (для двойного слова). Например, инструкция "\textbf{A 128 F}" означала "\textbf{добавить полное слово в ячейку 128 аккумулятора}", и преобразовывалась в \textbf{17}-битовый бинарный код \textbf{11100000100000000}, состоящий из \textbf{5}-битового кода операции (\textbf{11100}="\textbf{add}"), \textbf{11}-битового операнда (\textbf{00010000000 = 128}), и одного \textbf{0} бита указывающего на операцию над полным словом (\textbf{1} бит указывал на операцию над двойным словом). И хотя арифметика в EDSAC была с фиксированной точкой, это была не просто целочисленная арифметика (как в обычных современных машинах). Считалось, что десятичная точка в EDSAC аппаратно находится между самым левым битом и битом справа от него. Таким образом, аппаратно можно было оперировать только на значениях в промежутке \textbf{-1.0} ≤ \textbf{x} < \textbf{1.0}. Например: Как можно заметить, наибольшее возможное положительное значение равно: \textbf{01111111111111111 = 0.9999847412109375} а наименьшее возможное положительное значение равно: \textbf{00000000000000001 = 2^\{-16\} = 0.0000152587890625} (оно также равно прирасту между двумя последовательными значениями в EDSAC). По любопытному совпадению (или элегантному дизайнерскому решению), код операции прибавления (\textbf{11100}) совпадал с кодом буквы "\textbf{A}" телетайпа. Код операции вычитания совпадал с кодом буквы "\textbf{S}" (\textbf{01100}) телетайпа и так далее. Это упрощало программирование под ассемблер (команды которого состояли всего лишь из \textbf{31} инструкции). Алфавит телетайпа EDSAC был "\textbf{PQWERTYUIOJ#SZK*?F@D!HNM&LXGABCV}" (где "\textbf{P}"=\textbf{00000}, "\textbf{Q}"=\textbf{00001}, и так далее до "\textbf{V}"=\textbf{11111}). К несчастью, ассемблер EDSAC не имел специальных директив для обработки данных. С другой стороны, не было никаких оснований, что обычные команды не могут для этого использоваться. Поэтому программист EDSAC, желая зарезервировать место под константу \textbf{3/4} (представляемую как \textbf{01100000000000000}), использовал инструкцию "\textbf{S O F}" а под \textbf{1/3} (представляемую приблизительно как \textbf{00101010101010101}) "\textbf{T 682 D}", и так далее. Вам следует написать программу, которая преобразует десятичные значения в соответствующие команды EDSAC. \InputFile Первая строка содержит одно целое число \textbf{P} (\textbf{1} ≤ \textbf{P} ≤ \textbf{1000}) - количество тестов. Каждый тест представляет собой одну строку и содержит два числа \textbf{N} и \textbf{D}. \textbf{N} представляет собой номер теста. \textbf{D} - десятичное значение в виде \textbf{sd.ddd....}, где \textbf{s} - необязательный знак минус, а \textbf{d} - любая из десятичных цифр (\textbf{0-9}). После десятичной точки присутствует как минимум \textbf{1} и не более \textbf{16} цифр. \OutputFile Для каждого теста вывести одну строку. Она должна содержать номер теста (\textbf{N}), пробел и команду EDSAC, достаточную для задания указанной константы. Команду следует выводить следующим образом: символ кода операции "\textbf{opcode}", пробел, операнд (неотрицательное десятичное целое), пробел и символ '\textbf{F}' или '\textbf{D}' (по мере необходимости). Если константу нельзя точно представить \textbf{17} битами, то значение следует округлить в сторону нуля (вверх для отрицательных и вниз для положительных чисел). Если значение \textbf{D} не лежит в промежутке \textbf{-1.0} ≤ \textbf{D} ≤ \textbf{1.0}, то следует вывести строку "\textbf{INVALID VALUE}" вместо команды EDSAC.
Лимит времени 1 секунда
Лимит использования памяти 64 MiB
Входные данные #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