Czy to górzyste?


29

Wyzwanie

W przypadku tego wyzwania górzysty sznurek jest zgodny z regułą gramatyczną, w M: x(Mx)*której przy każdej produkcji wszystkie x mają ten sam charakter. Po wcięciu górski ciąg może wyglądać mniej więcej tak:

A
 B
  C
   D
  C
   E
    F
   E
  C
 B
A

Jak widać, z boku wygląda trochę jak góra.

Definicja formalna

  • Każda pojedyncza postać ajest górzysta.
  • Jeśli Sjest górzystym ciągiem i ajest postacią, to aSajest górzysty, gdzie zestawienie reprezentuje konkatenację struny.
  • Jeśli aSai aTasą strunami górzystymi, to aSaTajest to struna górzysta. Zauważ, że ta reguła oznacza, że ​​ten wzór obowiązuje dla dowolnej liczby powtórzeń. (czyli aSaTaUa, aSaTaUaVa, aSaTaUaVaWa... są górzyste).

Przykłady

Wszystkie palindromy o nieparzystej długości są górzyste, na przykład:

t
 a
  c
   o
  c
 a
t

qwertytrasdfdgdsarewqjklkjq jest mniej trywialnym przykładem:

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

Przykładowe wyniki

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

Zasady

  • Jest to problem decyzyjny, więc każda reprezentacja prawdy lub fałszu jest prawidłowym wyjściem, o ile jest poprawna, spójna, jednoznaczna, a program kończy się w określonym czasie. Pamiętaj, aby podać konwencję wyjściową ze swoim rozwiązaniem.
    • Ustalenie, czy dane wyjściowe wskazują prawda, czy fałsz, nie musi być trywialne, bez konieczności znajomości łańcucha wejściowego. Zauważ, że nie oznacza to, że dane wyjściowe zgodne z prawdą lub fałszem muszą być stałe, jednak konwencja „drukuj górzysty sznurek, jeśli sznur jest górzysty, a nie-górzysty sznur, jeśli nie jest górzysty”, jest z oczywistych powodów zabroniona.
    • Z drugiej strony, konwencja typu „zgłasza wyjątek dla fałszu i kończy cicho dla prawdy”, a także „drukuje pojedynczy znak dla prawdy, a wszystko inne dla fałszu”
  • To jest golf golfowy, więc wygrywa najkrótszy program.
  • Standardowe luki są zabronione.

4
Przypadek testowy taki aaabyłby dobry, w którym ta sama postać musi być używana na wielu poziomach.
Martin Ender

Jesteś tego pewien wasitacaroraratisaw? Wydaje mi się, że jest górą
Ton Hospel

wasitacaroraratisawjest rzeczywiście górzysty AFAICT
ETHproductions

Tak jest. Chyba właśnie próbowałem znaleźć „prawie palindrom”, ale przez przypadek znalazłem górzystą strunę.
Beefster

2
Pomyślałem, że to będzie łatwe do rozwiązania, dzieląc ciąg na pierwszy znak, ale przypadki takie aaasprawiają, że to nie działa.
xnor

Odpowiedzi:




6

Perl, 22 bajty

Obejmuje +dlap

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

Drukuje 1 za prawdę, nic za fałsz


5

Brain-Flak , 78 bajtów

({()<<>(([{}]({}))([{}]({}))<>[({}<>)])>{[()()]((<()>))}<{}{}{}<>>}(())){{}}{}

Wypróbuj online!

Drukuje 1 dla prawdy, nic dla fałszu.

Aby zweryfikować słowo górzyste, wystarczy założyć, że słowo „schodzi” z góry, gdy tylko jest to możliwe.



3

Prolog (SWI) , 29 bajtów

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

Wypróbuj online!

Ten program definiuje regułę DCG, a//0która pasuje do dowolnego łańcucha (listy znaków), który jest łańcuchem górzystym.

Wyjaśnienie

W tym programie używam nieco innej, ale równoważnej definicji łańcuchów górskich niż ta opisana w wyzwaniu: Górzysty łańcuch znaków jest postacią, cpo której następuje liczba (może być zero) łańcuchów górskich cprzyczepiona do ich końców. W bardziej zwięzłej notacji pochodnej wyrażenia regularnego, łańcuch górski musi pasować do wzoru, w c(Mc)*którym Młańcuch górski, i *oznacza, że ​​wyrażenie w nawiasach jest powtarzane zero lub więcej razy. Zauważ, że chociaż każdy cmusi być tego samego znaku, Mnie musi to być ten sam górzysty sznurek.

Dowód równoważności

Oczywiste jest, że reguły 1 i 2 z wyzwania są równoważne z moją zasadą, w której Mcwystępuje odpowiednio zero i jeden raz.

W przypadku, gdy górzysty sznurek Mcwystępował w nczasach, w których n > 1sznurek można przepisać, tak jak cMcScgdzie Ssą te ostatnie n - 1czasy, z Mcwyjątkiem ostatniego c(należy pamiętać, że Mjest to dowolny sznurek górzysty i niekoniecznie taki sam jak inny M). Ponieważ Mjest to górzysty sznur, zgodnie z regułą 2, cMcmusi być górzystym sznurkiem. Albo Sjest to górzysty sznurek, w którym cScto przypadku jest to górzysty sznurek, albo Smożna go przepisać, tak jak cMcTctam, gdzie Twystępują te ostatnie n - 2czasy, z Mcwyłączeniem ostatniego c. Ta linia rozumowania może być stosowana, dopóki sznurek nie ma gwarancji, że zawiera górzysteMckiedyś, co oznaczałoby, że musiałoby to być również górzyste. Skoro więc cMcjest górzysty, a jeśli cMci cM'cgórzysty, to cMcM'cmusi być górzysty, cały sznurek musi być górzysty.

