Це гірське?


29

Виклик

Для цього завдання гірська струна - це така, яка відповідає правилам граматики, M: x(Mx)*де при кожному виробництві всі х є однаковими символами. Під час відступу гірська струна може виглядати приблизно так:

A
 B
  C
   D
  C
   E
    F
   E
  C
 B
A

Як бачите, це трохи схоже на гору збоку.

Формальне визначення

  • Будь-який єдиний персонаж aгірський.
  • Якщо Sгірська струна і aє характером, то aSaгірська, де супозиція являє собою конкатенацію рядків.
  • Якщо aSaі aTaє гірськими струнами, то aSaTaце гірська струна. Зауважте, що це правило означає, що ця схема дотримується будь-якої кількості повторень. (Тобто aSaTaUa, aSaTaUaVa, aSaTaUaVaWa... все гори.)

Приклади

Усі паліндроми непарної довжини гірські, наприклад:

t
 a
  c
   o
  c
 a
t

qwertytrasdfdgdsarewqjklkjq є менш тривіальним прикладом:

q
 w
  e
   r
    t
     y
    t
   r
    a
     s
      d
       f
      d
       g
      d
     s
    a
   r
  e
 w
q
 j
  k
   l
  k
 j
q

Приклади виходів

a                           ==> true
aaa                         ==> true
mom                         ==> true
tacocat                     ==> true
qwertytrasdfdgdsarewqjklkjq ==> true
wasitacaroraratisaw         ==> true
abcbcbcbcba                 ==> true
aaaaabcbbba                 ==> true

<empty string>              ==> false
aa                          ==> false
pie                         ==> false
toohottohoot                ==> false
asdfdghgfdsa                ==> false
myhovercraftisfullofeels    ==> false

Правила

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

4
Тестовий випадок, подібний до цього, aaaбуло б добре, коли одного і того ж персонажа потрібно використовувати на декількох рівнях.
Мартін Ендер

Ви впевнені в цьому wasitacaroraratisaw? Мені це здається
гірським

wasitacaroraratisawдійсно гірський АФАЙКТ
ETHproductions

Так воно і є. Я думаю, я просто намагався знайти «майже паліндром», але випадково знайшов гірську струну.
Beefster

2
Я думав, що це буде легко вирішити, розділивши рядок на його першому символі, але такі випадки, як aaaце, не спрацьовують.
xnor

Відповіді:




6

Perl, 22 байти

Включає +дляp

perl -pe '$_=/^((.)((?1)\2)*)$/' <<< abcbcbcbcba

Друкує 1 за справжнє, нічого для неправдивого




3

Пролог (SWI) , 29 байт

a-->[X],+X.
+X-->[];a,[X],+X.

Спробуйте в Інтернеті!

Ця програма визначає правило DCG, a//0яке відповідає будь-якій рядку (списку символів), що є гірською.

Пояснення

Для цієї програми я використовую дещо інше, але еквівалентне визначення гірських рядків, ніж те, що описано в виклику: Гірський рядок - це символ, cза яким слідує число (може бути нуль) гірських рядків з cнакресленими на їх кінцях. У більш стислих позначеннях, отриманих від регулярних виразів , гірська рядок повинна відповідати шаблону, c(Mc)*де Mє гірська струна, і *означає, що вираз у дужках повторюється нульовим або більше разів. Зауважте, що хоча кожен cповинен бути однаковим символом, кожен Mне повинен бути однаковою гірською струною.

Доказ рівнозначності

Зрозуміло, що правила 1 і 2 з виклику еквівалентні моєму правилу, коли Mcвідбувається нуль і один раз відповідно.

