Фон
Stack Cats - это обратимый эзотерический язык, созданный Мартином Эндером. Каждая команда в Stack Cats является либо обратной к себе (представленной в виде симметричного символа, например -_:T|
), либо имеет свою обратную команду (представленную в виде зеркального отображения, например ()
{}
[]
<>
). Stack Cats имеет строгое синтаксическое требование, чтобы вся программа была зеркальным отражением самой себя. Обратите внимание, что это означает, что любая действующая программа Stack Cats является естественной амбиграммой зеркального отображения .
Вот весь набор команд Stack Cats:
- Self-симметрична:
!*+-:=ITX^_|
- Симметричные пары:
()
{}
[]
<>
\/
Любые другие символы недопустимы; любой ввод, имеющий символ, не входящий в набор символов, должен выводить false.
Язык имеет дополнительное ограничение , что ()
и {}
пары должны быть всегда сбалансированы, но для простоты, вы не должны проверить для этого условия.
Ниже приведены некоторые примеры правильной программы Stack Cats (опять же, обратите внимание, что вы не проверяете наличие сбалансированных паренов):
{[+]==[+]}
[)>^<(]
({T)}|{(T})
<(*]{[:!-_:>}<[<)*(>]>{<:_-!:]}[*)>
Это не:
b<+>d
())(
({[<++<]})
Вызов
Напишите программу или функцию, которая определяет, является ли данная строка допустимой программой Stack Cats. Ваш код также должен быть естественной амбиграммой зеркального отображения , что означает:
- Ваш код должен быть зеркальным отражением самого себя.
- В вашем коде может быть одна или несколько новых строк, если весь код, отображаемый естественным образом, является зеркальным отражением самого себя.
- Вы можете опустить или добавить конечные пробелы в каждой строке, так как это не меняет отображение.
- Символы табуляции не допускаются, так как они имеют некоторую неопределенность на дисплее.
Примечание: ваш код не обязательно должен быть действующей программой Stack Cats; он может содержать определенные дополнительные символы, которые не разрешены в Stack Cats. (См. Полный список ниже.)
Например, следующие две программы являются симметричными (и, следовательно, допустимым представлением ), а третья - нет:
({bTd})
[<q|p>]
({bTd})
IXI
({bTd})
IXI
- Что касается "зеркальной симметрии", рассматривается только симметрия в стиле стека Cats (например,
({IH})
это недопустимое представление, даже если оно имеет зеркальную симметрию). - Ваш код может содержать только эти наборы символов плюс символ новой строки:
- Самосимметричный: пробел (
0x20
) +!"'*+-.8:=AHIMOTUVWXY^_ovwx|
- Симметричные пары:
()
/\
<>
[]
bd
pq
{}
- Самосимметричный: пробел (
Набор символов выбран строго симметричным или самосимметричным при отображении в виде кода на SE.
Вход и выход
Диапазон ввода - любая однострочная строка печатных символов ASCII .
Вы можете принять входные данные в виде строки, списка символов или списка значений ASCII.
Вы можете выбрать для вывода либо:
- Любая из истинных / ложных ценностей, определенных языком по вашему выбору
- Фактические значения результата могут отличаться между входами (например, выход 1 для достоверного входа и 2 для другого достоверного).
- Обмен правдивыми и ложными значениями не допускается.
- Любые два постоянных значения для true / false соответственно
- В этом случае результирующие значения должны быть точно одним из двух постоянных значений.
Вы должны указать свой метод ввода и выходные значения в вашем представлении.
Условие победы
Это код-гольф , поэтому побеждают младшие байты на каждом языке.
Примечания
- Стандартные лазейки , как обычно, запрещены.
- Конечно, вы можете решить эту проблему в Stack Cats, но есть вероятность, что вы не можете использовать флаг, который позволяет уменьшить размер вашего кода наполовину. И это серьезно сложно подобрать язык: P
источник
#
запрещено?Ответы:
JavaScript (ES6),
487467378298292280266264 байтаСохранено 14 байт благодаря @Bubbler
Определяет анонимную функцию, которая принимает массив символов и возвращает желаемый результат. Вывод правдивый / ложный; обычно
1
/0
, но пустая строка даетtrue
.Как?
Наиболее очевидный трюк - использовать его
//\\
в качестве центральной точки для комментирования зеркальной версии кода. После этого это становится игрой для определения кратчайшего пути решения проблемы с использованием только данной кодировки.Первая проблема, с которой мы сталкиваемся - это отсутствие ключевых слов и встроенных модулей. Мы чудесным образом все еще имеем
.pop()
, но все остальное придется делать через разрешенные операторы (включаяa[b]
иf(c)
) с рекурсией для эмуляции циклов.Вторая проблема - отсутствие логических операторов. Ни
&
и?
не допускается, что означает , что только оператор принятия решений , мы можем использовать это||
. Поэтому мы должны тщательно структурировать нашу логику, чтобы учесть это.Первым делом я определил функцию,
T
которая отражает индивидуальный характер. Основная идея - циклически проходить по каждому символу в строке зеркально отображаемых символов, проверяя каждый из них на равенство с данным символом. Если оно равно, мы возвращаем его зеркало - символindex^1
для for(){}[]<>\/
или сам символ для остальных.Первой проблемой, с которой я столкнулся, было получение либо зеркального символа, либо ложного значения на каждой итерации. Решение, которое я в итоге придумал, заключалось в том
(x!=A[o]||A)[o^o<88/8]
, гдеx
вводимый символ,A
зеркальный алфавит иo
текущий индекс. Еслиx
это не то же самоеA[o]
, это даетtrue
, и выражение индекса оценивается какundefined
; в противном случае||A
активируется, и в итоге мы получаемA[o^(o<11)]
.Вторая проблема - как прекратить рекурсию. Я обнаружил, что лучший способ сделать это - просто объединить результаты каждой итерации, возвращая пустую строку, когда
A
достигнут конец . Это ставитundefined
перед нами две дополнительные проблемы: преобразование s в пустые строки и возвращение пустой строки||
что-то. Это может быть решено с использованием массива:[a]+""
дает строковое представлениеa
или пустую строку, еслиa
она не определена. В качестве бонуса[]
это правда, но переносится в пустую строку, поэтому мы можем удобно использовать это как «истинно пустую строку».Теперь мы можем использовать
T
функцию для отражения любого отдельного символа. Мы делаем это рекурсивно, сравнивая зеркало сI[v++]
до,I.pop()
пока не будет достигнут конец массива символов. Мы не можем использовать&&
или,&
чтобы проверить, все ли сравнения верны, но используйте*
вместо этого. Умножение всех этих результатов вместе дает,1
если каждый символ является зеркалом противоположного, или0
если любое сравнение не удается.И именно так работает этот ответ. Я, вероятно, не очень четко объяснил, поэтому, пожалуйста, задавайте любые вопросы, которые у вас могут возникнуть, и укажите на любые ошибки, которые я допустил.
источник
U=([A,...H])=>!(V=H.pop())||!(W=([x,...X]=(T="!*+-:=ITX^_|")+"(){}[]<>\\/",[o,...O]=T+")(}{][></\\")=>!x||((o!=A)+(x!=V))*(W(X,O)))()*U(H)//...
280 байтStax ,
7670 байтЗапустите и отладьте его
Stax является другом Stack Cats и имеет внутренние компоненты для создания второй половины программы Stack Cats с первой половины. Если мы не заботимся об ограничении источника и не должны проверять кодировку, вот 4-байтовое решение:
4 байта
Запустите и отладьте его
объяснение
источник
R
иW
действительно интересно. Завершение программыpq
комбинацией также впечатляет меня.:R
и:W
. Я чувствую, что не могу не сказать всем, что в Stax есть внутренние органы, которые делают это.