Форма является хиральной, если никакое вращение не может сделать ее похожей на зеркальное отражение. В этой головоломке мы будем писать киральные компьютерные программы.
Для этой головоломки мы будем думать о программе как о прямоугольной матрице символов. Таким образом, все решения этой задачи должны быть прямоугольными (то есть все линии должны быть одинаковой длины). Мы можем вращать эти программы с шагом в четверть оборота. Например, программа
The quickish fish
lept deftly
rightwards
При повороте на четверть оборота по часовой стрелке выглядит
T
h
r e
i
glq
heu
tpi
wtc
a k
rdi
des
sfh
t
lf
yi
s
h
Мы также можем отразить эти программы. Вот та же программа, отраженная по вертикальной оси:
hsif hsikciuq ehT
yltfed tpel
sdrawthgir
Киральная программа - это программа, которая при вращении любое количество раз всегда будет выводить " left
". Однако при отражении создается программа, которая выдает « right
» независимо от того, сколько раз она поворачивается.
Ваша задача - написать киральную программу с минимальным количеством байтов.
Дополнительные правила
Выходные данные не чувствительны к регистру, но должны быть согласованы. (например, вы можете вывести "
LEFT
" и "rIgHt
", но этот корпус должен быть согласован при поворотах)Строки должны быть разделены либо на новую строку, либо на новую строку и перевод строки.
Ваша программа должна быть прямоугольником, вы можете заполнить ее пробелами или комментариями, но каждая строка должна иметь одинаковую длину.
При желании вы можете использовать завершающий символ новой строки (или символ новой строки и перевода строки) во всех своих программах.
источник
:set virtualedit=all
режимом Vim . НачальныйBool
вывод проверяет, равен ли вход собственному вращению, что упрощает вещи. Удаление{-
заставляет печатать отраженный ввод.Ответы:
Паскаль (FPC) ,
2161755349 байтПопробуй налево
Попробуйте прямо
@tsh побудил меня попробовать еще раз, когда я увидел его программу (в комментарии), и вот она!
Предыдущий с 755 байтами:
Попробуй налево
Попробуйте прямо
Если вы видели мое предыдущее представление, просто забудьте об этом :)
Все повороты для левой и правой программ одинаковы.
источник
Кляйн (000) ,
10987 байтПопробуйте онлайн!
Должна быть возможность получить более короткую версию этого ответа, так что удачи!
Этот ответ вдохновлен спиралями. В частности, идея заключается в двух взаимосвязанных спиралях, одна для левой и одна для правой. Он имеет двойную симметрию, поэтому мы можем проверить следующие программы, чтобы убедиться, что он работает:
Четверть оборота
Попробуйте онлайн!
Зеркальный
Попробуйте онлайн!
Зеркальный и четверть оборота
Попробуйте онлайн!
источник
Кляйн (000) ,
2725 байтовПопробуйте онлайн! Вращается один раз! Вращается дважды! Вращается три раза!
И перевернул: Попробуйте онлайн! Вращается один раз! Вращается дважды! Вращается трижды!
Единственный, кто доставил мне немного хлопот, был один раз перевернут и повернут, что выглядит примерно так:
Это единственная причина для двух наборов
((
.источник
Кляйн (211) , 37 байт
Это имеет разные программы для каждого вращения.
объяснение
Обратите внимание, что каждая из этих программ перед выполнением дополняется квадратом без операций
Без изменений
Попробуйте онлайн!
!
делает выполнение перепрыгивает через\
и"left"@
загружает строку"left"
в стек и завершает программу печати стекаЧетверть оборота
Попробуйте онлайн!
Выполнение выполняется в верхнем правом углу квадрата, продолжается в нижнем левом углу и снова
!\"left"@
печатается"left
.Пол оборота
Попробуйте онлайн!
Здесь путь казни выходит с северной стороны, возвращается через западную сторону, снова выходит с востока, прежде чем войти на юг.
\
отскакивает путь,"left"@
чтобы напечатать его.Три четверти оборота
Попробуйте онлайн
Выполнение завершается из правого верхнего угла, а затем снова входит в нижний левый. Еще раз зеркала
/\
перенаправляют путь,"left"@
чтобы напечатать это.отражение
Это в основном так же, как и для левого поворота во всех поворотах.
источник
JavaScript (Node.js) ,
1481599505461341305271 байтЗеркальный
Попробуйте онлайн!
(Пожалуйста, смотрите TIO Link для всех тестовых случаев, включая зеркальную версию)
Хотя в дальнейшем игра в гольф, размер
22x22 -> 21x21
в кредит @JoKing!Размер
38x3824x2422x2221x2118x1817x1716x16, 4-кратные симметрии.Возникает вопрос - можно ли иметь размер 15х15 или меньше для JS? Кажется, что мне нужно, по крайней мере, разделитель комментариев между двумя подблоками и по краю, так что, по крайней мере, 7 + 2 + 2 + 5 = 16 строк?
источник
Холст ,
1098971 байтПопробуй это здесь | Попробуйте наоборот!Это единственные две возможные программы, так как программа является вращательно-симметричной.
Сделано в этом .
источник
Gol> <> , 23 байта
Попробуйте онлайн!
Это тот же формат, что и мой ответ Кляйна , но на 2 байта короче. Может быть, есть еще один 2D-язык, который может сыграть в гольф последние 2 байта ... Но пока это так коротко, как только может.
источник
Алиса , 25 байт
Влево: нормальный , 1/4 оборота по часовой стрелке , 1/2 оборота , 1/4 оборота против часовой стрелки
Справа: отражение по горизонтальной оси , диагональ вниз-вправо , вертикальная ось , диагональ вверх-вправо
объяснение
Эта программа состоит из трех частей. Первая часть - три
{
с и одна}
по углам.{
Очередь IP - влево , пока он не достигнет}
, в какой момент он поворачивает направо. В отраженной версии IP идет вдоль верхнего ряда в исходной программе. В исходной версии поворот вправо сразу же поразит соседний{
, указывая IP вдоль нижнего ряда в исходной программе.Далее идут две косые черты во втором столбце. Если программа ориентирована горизонтально, любой тип слеша просто переходит в порядковый режим, отправляя IP в том же левом / правом направлении, в котором он уже был. Если программа ориентирована по вертикали, IP-адрес отскакивает немного больше, но создание их обоих слэшей дает одинаковый конечный результат. (Два обратных слеша дадут противоположный результат, и один из них создаст бесконечный цикл.)
Остальная часть программы проста. IP в порядковом режиме отскоков по диагонали, так что либо
"left"o@
или"right"o@
будет работать в зависимости от того, как был введен этот раздел.источник
Hexagony , 98 байт
Попробуйте онлайн! | Повернут на 90 ° | Повернут на 180 ° | Повернуто на 270 °
Реверс | Повернуто на 90 ° и перевернуто |Повернуто на 180 ° и перевернуто | Повернут на 270 ° и повернут
Гексагония была забавной для этого вызова, потому что ротация или разворот могут радикально изменить реальную программу. Каждое вращение / обращение - это своя уникальная программа. Некоторые пути выполнения программы намного интереснее других.
Я признаю, что придумывание этого заняло больше времени, чем, вероятно, следовало бы. Я почти уверен, что в Гексагонии можно сделать более короткий ответ, так что удачи!
источник
Рубин , 131 байт
Попробуйте онлайн!
источник
APL (Дзайма / APL) , 181 байт
Программа имеет вращательную симметрию, поэтому необходимо проверить только два случая
Оставил
Попробуйте онлайн!
Правильно
Попробуйте онлайн!
объяснение
Это моя первая программа APL, поэтому она довольно проста. Он использует только один трюк, который я считаю интересным.
Если мы начнем с удаления всех комментариев, мы получим следующие программы
Оставил
Правильно
Начиная с левой программы, мы делаем три вещи.
Присвоить
'lef'
переменнойt
Распечатать переменную
t
и письмо't'
Присвоить
'righ'
переменнойt
Теперь, потому что это зеркало, правильная программа делает эти три шага, но в обратном порядке. Это означает, что мы печатаем
'left'
для левой программы и'right'
для правой программы.Единственная хитрость заключается в том, что на
't'
самом деле происходит из повернутой копии кода. Если вы посмотрите на третий столбец нашего кода, вы увидите, что это так't'
. Мы повторно используем это't'
в повернутых версиях, чтобы добавить то,t
что нужно.источник
Haskell ,
461379 байтЭрджан Йохансен спас 82 байта
Попробуйте онлайн!
Так как этот имеет 4-х кратную симметрию, вам нужно только проверить зеркало:
Попробуйте онлайн!
Это начало. Это далеко от идеала, но здесь происходит несколько интересных вещей. Haskell, безусловно, интересный язык для этой задачи. Я с нетерпением жду ответа, который превосходит это, будь то мой или чей-то еще.
источник
Пролог (SWI) ,
649188 байтРазбитый, Не повернутый
Попробуйте онлайн!
Развернутый, повернутый
Попробуйте онлайн!
Перевернутый, Не повернутый
Попробуйте онлайн!
Перевернутый, повернутый
Попробуйте онлайн!
источник
Пролог (SWI) ,
239223209181 байтПопробуйте онлайн!
Поскольку программа имеет 4-кратную симметрию, вам нужно только проверить зеркало:
Попробуйте онлайн!
источник
Python 2 , 209 байт (14 х 14)
Нормальный (слева):
Попробуйте онлайн!
Отражение (справа):
Попробуйте онлайн!
источник
Чисто ,
13311055 байт-276 байт благодаря Орджану Йохансену
Попробуйте "левый" онлайн!
Попробуйте "правильно" онлайн!
Это было сложно по многим причинам:
module <filename>
в начале и только в начале файла. К сожалению, это означает, что для правильного поворота зеркальной программы она также должна отображаться внизу файла. Чтобы сделать это хуже,module ..
является недействительным для глобальных,let .. in
,where ..
иwith ..
определений; и токен,module
если он не был определен, вызывает ошибку./* /* */
оставляет один уровень комментария открытым, как и/* // */
(так же, как и комментирование остальной части строки).К счастью, мы можем определить
module
что-то в#..
выражении (пусть до), и это все, что нам нужно. Поскольку Clean не проверяет альтернативы, которые никогда не используются (и множество других одинаково неиспользуемых вещей), необходимое второе определениеStart
может быть полным мусором. Это позволяет использовать второйStart
потреблять заголовок модуля в нижней части файла , так как чистые лакомства ,m module m
как вызов функцииm
наmodule
иm
(что , так как мы определилиmodule
иm
, не вызывает ошибку). Неважно, чтоm
это строка, а не функция, потому чтоStart
альтернатива никогда не проверяется на тип.Это легче увидеть, если вы посмотрите на это глазами компилятора:
источник
m
иs
.Брахилог , 341 байт
Попробуйте онлайн!
! Enilno TY YRT
Воспользуется тем, что Brachylog использует основной предикат в качестве первого в первой строке и не слишком заботится о других строках, не требуя их компиляции. Не отраженный, он печатает пустую строку, за которой следует «left» в той же строке, и при отражении печатает пустую строку, за которой следует «right» в той же строке. Я испытываю желание подумать, что может быть способ сделать (полезную) неквадратную версию
ṇ
, но это может быть довольно сложно, не пытаясь заставить ее работать по-другому в рефлексии.источник
Рубин , 181 байт
Попробуйте онлайн!
Это порт Питона, ответ Куртиса Бектела на Ruby, немного больше в гольфе.
На самом деле, его программа на Python является полиглотом и работает также на Ruby, поэтому мой первый ответ был копией, но это казалось несправедливым. Поэтому я написал скрипт, который генерирует новый ответ, начиная с базового скрипта. Вы можете попробовать это здесь:
Построй свой собственный
источник
Batch,
438321 байтПояснение: А
:
используются для указания метки, которая так хорошо , как комментарий, так как программа имеет осевую симметрию единственное различие между этими двумя версиями есть какая из@
линий первый, в этом случае либоleft
илиright
выводятся перед сценарием выходы.Я действительно пытался творчески перекрывать повернутые линии друг с другом, но моя попытка фактически закончилась с большей сеткой.
Редактировать: Сохранено 117 байтов благодаря @ ØrjanJohansen.
источник
&rem
на&:
.test.bat
в командной строке Win10.CMD.EXE
или что-то в этом роде.05AB1E (наследие) ,
8955 байтовОчень простой подход. Выходы в полном нижнем регистре.
Попробуйте онлайн или попробуйте онлайн с отражением (каждый оборот одинаков).
Объяснение:
Перевернутый:
Посмотрите эту подсказку 05AB1E (раздел Как пользоваться словарем? ), Чтобы понять, почему
'…¸
есть"left"
и'ƒ©
есть"right"
.источник
q
?(legacy)
версию 05AB1E.Stax , 131 байт
Запустите и отладьте его
Это «правильный» вариант.
источник
Рунические чары , 116 байт
Попробуйте онлайн!
И поменял местами
Не совсем порт, но использовал ответ Post Left Garf Hunter's Klein 000 в качестве отправной точки, учитывая типичную почти совместимость двух языков (большинство команд одинаковы, а обтекание краев в Runic идентично Klein 000). Единственная проблема заключалась в том, что IP-адреса Кляйна всегда начинаются сверху слева, а рунические - нет. Таким образом
.
, все они являются частью исходного кода и по-прежнему рассматриваются как NOP Runic, в то время каккак NOP, которые я должен был добавить как часть управления потоком.
Печать
"left"
во всех 4 поворотах и в"right"
зеркальном отображении (и во всех четырех поворотах). Две средние колонки были полностью не использованы после моих модификаций, поэтому я смог их удалить.В теории вращение с большим количеством пробелов может использоваться для меньшего количества байтов (например, этот вариант ), однако пробелы необходимы для правильного вращения структуры с использованием внешних инструментов, и поэтому я включил их.
Варианты ниже содержат неиспользованные куски, которые были удалены, но в остальном идентичны:
Все четыре левых . Выходы
leftleftleftleft
(тот факт, что все четыре можно запустить таким образом, является совпадением).Справа 1 , справа 2 , справа 3 , справа 4
источник
Gol> <> , 342 байта
Вау! Это заняло больше времени, чем я ожидал, на полпути я понял, что отражение было вертикально , а не горизонтально, как я кодировал! Я уверен, что это работает, но если я допустил ошибку, пожалуйста, дайте мне знать. Скорее всего, это может быть игра в гольф на смешную сумму больше, я просто использовал метод грубой силы. Сама фигура на самом деле является квадратом, она технически симметрична, за исключением поперечной оси X, поэтому, когда она переворачивается, вместо нее возвращается «ВПРАВО» !!!
Символ, который сделал эту программу возможной, - «А», которая позволяет телепортироваться в начало определенной строки!
Попробуйте онлайн!
источник