分厚いパリンドローム


15

パリンドロームは楽しいですが、他の弦のいくつかは取り残されているように感じ始めています。これらの文字列をパリンドロームのチャンク配列に分割することで、これらの文字列をチャンキーな回文に変えることができます。

たとえば、文字列は、"abcabca"我々は文字で、それ文字を読めば回文ではありませんが、我々はそれ作るの3種類の方法持って分厚い回文を:

["abcabca"]
["a" "bcabc" "a"]
["a" "bc" "a" "bc" "a"]

ご覧のとおり、分厚い回文性は非常に包括的な概念です。すべての文字列は、少なくとも1つの方法で分厚い回文に変換できます。

仕事

入力として文字列を受け取り、その回文的なchunkiness、つまり回文配列であるパー​​ティションの数を返すプログラムまたは関数を作成します。

テストケース

 OUTPUT | INPUT
--------+---------------------------------------------
      1 | ""                                          
      1 | "a"                                         
      1 | "ab"                                        
      2 | "aa"                                        
      2 | "aaa"                                       
      3 | "abcabca"                                   
      4 | "abababab"                                  
     28 | "abcabcaabababababcabca"                    
      1 | "bbbbabababbbbababbbaaaaa"                  
     20 | "ababbaaaabababbbaaabbbaa"                  
      5 | "baaabaabababaababaaabbaab"                 
     62 | "bbaaababbabbabbbabaabaabb"                 
      2 | "a man a plan a canal panama"               
     25 | "ama nap lan aca nal pan ama"               
     93 | "SATOR   AREPO   TENET   OPERA   ROTAS"     
    976 | "abcabcaabcabcaabcabcaabcabcaabcabcaabcabca"
  28657 | "ababababababababababaababababababababababa"
2097152 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

追加のルール

  • 入力は42文字以下の印刷可能なASCII文字で構成され、オプションで言語の文字列区切り文字で囲まれたり、その後に改行が続くと仮定することができます。

  • 有効な入力文字列ごとに、私のマシン(Intel Core i7-3770、16 GiB RAM、Fedora 21)で1分以内にコードが終了する必要があります

    適切なアルゴリズムを使用すると、この時間制限に簡単に準拠できるはずです。ただし、ほとんどの場合、入力文字列のすべてのパーティションを反復処理することはできません。

  • 出力をSTDOUTに出力することを選択した場合、単一の改行が続く場合があります。

  • 標準の規則が適用されます。

回答:


4

Pyth、40 34 27 22バイト

Lhsmy:bd_df!xb>TbS/lb2

オンライン通訳で試してみてください

最初の40バイトバージョンから大幅にダウンしました。FryAmTheEggmanのおかげで、合計6バイトの節約になった2、3の便利な演算子(ドキュメントを検索するのは難しいです!)を指摘してくれました。その結果を解釈することによって節約巧妙な単一バイトのためのデニスのおかげx- truthy / falsy値ではなくインデックスとして!xb>Tbではなくq<bT>Tb


使い方:

の部分文字列で再帰的に呼び出すことによりy、文字列のチャンクネスを決定する関数を定義します。関数はPythで自動的にメモされるため、再帰の時間オーバーヘッドはほとんどありません。bb

L                              def y(b): return ___
                 S/lb2         The range [1,2,...,len(b)/2]
          f!xb>Tb              Filter n for which b[:n] == b[-n:]
   m                           Map each n in the list to...
    y:bd_d                     y(b[d:-d])       
 hs                            Take the sum and add one (implicit return)

ええ、Pythの学習の大部分は共同/試行錯誤/字句解析器を読むことです。:)
FryAmTheEggman

1
1.関数を送信することにより、2バイトを保存できます。で呼び出す必要はありませんyz。2. 2つのマップとフィルターの代わりに、1つのマップと3バイトを節約する条件(リンク)を使用できます。
デニス

2

CJam(41 39バイト)

qM{_,2/,\f{\~_2$>@2$<@~)/(@=\M*j*}1b)}j

オンラインデモ

これは、各「中央」文字列のチャンキー回文の数を見つけるという意味で「熱心」です(つまり、元の文字列の両端から同じ数の文字を削除した結果)が、自動メモを使用するためj演算子はそれぞれ1回だけ計算され、非常に高速なプログラムを提供します(また、メモされていない実装で数文字を保存します)。

1バイト節約してくれたDennisに感謝します。



1

Perl、86バイト

84バイトコード+ 2スイッチ

より短い方法があるはずですが、ここに行きます:

perl -lpe 'sub c{my($x,$i)=@_;$x=~/^(.{$i})(.*)\1$/&&c($2,0*++$s)while++$i<length$x}c$_;$_=++$s'

STDINから入力を取得します(1行に1文字列)。

説明:値の場合1<=$i<length(input string)、正規表現/^(.{$i})(.*)\1$/を使用して左右のチャンクを取得し、カウントをインクリメントします。次に、文字列の中央部分に対して同じことを再帰的に行います。

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