Эта проблема свободно вдохновлен нереализованных esolang Пады .
Рассмотрим массив из 8 битов, все инициализированы нулем. Мы введем очень минималистичный набор команд для печати произвольных строк. Есть две инструкции, каждая из которых принимает параметр, N
который является индексом бита:
t N
для т oggle: Это изменяет значение битаN
.p N
для р RINT: Это интерпретирует все 8 бит в качестве байта, начиная с битаN
и обертывания вокруг конца . Символ, соответствующий этому байту, печатается в STDOUT.
Давайте посмотрим пример. Мы хотим напечатать :=
. Наивно мы достигаем этого следующим образом (0-битные индексы):
t 2 [0 0 1 0 0 0 0 0]
t 3 [0 0 1 1 0 0 0 0]
t 4 [0 0 1 1 1 0 0 0]
t 6 [0 0 1 1 1 0 1 0]
p 0 [0 0 1 1 1 0 1 0] == 58 == ':'
t 5 [0 0 1 1 1 1 1 0]
t 6 [0 0 1 1 1 1 0 0]
t 7 [0 0 1 1 1 1 0 1]
p 0 [0 0 1 1 1 1 0 1] == 61 == '='
Но вместо этого мы можем использовать циклическую функцию p
и сохранить две инструкции:
t 2 [0 0 1 0 0 0 0 0]
t 3 [0 0 1 1 0 0 0 0]
t 4 [0 0 1 1 1 0 0 0]
t 6 [0 0 1 1 1 0 1 0]
p 0 [0 0 1 1 1 0 1 0] == 58 == ':'
t 1 [0 1 1 1 1 0 1 0]
p 7 [0 1 1 1 1 0 1 0] == [0 0 1 1 1 1 0 1] == 61 == '='
^
Так что p 7
просто начинается чтение значения байта с последнего бита, а не с первого.
Соревнование
Учитывая непустую строку печатаемых символов ASCII (от 0x20 до 0x7E включительно), создайте оптимальный список инструкций (одна строка на инструкцию), чтобы напечатать эту строку с помощью вышеуказанной системы. Если существует несколько оптимальных решений (что почти всегда будет так), генерируйте только одно из них.
Вы можете выбрать между 0 и 1 индексированием для битов, но, пожалуйста, укажите свой выбор.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out). Если вы не печатаете результат в STDOUT, он все равно должен быть отдельной строкой, разделенной новой строкой.
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Тестовые случаи
Каждый тестовый пример - это отдельная строка, содержащая входную строку, за которой следует оптимальное количество инструкций и одно возможное решение.
Вы не должны выводить количество команд в своем решении - это включено только здесь, чтобы вы могли проверить правильность своего кода, если он печатает другой список команд.
?
7 instructions
t 2
t 3
t 4
t 5
t 6
t 7
p 0
:=
7 instructions
t 2
t 3
t 4
t 6
p 0
t 1
p 7
0123456789
26 instructions
t 2
t 3
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 2
t 3
p 3
t 2
p 3
9876543210
28 instructions
t 2
t 3
t 4
t 7
p 0
t 7
p 0
t 0
t 7
p 5
t 4
p 5
t 0
t 5
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
Hello, World!
39 instructions
t 1
t 4
p 0
t 3
t 7
p 2
t 1
t 6
p 2
p 2
t 0
t 1
p 2
t 0
t 1
t 3
p 2
t 6
t 7
p 2
t 0
t 2
t 6
t 7
p 1
t 0
t 1
t 5
p 0
t 2
t 7
p 3
t 2
t 6
p 0
t 4
p 0
t 1
p 3
The quick brown fox jumps over the lazy dog.
150 instructions
t 1
t 3
t 5
p 0
t 1
t 2
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 3
t 7
p 0
t 5
p 0
t 3
t 4
t 5
p 0
t 4
t 6
p 0
t 4
p 0
t 1
t 4
t 6
t 7
p 0
t 1
t 6
p 0
t 3
p 0
t 0
t 5
p 4
t 0
t 7
p 0
t 1
p 1
t 3
t 5
t 6
t 7
p 0
t 1
t 5
t 6
p 0
t 4
t 7
p 0
t 1
t 2
p 3
t 5
t 6
t 7
p 2
t 1
t 2
t 6
p 0
t 0
p 7
t 0
t 7
p 5
t 3
t 4
t 6
t 7
p 0
t 6
t 7
p 0
t 1
t 3
t 6
t 7
p 0
t 1
t 4
t 5
t 6
t 7
p 0
t 4
p 4
t 6
p 0
t 1
t 6
p 4
t 5
t 6
t 7
p 0
t 1
t 3
t 5
p 0
t 1
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 4
t 5
p 0
t 1
p 3
t 3
t 7
p 1
t 1
t 5
p 0
t 1
t 3
t 4
t 7
p 0
t 1
t 5
p 0
t 4
t 6
t 7
p 0
t 4
p 0
t 1
t 4
t 7
p 0
Тестовые случаи были созданы с помощью этой эталонной реализации CJam .