Узнайте, действительно ли это программа Stack Cats в стиле Stack Cats!


16

Фон

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

1
Почему резко #запрещено?
Чт

1
@tsh Это немного искажено во многих шрифтах, включая кодовый шрифт в SE (по крайней мере, это то, что я вижу в Chrome).
Bubbler

@DLosc Я попытался уточнить некоторые моменты вокруг этого. Но если вы думаете, что описание все еще неясно, пожалуйста, не стесняйтесь редактировать.
Bubbler

Ответы:


16

JavaScript (ES6), 487 467 378 298 292 280 266 264 байта

Сохранено 14 байт благодаря @Bubbler

I=>(V=v=>!I[v]||((T=o=>[[]][+!!A[o]]||[(I[v]!=A[o]||A)[o^o<88/8]]+T(++o))(8-8)==I.pop())*V(++v))(V|(A='(){}[]<>\\/ !*+-:=ITX^_|'))//\\(('|_^XTI=:-+*! \//<>[]{}()'=A)|V)((v++)V*(()qoq.I==(8-8)((o++)T+[[8\88>o^o](A||[o]A=![v]I)]||[[o]A!!+][[]]<=o=T))||[v]I!<=v=V)<=I

Определяет анонимную функцию, которая принимает массив символов и возвращает желаемый результат. Вывод правдивый / ложный; обычно 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 байт
tsh

@tsh запятые не допускается в исходном коде, так как они не являются симметричными (в шрифте коды SE) и не имеет никакого зеркала (в ASCII, во всяком случае)
ETHproductions

извини, я пропустил эту часть.
ч. В

@tsh Сначала я тоже его пропустил и потратил 20 минут на решение, только чтобы понять, что оно не может быть действительным: P
ETHproductions

Во всяком случае, так как вы уже опубликовали решение JavaScript. Нам не нужно другое решение JSF * k сейчас ... // На вашем месте я бы исправил это, просто скомпилировав его в JSF * k ...
tsh

1

Stax , 76 70 байт

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq*!-W:"|_^XTI=:-+*!\>])}"_=_HM^^xW:

Запустите и отладьте его

Stax является другом Stack Cats и имеет внутренние компоненты для создания второй половины программы Stack Cats с первой половины. Если мы не заботимся об ограничении источника и не должны проверять кодировку, вот 4-байтовое решение:

4 байта

:R_=

Запустите и отладьте его

объяснение

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq...
:W                                         "Mirror" the string
                                           Equivalent to appending the reverse of the string to itself
                                           And map `{([</\>])}` to its mirror in the appended string
  x^^                                      2, but we can't just use `2` here ...
     MH                                    Partition the "mirror"ed string to two parts, take the later part.
       _=                                  The string is the same as the original one (*)
                                           `:Wx^^MH_=` is just `:R_=`, but we can't use `R` here ...
         _                                 Input string
          "{([</!*+-:=ITX^_|":W-           Remove valid characters from input
                                !          The final string is empty (**)
                                 *         (*) and (**)
                                  p        Pop and print result
                                   q       Peek stack and print
                                           Since the stack is now empty, this causes the program to terminate
                                    ...    Not executed

Существование Rи Wдействительно интересно. Завершение программы pqкомбинацией также впечатляет меня.
Bubbler

Спасибо. Инструкции на самом деле два байта: :Rи :W. Я чувствую, что не могу не сказать всем, что в Stax есть внутренние органы, которые делают это.
Вейцзюнь Чжоу,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.