双方向パリンドローム閉鎖ジェネレーター


24

前書き

入力文字列のパリンドローム閉包は、入力文字列から構築できる最短のパリンドロームであり、最終的なパリンドロームは入力文字列で始まります。

この課題では、次のような双方向パリンドローム閉包を検討します。

  • 入力文字列の左パリンドローム閉包は、入力文字列で始まる最短の回文です。
  • 入力文字列の右回文閉鎖は、入力文字列で終わる最短の回文です。
  • 入力文字列の双方向パリンドローム閉包は、入力文字列の左または右のパリンドローム閉包のいずれか短い方です。

仕事

あなたの仕事は簡単です。文字列(印刷可能なASCII、改行、空白のみで構成される)を指定すると、その文字列の双方向の回文クロージャが出力されます。同数の場合、左右の回文クロージャのいずれかが有効な出力です。

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、結果をSTDOUT(または最も近い代替)に出力するか、文字列として返すことができます。

入力が空の文字列になることはないと想定できます。

いくつかの例:

<Input>   -> <Output>
"abcdef"  -> "abcdefedcba"  (or "fedcbabcdef")
"abcba"   -> "abcba"
"abcb"    -> "abcba"
"cbca"    -> "acbca"

最初のアイデアの功績はVisualMelonに、最後のアイデアはMartinとZgarbの助けを借りて

この論文では、パリンドローム閉鎖、左パリンドローム閉鎖、右パリンドローム閉鎖という用語が最初に使用され定義されました


1
回文の解決策を見てみたい...
ojdo

2
@ojdoそれをボーナスとして追加することを考えましたが、答えのほとんどは、パリンドロームを作成するためにコメントを使用しただけだったと確信しています。コメントに頼らずに、いくつかの答えがパリンドロームになり得る場合、その答えには賞金を残します!
オプティマイザー

回答:


11

Pyth、22 19

hfq_TTsm,+z_d+_dzyz

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

説明

双方向パリンドローム閉包は、AXまたはの形式のいずれかですXA。ここでXは、入力文字列でAあり、の部分文字列ですX。私は実際には、の連続したサブストリングである必要Xがあります、1つのフォームのプレフィックス、他のフォームのサフィックス。しかし、私はこれらの失敗を気にしません。Pythで必要なのは部分文字列(連続または非連続)です。

                        Implicit: z = raw_input() // Read a string
                 yz     A list with all substrings (contiguous or not) of z
       m                For each of these substrings d, build
        ,                  a pair of two strings:
         +z_d              ( z + inveres(d) ,
             +_dz            inverse(d) + z )
      s                 Sum (put all created pairs into a list)
 fq_TT                  filter elements T, where inverse(T) == T (Palindrom)
h                          Take the first element

編集

古いバージョンは、長さでフィルタリングした後、文字列を順序付けしました.olN...y実は、長さで並べられた部分文字列を返します。したがって、これらの回文はすでにソートされています。


6

クリップ、40

