Этот вызов создан в честь моего первого эзотерического языка, Backhand !
Backhand - это одномерный язык с нелинейным потоком указателей. Указатель перемещается по три шага за раз, выполняя только каждую третью инструкцию.
Программа 1..1..+..O..@
добавит 1 + 1 и вывод 2 до завершения. Промежуточные инструкции пропущены, поэтому 1<>1()+{}O[]@
точно такая же программа.
Когда указатель собирается сойти с конца ленты, он вместо этого меняет направление и переходит в другую сторону, 1.@1.O+.
как и та же программа. Обратите внимание, что он считает команду завершения только один раз. Это позволяет нам сжимать большинство линейных программ, таких как1O+1@
Ваша задача здесь состоит в том, чтобы написать программу или функцию, которая принимает строку и выводит инструкции, которые были бы выполнены, если бы программа была интерпретирована как Backhand (вам не нужно обрабатывать какие-либо фактические инструкции Backhand). Вы должны выводить только до тех пор, пока указатель не окажется на последнем символе строки (после чего выполнение обычно будет идти назад).
Но подождите , это еще не все! Когда ваша программа интерпретируется таким образом, результирующий код должен вывести одно из следующих:
(Mostly) works
Turing complete
'Recreational'
(кавычки могут быть или'
или"
, но не оба)Perfectly okay
Only a few bugs
Например, если у вас есть исходный код code 2 backhand
, программа ce cankb od2ahd
должна вывести одну из этих фраз.
Тестовые случаи:
"1 1 + O @" -> "11+O@"
"1O+1@" -> "11+O@"
"HoreWll dlo!" -> "Hello World!"
"abcdefghijklmnopqrstuvwxyz" -> "adgjmpsvyxurolifcbehknqtwz"
"0123456789" -> "0369" (not "0369630369")
"@" -> "@"
"io" -> "io" (Cat program in Backhand)
"!?O" -> "!?O" (Outputs random bits forever in Backhand)
"---!---!" -> "-!-----!"
И справочная программа, написанная, конечно же, в Backhand ( это может быть немного глючно. Хорошо, я думаю, что я это исправил).
Правила.
- Стандартные лазейки запрещены
- Ввод первой программы будет содержать только ASCII для печати и переноса строк (то есть байты
0x20
-0x7E
так же как 0x0A) - Вы можете выбрать, будет ли ваша вторая программа преобразована из вашей первой байтами или символами UTF-8.
- Вторая программа:
- Дело не имеет значения, поэтому ваш вывод может быть,
pErFectLy OKay
если хотите. - Любое количество конечных / ведущих пробелов (перевод строки, табуляция, пробелы) также в порядке.
- Вторая программа должна быть того же языка, что и первая, но не обязательно того же формата (программа / функция)
- Я рад включить предложения из комментариев на дополнительные фразы (если они не слишком короткие)
- Дело не имеет значения, поэтому ваш вывод может быть,
- Так как это код-гольф , ваша цель - получить кратчайший ответ для вашего языка!
- Через две недели я присуду 200 наград за самый короткий ответ.
источник
"---!---!"
Ответы:
R 187 байт
Попробуйте онлайн!
Единственный пробел в конце необходим, чтобы
\n
никогда не печататься, когда программа применяется к себе.объяснение
Часть 1:
Ungolfed:
Часть 2:
Функция производит это, когда она действует на всю программу:
источник
Python 2 ,
1631301271211159996 байтПопробуйте онлайн!
Выходы:
источник
Perl 6 ,
10186 байтВау, -25 байт благодаря nwellnhof, радикально улучшив первую программу
Попробуйте онлайн!
Я надеюсь, что больше людей воспользуются преимуществом такого отскока. Backhandded программа является
Который комментирует просто
{"(Mostly) works"}
.источник
05AB1E ,
43403837 байтов-2 байта (40 → 38) благодаря @Emigna .
Попробуйте онлайн . (PS: переключить язык с 05AB1E (прежняя версия) на 05AB1E для контрольного примера
0123456789
. версия работает быстрее, но показывает неверные результаты для вводов с ведущими нулями.)Программа «backhandded» станет:
Который будет выводиться
perfectly okay
в полном нижнем регистре.Попробуйте онлайн.
Пояснение базовой программы:
Пояснение «закулисная» программа:
Шаг за шагом происходит следующее:
„ÃеÝ
: STACK становится["perfectly okay"]
[
: Запустить бесконечный циклN©
: STACK становится["perfectly okay", 0]
I
: STACK остается["perfectly okay", 0]
потому что нет ввода#
: STACK становится["perfectly okay"]
, и цикл продолжаетсяN
: STACK становится["perfectly okay", 0]
#
: STACK становится["perfectly okay"]
, и цикл продолжаетсяN©
: STACK становится["perfectly okay", 1]
I
: STACK остается["perfectly okay", 1]
потому что нет ввода#
: STACK становится["perfectly okay"]
, и цикл прерывается из-за1
(правдивости)perfectly okay
Смотрите шаги здесь с включенным отладчиком на TIO.
Смотрите этот 05AB1E наконечник шахты (раздел Как использовать словарь? ) , Чтобы понять , почему
„€€Ã€„Ѐ€µ'€Ý
этоthe pointed
,dm one
иbeen
и„ÃеÝ
естьperfectly okay
.Старая 38-байтовая версия:
Попробуйте онлайн . (PS: переключите язык с 05AB1E (устаревший) на 05AB1E для тестовых случаев
0123456789
и@
. Унаследованная версия работает быстрее, но показывает неверные результаты для вводов с ведущими нулями или .)Программа «backhandded» станет:
(Где
q
выходит из программы и делает все остальное без операции.)Попробуйте онлайн.
источник
/
должно быть `\`?N>3*©
вместоXU
сохранения 2. Я также чувствую, что должен быть какой-то способ сделать всю печать в цикле, который бы сэкономил еще больше байтов./
должно быть\
.. И спасибо за -2. У меня действительно есть чувство, что это может быть гольфом дальше. Кажется, слишком долго для базовой функциональности печати каждого третьего значения, включая отскок назад.[ûDN3*©è?®IgD#<ÖNĀ*#
заранее без if-else, что на 2 байта короче цикла if-else с циклом. К сожалению, нам все еще нужна программаq
для backhandded, поэтому она также будет 38 байтов . Но у меня есть ощущение, что разрыв определенно можно как-то улучшить, учитывая входные данные с одним символом, индекс 0 и делимость на длину-1 одновременно ..Python 2 , 130 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 130 байт
Ранняя попытка. Не очень сытно.
Попробуйте онлайн!
Когда код обрабатывается сам по себе, следующие символы изолируются:
который дает:
источник
Желе , 34 байта
Полная программа или монадическая ссылка, принимающая список символов, которые печатаются или выдаются (соответственно).
Попробуйте онлайн! Или посмотрите набор тестов .
Код, разобранный от руки, тогда:
Полная программа или ниладическая ссылка печатаются или выдаются (соответственно) по Тьюрингу .
Как?
тогда код, разобранный слева направо:
источник
Рунические чары , 294 байта
Попробуйте онлайн!
Несжатая (и почти читаемая) версия:
Попробуйте онлайн!
Это ... как можно ближе.
Дальнейшее его сжатие потребовало бы определения способа обработки различных точек перестановки циклов, чтобы они не сталкивались с другими объектами. Первая строка (которая является единственной частью, которую необходимо передать как входные данные для себя) должна оставаться отдельной: вся строка не может поместиться во второй строке, не вызывая проблем (
_
для требуемых пробелов):Это
?
не может быть удалено от того,!
которое само по себе не может быть удалено от\
и ни одно из допустимых сообщений не позволяет ни одному из этих трех символов в этой позиции.Альтернативой может быть использование перенаправления потока, но это приводит к проблеме в нижней строке:
Как мы должны избегать переключателя цикла в основной программе.
Известные вопросы:
abcdefghijklmnopqrstuvwxyz
но не весь собственный источник). И есть предел, независимо от того, сколько происходит слияний. Может обрабатывать до 58 байтов ввода как есть (кроме того, для увеличения количества IP-адресов необходимо выяснить, как заставить их объединяться, не занимая больше места). Можно разместить еще две записи IP на линии возврата петли (справа отU
строки, начинающейся\y<<
в несжатой версии, или одну слева от строки вышеy<<
в сжатой версии), увеличив максимальную длину ввода до 78.1\ \ 1\ \ +\ \ O\ \ @
). Это ограничение синтаксического анализа ввода языка.0
s (например, при преобразовании в число в стеке значение0
теряется). Опять же, ограничение синтаксического анализа ввода языка.Как это устроено
Вступление:
Основной цикл (все, что появляется в стеке, предшествует дублированию):
@
. Верно: прекратить. (Завершить команду выполнено)Вторичный цикл:
источник