山岳ですか?


29

チャレンジ

この課題のために、山岳文字列はM: x(Mx)*、各プロダクションですべてのxが同じ文字である文法規則に準拠する文字列です。インデントすると、山のような文字列は次のようになります。

A
 B
  C
   D
  C
   E
    F
   E
  C
 B
A

ご覧のとおり、横から見ると少し山のように見えます。

正式な定義

  • どのキャラクターaも山岳です。
  • 場合S山岳文字列で、a文字があり、その後、aSa並置は、文字列の連結を表し、山岳です。
  • 場合aSaaTa山岳文字列である、そしてaSaTa山岳文字列です。この規則は、このパターンが任意の数の繰り返しに適用されることを意味することに注意してください。(すなわちaSaTaUaaSaTaUaVaaSaTaUaVaWa...すべての山地です。)

すべての奇数長パリンドロームは、たとえば次のように山岳です。

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

ルール

  • これは決定の問題であるため、trueまたはfalseの表現は、正しく、一貫性があり、明確であり、プログラムが有限時間で終了する限り、有効な出力です。ソリューションの出力規則を必ず明記してください。
    • 入力文字列が何であるかを知らなくても、出力が真か偽かを判断するのは簡単です。これは、真実または偽の出力が一定である必要があるという意味ではないことに注意してください。ただし、「文字列が山岳で、山岳でない場合は非山岳文字列を印刷する」という規則は明らかな理由で禁止された抜け穴です。
    • 一方、「falseの場合は例外をスローし、trueの場合は静かに終了する」などの規則は問題ありません。
  • これはコードゴルフであるため、最短のプログラムが勝利します。
  • 標準的な抜け穴は禁止されています。

4
aaa同じキャラクターを複数のレベルで使用する必要があるようなテストケースが良いでしょう。
マーティンエンダー

あなたはおよそよろしいですかwasitacaroraratisaw?それは私には山のようです
トンホスペル

wasitacaroraratisaw確かにある山岳 AFAICTは
ETHproductions

そうです。「ほぼパリンドローム」を見つけようとしていたのでしょうが、偶然山岳弦を見つけました。
ビーフスター

2
これは、最初の文字で文字列を分割することで簡単に解決できると思いましたが、そのような場合aaaは機能しません。
xnor

回答:




6

Perl、22バイト

含み+のためにp

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

trueの場合は1、falseの場合は何も印刷しません




3

プロローグ(SWI)、29バイト

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

オンラインでお試しください!

このプログラムa//0は、山岳文字列である任意の文字列(文字のリスト)に一致するDCGルールを定義します。

説明

このプログラムでは、チャレンジで説明されているものとは少し異なりますが、同等の定義を山岳文字列に使用します。山岳文字列とは、文字のc後に山の文字列が続きc、最後にタックが付けられたものです。より簡潔な正規表現由来の表記では、山岳文字列がパターンと一致しなければならない山の文字列であり、括弧内の式が0回以上繰り返されることを意味します。それぞれが同じ文字である必要がありますが、それぞれが同じ山岳文字列である必要はないことに注意してください。c(Mc)*M*cM

同等性の証明

チャレンジからのルール1と2がMcそれぞれ0回と1回発生する私のルールと同等であることは明らかです。

山岳文字列が有している場合にMc発生するn場合回n > 1のように文字列を書き換えることができるcMcSc場合S、後者のあるn - 1時間Mcの最後を除く発生c(注M任意山列と他方として必ずしも同じではないがM)。Mルール2により山岳ストリングであるため、山岳ストリングでcMcなければなりません。いずれかのSその場合、山の文字列であるcSc山間の文字列であるかSのように書き換えることができるcMcTc場合T、後者のあるn - 2Mc最後を除く発生がc。この推論の行は、山岳であることが保証されていない文字列が含まれるまで適用され続けることができますMc一度それは同様に山岳である必要があることを意味するでしょう したがって、cMc山岳地帯であり、山岳地帯である場合cMccM'c山岳地帯であるcMcM'c必要があるため、ストリング全体が山岳地帯でなければなりません。

逆に、およびが山岳cScTcであるストリングの場合cSc、ルール2またはルール3による山岳ストリングのcTcいずれかcScです。ルール2による山岳ストリングである場合、山岳ストリングでSもある必要があります。ルール3で山岳ストリングである場合、はおよび山岳ストリングのcSc形式cUcVcでなければなりません。長いの以来と依然よりも少なくとも2つの文字短くする必要がありますルール3はルール3間の各文字列の用途の有限数の後に、その後に適用されるように、少なくとも5文字を必要とし、山岳でなければならないルール3の用途によって選択されたS文字列。推論の同じ行はに適用することができますcUccVccUccVccScccTc したがって、私の定義では、文字列は山が多いです。

私の定義に一致する文字列はすべて山岳であり、私の定義はすべての山岳文字列に一致するため、質問で指定されたものと同等です。

コードの説明

全体的a//0に、最初の行で定義されたDCGルールは、山岳文字列に一致します。+//1DCGルール(述語のように、DCG規則は、オペレータ名を与えることができる 2行目で定義されている)は、その引数として渡された文字とゼロ以上の山岳一連の文字列で構成されている任意の文字列と一致する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.

この行は、+//1DCGルールを定義します。は;、Prologでまたはを表します。これは、文字列がまたはのいずれ[]かに一致できることを意味します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.

アイデアを繰り返し、フォームの部分文字列を置き換えることであるabaa、これはもはや可能になるまで。入力が山のようになっているのは、これが1文字の文字列になる場合に限ります(これがεテスト対象です)。唯一の危険な状況は、このような文字列がある場合abaです。

a
 b
  a
   c
  a
   d
  a
 b
a

幸いなことに、いつでも1つに変換できます。

a
 b
a
 c
a
 d
a
 b
a

私は、trueケースに単一の文字を返すこと、そうでなければ「一貫性がある」と信じています。
ジョナサンアラン

実際、それはそれを推進している可能性があります。これは明らかに抜け穴となるノーオペレーション(「山岳の場合は山岳ストリングを返します」)の間に明確な線がないためです。
ジョナサンアラン

@JonathanAllan単一の文字と他の文字列は、特に真実性とはほとんど関係がないため(ハスクでは空の文字列のみが偽であるため)、私にとっても少し曖昧に見えます。
-Zgarb

うん、「あらゆる表現」は明らかに自由すぎる-私はOPについてコメントした:)
ジョナサンアラン

私は実際には、より創造的な解決策を可能にするため、定義をリベラルにしたいと思っています。言葉遣いを「一貫した」から「明確な」に変更しましたが、文脈がなくても明確でなければならないことを付け加えるかもしれません。同様に、結果がtrueかfalseかは入力文字列が何であるかを知らずに明確にする必要があります。したがって、trueの場合は1文字でfalseの場合は何も問題ありません。
ビーフスター


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.