Дізнайтеся, чи це дійсна програма Stack Cats у стилі Stack Cats!


16

Фон

Stack Cats - це оборотна езотерична мова, виготовлена ​​Мартіном Ендером. Кожна команда в Stack Cats є або оберненою самою собою (представлена ​​як симетричний символ, наприклад -_:T|), або має свою зворотну команду (представлена ​​як дзеркальне зображення, наприклад () {} [] <>). Stack Cats має чітку синтаксичну вимогу, щоб вся програма мала бути дзеркальним зображенням себе. Зауважте, що це означає, що будь-яка дійсна програма Stack Cats - це природна амбіграма дзеркального зображення .

Ось весь набір команд Stack Cats:

  • Самосиметричний: !*+-:=ITX^_|
  • Симетричні пари: () {} [] <> \/

Будь-які інші символи недійсні; будь-який вхід із символом, який не знаходиться у наборі символів вище, повинен виводити помилку.

Мова має додаткові обмеження, що ()і {}пари повинні бути завжди збалансованими, але для простоти вам не потрібно перевіряти цю умову.

Нижче наведено кілька прикладів дійсної програми Stack Cats (ще раз зауважте, що ви не перевіряєте на збалансованість паролів):

{[+]==[+]}
[)>^<(]
({T)}|{(T})
<(*]{[:!-_:>}<[<)*(>]>{<:_-!:]}[*)>

Це не такі:

b<+>d
())(
({[<++<]})

Виклик

Напишіть програму або функцію, яка визначає, чи вказана рядок є дійсною програмою Stack Cats. У вашому коді також має бути природна амбіграма дзеркального зображення , що означає:

  • Ваш код повинен бути самим дзеркальним зображенням.
    • Ваш код може мати один або більше нових рядків, якщо весь код, відображений природним чином, є самим дзеркальним зображенням.
    • Ви можете опускати або додавати пробіли білого пробілу в кожному рядку, оскільки це не змінює дисплей.
    • Символи вкладок заборонені, оскільки вони мають деяку неоднозначність.

Примітка: ваш код не повинен бути дійсною програмою Stack Cats; він може містити певні зайві символи, які не дозволені в Stack Cats. (Повний список див. Нижче).

Наприклад, наступні дві програми є симетричними (і, отже, дійсним поданням ), тоді як третя не:

({bTd})
[<q|p>]
({bTd})
  IXI
({bTd})
IXI
  • Що стосується "дзеркальної симетрії", то розглядається лише симетрія у стилі Cats Cats (наприклад ({IH}), це неправдиве подання, хоча воно має дзеркальну симетрію).
  • Ваш код може містити лише ці набори символів плюс новий рядок:
    • Самосиметричний: простір ( 0x20) +!"'*+-.8:=AHIMOTUVWXY^_ovwx|
    • Симетричні пари: () /\ <> [] bd pq {}

Набір символів вибирається строго симетричним або самосиметричним, коли відображається як код на SE.

Вхід і вихід

Діапазон введення - це будь -яка однорядкова рядок друкованих символів ASCII .

Ви можете вибрати вхід як рядок, список знаків або список значень ASCII.

Ви можете вибрати вихід:

  • Будь-яке із значень правди / хибності, визначене мовою, яку ви обрали
    • Фактичні значення результатів можуть відрізнятись між вхідними даними (наприклад, вихід 1 для вхідної інформації та 2 для іншого).
    • Поміняти обмінні значення і помилкові значення не дозволяється.
  • Будь-які два постійні значення для true / false відповідно
    • У цьому випадку значення результату повинні бути точно одним із двох постійних значень.

Ви повинні вказати спосіб введення та значення виводу у своєму поданні.

Умова виграшу

Це , тому найнижчі байти в кожній мові виграють.

Примітки

  • Стандартні лазівки заборонені, як зазвичай.
  • Звичайно, ви можете вирішити це в Stack Cats, але шанс полягає в тому, що ви не можете використовувати прапор, що дозволяє зменшити розмір коду вдвічі. І серйозно важку мову підібрати: P

1
Чому різко #заборонено?
tsh

1
@tsh Він трохи перекошений у багатьох шрифтах, включаючи шрифт коду на SE (принаймні, це я бачу в Chrome).
Бубон

@DLosc Я намагався уточнити деякі моменти навколо. Але якщо ви вважаєте, що опис все ще незрозумілий, не соромтесь редагувати.
Пузир

Відповіді:


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протягом(){}[]<>\/ , або сам символ для інших.

Першою проблемою, з якою я зіткнувся тут, було отримання дзеркального знака або помилкового значення на кожній ітерації. Зрештою я придумав таке рішення (x!=A[o]||A)[o^o<88/8], де xвводиться символ Aдзеркального алфавіту і oє поточний індекс. Якщо xце не так, як A[o], це дає true, і вираження індексу оцінюється на undefined; інакше ||Aактивується, і ми закінчуємо отриманняA[o^(o<11)] .

Друга проблема - як припинити рекурсію. Я виявив, що найкращий спосіб зробити це - просто об'єднати результати кожної ітерації, повертаючи порожній рядок, коли Aбуде досягнуто кінця . Це постає перед нами ще двома проблемами: перетворення undefineds в порожні рядки і повернення порожнього рядка в ||щось. Вони можуть бути вирішені зловживанням масивом: [a]+""дає рядкове подання aабо порожній рядок, якщо він aне визначений. Як бонус,[] це truthy, але строфіфікує до порожнього рядка, тому ми можемо зручно використовувати це як "truthy empty string".

Тепер ми можемо використовувати цю 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 коми не допускається в вихідному коді, так як вони не є симетричними (в шрифті коди SE) і не має ніякого дзеркала (в ASCII, у всякому разі)
ETHproductions

вибачте, я пропустив цю частину.
tsh

@tsh я спочатку це теж пропустив, і витратив 20 хвилин на рішення, щоб зрозуміти, що це не може бути дійсним: P
ETHproductions

У будь-якому випадку, оскільки ви вже розмістили рішення JavaScript. Зараз нам не потрібно іншого рішення JSF * k ... // Якби я був ти, я би це виправив, просто скомпілювавши його до JSF * k ...
tsh

1

Стакс , 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.