パリンドローム部分文字列からパリンドロームをつなぎ合わせる


14

文字列を考えるとl、全てのパリンドロームのサブストリングを見つけるpl(重複し、単一の文字列を含む)を。次に、すべての部分文字列をp有効な回文に再配置します(複数の正解がある場合があります)。p単一のパリンドロームに再配置できない場合は、プログラムに未定義の動作(エラー、スタックオーバーフロー、終了、ジョンドヴォルザークの首吊り/早すぎる殺人など)が含まれている可能性があります。


有効なテストケース

l = anaa
p = ['a', 'n', 'a', 'a', 'aa', 'ana']
result = anaaaaana or aanaaanaa or aaananaaa

l = 1213235
p = ['1', '2', '1', '3', '2', '3', '5', '121', '323']
result = 1213235323121

l = racecar
p = ['r', 'a', 'c', 'e', 'c', 'a', 'r', 'cec', 'aceca', 'racecar']
result = racecarcecaacecracecar (there are others)

l = 11233
p = ['1', '11', '1', '2', '3', '33', '3']
result = 113323311 or 331121133

l = abbccdd
p = ['a', 'b', 'bb', 'b', 'c', 'cc', 'c', 'd', 'dd', 'd']
result = bbccddaddccbb or ccbbddaddbbcc or (etc...)

l = a
p = ['a']
result = a

無効なテストケース(不可能)

l = 123456789
p = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
result = <not possible, behavior undefined>

l = hjjkl
p = ['h', 'j', 'jj', 'j', 'k', 'l']
result = <not possible, behavior undefined>

l = xjmjj
p = ['x', 'j', 'jmj', 'm', 'j', 'jj', 'j']
result = <not possible, behavior undefined>

ルール

  • 入力語が回文自体である場合、入力として常に有効です。
  • 返される部分文字列は1つだけで、有効な限り任意の部分文字列を選択できます。
  • 入力に実行可能な出力がない場合、コードの動作が未定義になる可能性があります。
  • 入力にはの間のASCII印刷可能文字のみが含まれます0x20-0x7E
  • これは、最小のバイト数が勝者です。

1
の最初に提案された結果"abbccdd"は間違って"bb""dd"ます。最後の2文字はである必要があります。
18

単一の文字列ではなく、部分文字列の配列を返すことはできますか?
シャギー

入力として文字のリストを使用できますか?
alephalpha

1
容認できる行動であることによって、それを入力した人をハングさせることを意味しますか?
ジョンドヴォルザーク

@JohnDvorakが明確にした。
魔法のタコ

回答:


8

Brachylog、10バイト

{s.↔}ᶠpc.↔

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

失敗する(印刷する) false.不可能な場合は)。

説明

{   }ᶠ         Find all…
 s.              …substrings of the input…
  .↔             …which are their own reverse
      p        Take a permutation of this list of palindromes
       c.      The output is the concatenation of this permutation
        .↔     The output is its own reverse


3

JavaScript(ES6)、193バイト

「Look Ma、置換は組み込まれていません!」(そうそう...それは長い...)

解決策がない場合は、空の配列を返します。

f=(s,a=[].concat(...[...s].map((_,i,a)=>a.map((_,j)=>s.slice(i,j+1)))).filter(P=s=>[...s].reverse().join``==s&&s),m=S=[])=>S=a.map((_,i)=>f(s,b=[...a],[...m,b.splice(i,1)]))>''?S:P(m.join``)||S

デモ

どうやって?

コードを小さな部分に分割しましょう。

P()を定義します。この関数は、sが回文である場合はsを返し、そうでない場合はfalseを返します。

P = s => [...s].reverse().join`` == s && s

入力文字列sのすべての部分文字列を計算します。P()を使用して、空でない回文を分離し、配列aに格納ます。

a = [].concat(...[...s].map((_, i, a) => a.map((_, j) => s.slice(i, j + 1)))).filter(P)

メインの再帰関数f()は入力としてaを取りそのすべての順列を計算します。順列自体が回文である(一度結合される)たびにSを更新し、最終的にSの最終値を返します。

f = (                        // given:
  a,                         //   a[] = input array
  m = S = []                 //   m[] = current permutation of a[]
) =>                         //   and S initialized to []
  S = a.map((_, i) =>        // for each element at position i in a[]:
    f(                       //   do a recursive call with:
      b = [...a],            //     b[] = copy of a[] without the i-th element
      [...m, b.splice(i, 1)] //     the element extracted from a[] added to m[]
    )                        //   end of recursive call
  ) > '' ?                   // if a[] was not empty:
    S                        //   let S unchanged
  :                          // else:
    P(m.join``) || S         //   update S to m.join('') if it's a palindrome


2

05AB1E13 12バイト