Z drugiej strony, dla sznurka, w cScTcktórym cSci cTcsą górzyste, to albo cScjest sznurkiem górzystym zgodnie z regułą 2, albo regułą 3. Jeśli jest sznurkiem górzystym zgodnie z regułą 2, Smusi być również sznurkiem górzystym. Jeśli jest to górzysty sznurek zgodnie z regułą 3, cScmusi on mieć formę cUcVcgdzie cUci cVcsą sznurkami górzystymi. Ponieważ dłuższy cUci cVcmusi być co najmniej o dwa znaki krótszy niż, cSca reguła 3 wymaga zastosowania co najmniej 5 znaków, to po skończonej liczbie zastosowań reguły 3 każdy ciąg znaków między literami cwybranymi przez zastosowanie reguły 3 musi być górzysty strunowy. Można zastosować tę samą linię rozumowaniacTc dlatego według mojej definicji sznurek jest górzysty.

Ponieważ dowolny ciąg pasujący do mojej definicji jest górzysty, a moja definicja pasuje do wszystkich łańcuchów górskich, jest on równoważny z podanym w pytaniu.

Objaśnienie kodu

Ogólnie a//0reguła DCG, zdefiniowana w pierwszym wierszu, pasuje do każdego górzystego łańcucha. +//1Reguła DCG (jak orzeczników, zasady DCG można nadać nazwy operatora ), określone na drugiej linii, pasuje dowolny ciąg znaków, który składa się z sekwencji zero lub więcej górskich ciągów z charakterem przekazywane jako argumenty Xdołączona na końcach nich . Lub pożyczyć notację regularną, której użyłem powyżej, a//0dopasowuje, c(Mc)*ale zleca zadanie dopasowania (Mc)*do tego, +//1co przyjmuje cza swój argument X.

Kody po linii kody zachowują się w następujący sposób:

a-->[X],+X.

Ta linia określa regułę DCG a. Stwierdza [X], że pierwszy znak musi być równy aktualnie niezdefiniowanej zmiennej X. Powoduje to, Xże jest ustawiony jako pierwszy znak. +XNastępnie stwierdza, że reszta łańcucha musi zgadzać się z reguły DCG +//1ze znaku, który Xjest ustawiony jako argument.

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

Ta linia określa +//1regułę DCG. ;Oznacza grupę lub w Prologu co oznacza, że łańcuch może pasujących albo []albo a,[X],+X. []Reprezentuje ciąg pusty, więc +//1zawsze jest w stanie dopasowania pusty łańcuch. Jeśli struna nie jest pusta, początek musi się zgadzać, a//0a więc musi być struną górską. Następnie musi następować dowolna Xustawiona postać . Wreszcie reszta ciągu musi się zgadzać +X.


2

Łuska , 15 bajtów

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

Wypróbuj online! Wnioskowanie typu zajmuje około 40 sekund, więc bądź cierpliwy.

Wyjaśnienie

εωφΓ§?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.

Chodzi o to, aby wielokrotnie zastąpić podciąg formularza abaze adopóki nie jest to już możliwe. Dane wejściowe są górzyste wtedy i tylko wtedy, gdy skutkuje to ciągiem jednego znaku (co εtestuje). Jedyną niebezpieczną sytuacją jest sytuacja, gdy mamy taki ciąg znaków, abaktóry nie wydaje się szczytem:

a
 b
  a
   c
  a
   d
  a
 b
a

Na szczęście zawsze możemy go przekształcić w jedno:

a
 b
a
 c
a
 d
a
 b
a

Uważam, że zwrócenie pojedynczego znaku w trueprzypadku i nie w innym przypadku byłoby „spójne”.
Jonathan Allan

W rzeczywistości może to popychać, ponieważ nie ma wyraźnej linii między tym a brakiem operacji („zwraca górzysty sznur, gdy jest górzysty i nie inaczej”), co z pewnością byłoby luką.
Jonathan Allan

@JonathanAllan Pojedyncze znaki w porównaniu z innymi ciągami również wydają mi się zbyt rozmyte, zwłaszcza, że ​​mają niewielki związek z prawdą (tylko pusty ciąg jest fałszem w Husk).
Zgarb

Tak, „jakakolwiek reprezentacja” jest zdecydowanie zbyt liberalna - skomentowałem PO ”:)
Jonathan Allan

Naprawdę chcę, aby definicja była liberalna, ponieważ pozwala na bardziej kreatywne rozwiązania. Zmieniłem sformułowanie z „spójny” na „jednoznaczny”, choć mogę też dodać, że powinien być jednoznaczny bez kontekstu. Jak w przypadku, powinno być jasne, nie wiedząc, jaki ciąg wejściowy był, czy wynik jest prawdziwy, czy fałszywy. Tak więc pojedynczy znak dla prawdy i nic dla fałszu nie byłoby w porządku.
Beefster


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.