(sl`f[a=ava}+m[i+v+ixx}Rlxm[i+xvu0ix}Rlx

Documents>java -jar Clip4.jar palindrome.clip
abcb
abcba

説明

(sl`                                        .- The shortest                     -.
    f[a=ava}                                .- palindrome                       -.
            +                               .- among the following two sets:    -.
             m[i      }Rlx                  .- For each number up to length(x)  -.
                +                           .- combine                          -.
                 v+ix                       .- the last i chars of x, reversed  -.
                     x                      .- and x.                           -.
                          m[i       }Rlx    .- For each number up to length(x)  -.
                             +              .- combine                          -.
                              x             .- x and                            -.
                               vu0ix        .- the first i chars of x, reversed.-.

6

CJam、30バイト

今までにCJamの回答を見ることを本当に望んでいました。

q:Q,{)QW%/(Q+Q@+s}%{,}${_W%=}=

{,}$はそこでそのブロックを本当に嫌いますが、私が使用している生成アルゴリズムのために、可能性のある回文の順序なしリストを取得します。

コードの説明

q:Q,{            }%             "Read the input string, store in Q, take length and";
                                "run the code block that many times";
     )QW%                       "Increment the iteration index and Put reversed Q on stack";
         /                      "Split reversed Q into parts of incremented iteration index";
          (Q+                   "Take out the first part and prepend it to Q";
             Q@+s               "Take the rest of the parts and append them to Q";
                   {,}$         "At this point, we have all possible prepended and appended";
                                "sequences of the input string. Sort them by length";
                       {_W%=}=  "Take the first sequence which is a palindrome";

こちらからオンラインでお試しください


6
{,}$もそのブロックが本当に嫌いです!冗談ですが、CJamで何ができるのかわかりません。
アレックスA.

4

Python 2、 115 113 109 105 96バイト

f=lambda x:[x for x in sum([[x[:~i:-1]+x,x+x[i::-1]]for i in range(len(x))],[])if x==x[::-1]][0]

うまくいけば、さらにゴルフをダウンできます。おそらく注目に値するビット:

  • 1つの2つのリスト内包表記に合計を使用する
  • minの必要性を回避するために、ソートされた順序で用語を構築します(@Jakubeが推奨)

1
アイテムは並べ替え順ではないため、などの文字列では失敗しますa
Sp3000

4

Mathematica、96バイト

これよりももっとエレガントな方法があるはずです...

""<>#&@@SortBy[r=Reverse;#/.{b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}&/@{r@#,#}&@Characters@#,Length]&

これは、文字列を取り、結果を返す名前のない関数を定義します。

基本的な考え方は

  • 文字列をに分割しますCharacters
  • このリストとその逆で配列を形成します。
  • パターンマッチングを使用して、それぞれの正しい回文を見つけます。

    {b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}
    

    これは実際にはフラットリストを返さないことに注意してください。例えば{a,b,c}あなたが得るだろう

    {a,b,{c,b,a}}
    
  • 2つの結果を長さで並べ替えます。

  • 短い方を選択し、で結合して文字列に戻します""<>#&@@

abacaba入力がのときに出力しますabac。正解はcabacです。長さで並べ替える前に、それらをフラット化する必要があると思います。
-alephalpha

1
@alephalphaは、コードサイズを変更する必要のない、より良い修正を見つけました(実際、それはソートしないことの背後にある私の意図でした)。
マーティンエンダー

2

Brachylog(2)、6バイト、言語ポストデートチャレンジ

~{↔?a}

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

Brachylogの場合、これは関数であり、完全なプログラムではありません。

説明

~{↔?a}
~{   }   Find a value that produces {the input} upon doing the following:
  ↔        reversing it;
   ?       asserting that we still have the same value;
    a      and taking either a prefix, or a suffix.

私の知る限り(私の言語でaはありませんが、可能性は低いようです)、このチャレンジのためにBrachylogに追加されていませんでしたが、ここで本当に役立ちます。「逆に、変更されていないことを断定する」メソッドを使用して、見つかった値が回文であると断定します。

これが生成する理由について 最短の回文を、Prolog(およびBrachylog)の評価順序は、最初に評価するものに大きく影響されます。この場合、それは「リバース」コマンドであり、(ほとんどのリスト操作と同様に)結果のリストのサイズを最小化することを目的とした評価順序を設定します。それは出力のサイズと同じなので、プログラムは幸いにも偶然に正しいことを正確に最小化します。つまり、明示的なヒントを追加する必要はありませんでした。


a-このチャレンジにはAdfixは追加されませんでした。接頭辞と接尾辞にニーモニックの良い記号がなかったので、必要な場合にのみ接頭辞または接尾辞を選択するために添字をとることができるadfixに両方をマージしました。
致命的

1

ルビー、76 + 2 = 78

コマンドラインフラグ付き -pll入力方法によっては不要な場合があります)を実行します

$_=[[$_,r=$_.reverse]*"\0",r+"\0#$_"].min_by{|s|s.sub!(/(.*)\0\1/){$1}.size}

文字列「abaa」を指定すると、文字列「cbca 0 acbc」および「acbc 0」が生成されます cbca'を。0はASCIIコード0の印刷不能文字です次に、それぞれで見つかった最長の繰り返し文字列フレーミング0のコピーを1つ削除します。最初の「a」と2番目の「cbc」は、2つのクロージャを取得します。次に、最短の結果を出力します。

ゴルフされたコードの唯一の本当に奇妙なことは、並べ替え中に文字列を短くすることです。これは、min_by比較される要素ごとにブロックを1回だけ実行するためです(両方ともシュワルツ変換であり、比較する要素)。


1

Python 3、107バイト


f=lambda a:[i for i in[a[:i:-1]*j+a+a[-1-i::-1]*(1-j)for i in range(len(a))for j in(0,1)]if i==i[::-1]][-1]

テストする:

>>> print("\n".join(map(f, ["abcdef", "abcba", "abcb", "cbca"])))
abcdefedcba
abcba
abcba
acbca

1

Haskell、107バイト

import Data.List
r=reverse
f s=snd$minimum[(length x,x)|x<-map(s++)(tails$r s)++map(++s)(inits$r s),x==r x]

テスト:

*Main> mapM_ (putStrLn.f) ["abcdef", "abcba", "abcb", "cbca"]
abcdefedcba
abcba
abcba
acbca

1

J、66 62バイト

3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

とても簡単です。私が使用する2つのトリック:

右パリンドローム閉鎖は、逆糸の左パリンドローム閉鎖です。

式min(is_palindrome / length)を使用して、最小の長さと回文性を持つ文字列の長さを見つけます。

   f=.3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

   f 'lama'
lamal

こちらからオンラインでお試しください。

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