У тому випадку, коли гірська рядок має Mcвідбувається nраз , де n > 1то рядок може бути переписано в вигляді , cMcScде Sце останній n - 1раз , що Mcвідбувається за винятком останнього c(зауважимо , що Mце будь-яка гірська рядок і не обов'язково збігається з іншого M). Оскільки Mгірська струна, за правилом 2, cMcповинна бути гірською струною. Або Sце гірська рядок в цьому випадку cScє гірською рядком або Sможна переписати в вигляді , cMcTcде Tце останній n - 2раз , що Mcвідбувається за винятком останнього c. Цей рядок міркувань може продовжувати застосовуватися до тих пір, поки рядок, який не гарантовано є гірським, міститьMcколись це означало б, що воно повинно бути і гірським. Таким чином, оскільки cMcгірський, а якщо cMcі cM'cгірський, то cMcM'cповинен бути гірським, вся нитка повинна бути гірською.

З іншого боку, для струни, cScTcде cScі cTcє гірською, це або cScгірська струна за правилом 2, або за правилом 3. Якщо це гірська струна за правилом 2, то вона Sтакож повинна бути гірською струною. Якщо це гірська струна за правилом 3, то вона cScповинна мати форму, cUcVcде cUcі cVcє гірські струни. Оскільки довше cUcі cVcмає бути принаймні два символи коротше, ніж cScправило 3, потрібно застосувати щонайменше 5 символів, то після кінцевої кількості застосувань правила 3 ​​кожна строка між cs, вибраними додатками правила 3, повинна бути гірською рядок. Цей же рядок міркувань може бути застосований доcTc таким чином, струна є гірською за моїм визначенням.

Оскільки будь-яка рядок, що відповідає моєму визначенню, є гірською, і моє визначення відповідає всім гірським рядкам, вона еквівалентна тій, що наведена у питанні.

Пояснення Кодексу

Загалом a//0правило DCG, визначене в першому рядку, відповідає будь-якій гірській рядку. +//1Правило DCG (як предикати, правила DCG можуть дати імена операторів ), певне на другу лінії, відповідає будь-якому рядку , яка складається з послідовності нуля або більше гористих рядків з характером , переданим в якості її аргументів Xпришитих решт їх . Або запозичувати-як регулярні вирази позначення , які я використовував вище, a//0сірники , c(Mc)*але аутсорсинг роботи фактично відповідає силі (Mc)*в +//1який приймає в cякості аргументу X.

Рядок за рядком коди поводяться так:

a-->[X],+X.

Цей рядок визначає правило DCG a. В [X]свідчить , що перший символ повинен бути рівний в даний час невизначеною змінною X. Це призводить до Xтого, що він буде рівний першому символу. +XТе стверджує , що решта рядки повинні відповідати правилу DCG +//1з символом , який Xвстановлюється в якості аргументу.

+X-->[];a,[X],+X.

Цей рядок визначає +//1правило DCG. ;Являє собою або в Пролозі , який означає , що рядок може відповідати або []або a,[X],+X. []Являє собою порожній рядок , так +//1завжди здатний узгодити порожній рядок. Якщо рядок не порожній, то початок повинен відповідати, a//0і таким чином повинен бути гірський рядок. Після цього слід дотримуватися будь-якого символу X. Нарешті, решта рядка повинна відповідати +X.


2

Лушпиння , 15 байт

εωφΓ§?t·:⁰`(=←t

Спробуйте в Інтернеті! Вибір типу займає близько 40 секунд, тому будьте терплячі.

Пояснення

εωφΓ§?t·:⁰`(=←t  Implicit input, say s = "abacdca"
 ω               Apply until fixed point is reached
  φ              this self-referential anonymous function (accessed with ⁰):
                  Argument is a string x.
   Γ              Deconstruct x into head h and tail t.
    §?t·:⁰`(=←t   Call this function on h and t. It is interpreted as §(?t)(·:⁰)(`(=←t)).
                  § feeds h to (·:⁰) and (`(=←t)), and calls (?t) on the results.
                  The semantics of ? cause t to be fed to all three functions.
          `(=←t   First, check whether h equals the first element (←) of the tail of t.
     ?t           If it does (e.g. if h='a' and t="bacdca"), return tail of t ("acdca").
                  Otherwise (e.g. if h='b' and t="acdca"),
       · ⁰        call the anonymous function recursively on t: "aca"
        :         and prepend h to the result: "baca".
                 Final result is "a".
ε                Is it a 1-element string? Implicitly print 0 or 1.

Ідея полягає в тому, щоб неодноразово замінювати підрядку форми abaна, aпоки це більше не стане можливим. Вхід є гірським, якщо і лише в тому випадку, якщо це призводить до односимвольного рядка (що таке εтести). Єдина небезпечна ситуація, коли у нас є така струна, де abaце, здається, не є піком:

a
 b
  a
   c
  a
   d
  a
 b
a

На щастя, ми завжди можемо перетворити його на одне:

a
 b
a
 c
a
 d
a
 b
a

Я вважаю, що повернення одного символу для trueсправ інакше було б "послідовним".
Джонатан Аллан

Насправді це може підштовхувати це, оскільки немає чіткої межі між цим і не-оп ("повертає гірську струну, коли гірська, а не інакше"), яка, очевидно, буде лазівкою.
Джонатан Аллан

@JonathanAllan Одиничні символи та інші рядки здаються мені занадто нечіткими, тим більше, що він має мало відношення до правдивості (лише порожня рядок є хибною у лушпинні).
Згарб

Так, "будь-яке представництво" явно занадто ліберальне - я прокоментував свою роботу в ОП :)
Джонатан Аллан

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.