ŒʒÂQ}œJʒÂQ}¤

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

Magic Octopus UrnとEnigmaのおかげで-1バイト。


J自動的に因数分解されるので、€J単に必要ではありませんJ。また、すべてではなく、回文の1つを返すことになっています。 オンラインでお試しください!同じバイト数に対して有効です。
魔法のタコ

@MagicOctopusUrn修正、ありがとう!
カルド

Ùć可能性があります¤(または他の多くのオプション)
Emigna

@Emignaは、なぜそれが必要とされなかったのかわからなかったÙ
魔法のタコ

エニグマ私の悪い、未知の理由で、私はすべてのユニークなパリンドローム、したがって元のthoughtを表示することになっていたと思った。ヒントをありがとう、修正されました!
カルド

2

スタックス、13 バイト

绬►Ö∞j∞:Æ╘τδ

テストケースを実行する(現在のマシンでは約10秒かかります)

これは、同じプログラムの対応するASCII表現です。

:e{cr=fw|Nc$cr=!

それはまったく純粋なブルートフォースではありませんが、私が書いたブルートフォース実装と同じくらい小さいです。約10分後にそのブラウザがクラッシュしました。とにかく、ここでそれがどのように機能するかです。

:e                  Get all contiguous substrings
  {cr=f             Keep only those that are palindromes
       w            Run the rest of the program repeatedly while a truth value is produced.
        |N          Get the next permutation.
          c$        Copy and flatten the permutation.
            cr=!    Test if it's palindrome.  If not, repeat.
                    The last permutation produced will be implicitly printed.

2

ルビー131の 123 120バイト

->s{m=->t{t==t.reverse}
(1..z=s.size).flat_map{|l|(0..z-l).map{|i|s[i,l]}}.select(&m).permutation.map(&:join).detect &m}

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

文字列を受け取り、文字列を返すラムダ。nilソリューションが存在しない場合に戻ります。

-5バイト:交換select{|t|l[t]}select(&l)

-3バイト:交換map{..}.flattenflat_map{...}

-1バイト:サブストリング開始およびサブストリング終了ではなく、サブストリング長およびサブストリング開始でループ

-2バイト:z事前にではなく、最初の使用時に宣言します

->s{
  l=->t{t==t.reverse}        # Lambda to test for palindromes
  (1..z=s.size).flat_map{|l| # For each substring length
    (0..z-l).map{|i|         # For each substring start index
      s[i,l]                 # Take the substring
    }
  }                          # flat_map flattens the list of lists of substrings
  .select(&l)                # Filter to include only palindromic substrings
  .permutation               # Take all orderings of substrings
  .map(&:join)               # Flatten each substring ordering into a string
  .detect &l                 # Find the first palindrome
}

1

Pyth、13バイト

h_I#sM.p_I#.:

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

Xcoder氏のおかげで-1バイト


Lol私は他の誰もPythを使用していないことを確信していたので、あなたの回答を見る前に私自身の別の回答(現在は削除済み)を提出しました。h_I#sM.p_I#.:またはe_IDsM.p_I#.:を13バイト使用できます。
ミスターXcoder

@ Mr.Xcoder Oh haha​​:Pそうそう、Pythを使うことはほとんどない。なぜPythを使うことにしたのかわからない。ありがとう!
ハイパーニュートリノ


1

ジャプト、19バイト

Japtによって(まだ)取得できない 文字列のすべての部分文字列部分的には現在の消耗レベルによってます。

undefined解決策がない場合に出力されます。

Êõ@ãX fêQÃc á m¬æêQ

それを試してみてください


説明

                        :Implicit input of string U
Ê                       :Length of U
 õ                      :Range [1,Ê]
  @      Ã              :Pass each X through a function
   ãX                   :  Substrings of U of length X
      f                 :  Filter
       êQ               :    Is it a palindrome?
          c             :Flatten
            á           :Permutations
              m         :Map
               ¬        :  Join to a string
                æêQ     :Get first element that is a palindrome

1
¬答えから削除するだけの部分文字列のリストに関する質問ですか:P?
魔法のタコUr

1
削除できると思ったが、その後は必要だったæ_¬êQので、とにかくバイトを保存しなかったでしょう!
シャギー

ハハハ、これからはバイト節約の方法に注意してください;)。確認するために自分で削除しようとしましたが、japtコマンドがlolで動作すると思うように動作しないことに気付きました。
魔法のタコ

1

、12バイト

ḟS=↔mΣPfS=↔Q

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

説明

ḟS=↔mΣPfS=↔Q  Implicit input, a string.
           Q  List of substrings.
       f      Keep those
        S=↔   that are palindromic (equal to their reversal).
      P       Permutations of this list.
    mΣ        Flatten each.
ḟ             Find an element
 S=↔          that is palindromic.

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