Это дополнительный вопрос к моему вопросу Puzzling.SE : я спросил, есть ли функция f, отображающая логические строки в логические строки, так что f (f (b)) = reverse (b) для всех входных строк b . (Под обратным я имею в виду функцию, которая меняет порядок битов.)
Приведенная выше ссылка содержит положительный ответ, с доказательством, большим f '' , но вы, возможно, захотите обдумать вопрос для себя, прежде чем смотреть.
Реализуйте такую функцию f как можно меньше байтов.
Вы можете либо прочитать ввод из STDIN, либо взять аргумент функции; и либо записать строку результата в STDOUT, либо вернуть ее.
В любом случае, вы можете работать с фактическими строками двух отдельных байтов или символов вашего выбора (скажем ,
0
и1
, или\x00
и\x01
), или с массивами / списки truthy и falsy значений . Выберите два значения и придерживайтесь их.Результатом одного применения f должна быть сама двоичная строка: никаких глупых ответов вроде
b -> if b starts with 'x' then reverse(b[1:]) else 'x' + b
...Ваша функция должна быть полной ; в частности, входные данные могут быть пустой строкой или длиной в один бит и т. д. Верхняя граница для длины строки отсутствует.
Он также должен быть чистым : не сохранять глобальное состояние между вызовами функций; входная строка должна полностью определять выходную строку.
Ответы:
CJam, 32 байта
Попробуйте онлайн.
Слишком долго...
источник
Python 2, 64
69байтUngolfed:
Это находит период строки, то есть минимальный
p
такой, которыйs
является строкой длины,p
повтореннойn
раз (я нашел метод игры в гольф на SO). Тогда, еслиn
нечетно, это добавляет еще одно повторение периода. Еслиn
четный, он удаляет одно повторение периода и полностью изменяет его.Спасибо @ Sp3000 за помощь в реализации отображения функций между 1 <-> 2, 3 <-> 4 и т. Д.источник
Perl,
4947 байтВключает +2 для
-lp
Основан на очень хорошем алгоритме @ feersum
Запуск с вводом на STDIN, например
halfreverse.pl
:объяснение
источник