リンドン単語分解


11

バックグラウンド

A リンドン・ワードは、そのすべての他の回転より厳密に辞書的に小さい非空の文字列です。これらのサブワードが辞書式に増加しないように、Lyndonワードの連結として任意のストリングを一意に因数分解することができます。あなたの挑戦はこれをできるだけ簡潔にすることです。

詳細

印刷可能なASCII文字列のLyndonワード分解を順番に列挙する関数またはプログラムを実装し、結果の部分文字列を何らかの配列またはストリームとして出力する必要があります。文字はコードポイントで比較する必要があり、すべての標準入出力メソッドが許可されます。場合と同様に、バイト単位の最短プログラムが優先されます。

テストケース

''           []
'C'          ['C']
'aaaaa'      ['a', 'a', 'a', 'a', 'a']
'K| '        ['K|', ' ']
'abaca'      ['abac', 'a']
'9_-$'       ['9_', '-', '$']
'P&O(;'      ['P', '&O(;']
'xhya{Wd$'   ['x', 'hy', 'a{', 'Wd', '$']
'j`M?LO!!Y'  ['j', '`', 'M', '?LO', '!!Y']
'!9!TZ'      ['!9!TZ']
'vMMe'       ['v', 'MMe']
'b5A9A9<5{0' ['b', '5A9A9<5{', '0']


これは、<=ness による分割と同等であることに注意してください。(私はこれをより良く表現する方法がわかりません:|)
CalculatorFeline

これは、最初の文字とそれよりも大きいすべての文字のプレフィックスを繰り返し取得することと同等ですか?
-xnor

@xnorいいえ。「abac」はリンドン語です。
user1502040

@ user1502040なるほど、関係は興味深いです。これをキャッチするテストケースを追加することをお勧めします。
xnor

回答:


5

Pyth、17 16バイト

isaacgのおかげで-1バイト!

hf!ff>Y>YZUYT+./

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

説明

hf!ff>Y>YZUYT+./
              ./    Take all possible disjoint substring sets of [the input]
             +      plus [the input] itself (for the null string case).
 f                  Filter for only those sets which
  !f        T       for none of the substrings
    f  >YZUY        is there a suffix of the substring
     >Y             lexographically smaller than the substring itself.
h                   Return the first (i.e. the shortest) such set of substrings.

1
hf!ff>Y>YZUYT+./空の文字列の場合、1バイト少なくなります。
-isaacg

よかった、ありがとう!もっと短い方法があったに違いないと感じました。
-notjagan


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