Portmantoutを生成します!


16

バックグラウンド

3年前、この男のトムマーフィーは、ポートマントーの考えを言語のすべての単語に拡張し、これをポートマントーportmanteau plus tout [ すべてのフランス語])と呼びました。英語を108,709個の単語のリストとして定義すると、彼は次の2つのプロパティを持つ611,820個の文字のシーケンスを見つけることができました。

  • すべての英語の単語は文字列に含まれています。
  • 文字列に2つの隣接する文字を含む近隣は英語の単語です。

ここでは「(ビデオ解説と一緒に)このportmantoutを見つけることができるページへのリンクをね。

portmantout

portmantoutの2つのプロパティのうち最初のプロパティは簡単に理解できます。2つ目は、説明が必要な場合があります。

基本的に、単語は重複する必要があります。「golfcode」は、「fc」を含む単語がないため、英語のポートマントには決して表示されません。ただし、portmantoutで「codegolf」が見つかる場合があります。「ego」はギャップを埋めます(他のすべての文字のペアは「code」または「golf」のいずれかです)。

あなたのタスク:

文字列のリストを受け取り、リストのportmantoutを返すプログラムまたは関数を作成します。

このPython 3コードはportmantoutを検証します。

テストケース

すべてのリストは順不同です。あれは、

{"code", "ego", "golf"} -> "codegolf"
{"more", "elm", "maniac"} -> "morelmaniac" or "morelmorelmaniac" or "morelmorelmorelmaniac" or...
    Would a morelmaniac be some sort of mycologist?
{"ab", "bc", "cd", "de", "ef", "fg", "gh", "hi", "ij", "jk", "kl", "lm", "mn", "no", "op", "pq", "qr", "rs", "st", "tu", "uv", "vw", "wx", "xy", "yz", "za"} -> "abcdefghijklmnopqrstuvwxyza" or "rstuvwxyzabcdefghijklmnopqrstuvwxyzabcdef" or any 27+ letters in order

そして、なぜですか?コードが妥当な時間内に実行される場合、マーフィーのサイトにある巨大なもの。

ルール

  • コードを停止する必要があります。
  • 実行ごとに同じportmantoutを返す必要はありません。
  • あなたはすべての文字列が小文字のみで構成すると仮定してaz
  • portmantoutが不可能な場合、プログラムは何でもできます。例:{"most", "short", "lists"}
  • I / Oおよび抜け穴の標準ルールが適用されます。

これはなので、各言語での最短の解決策(バイト単位)が勝ちです!ハッピーゴルフ!



1
たぶんいくつかのテストケース?
アダム

{"sic", "bar", "rabbits", "cradle"} -> "barabbitsicradle" {"mauve", "elated", "cast", "electric", "tame"} -> "mauvelectricastamelated"(より多くのテストケース)
スンダ

2
ええ、おそらく単語を2回使用する必要があるテストケース
ASCIIのみ

2
1文字の単語を取得できますか?

回答:


3

パイソン2204の 202バイト

def f(l,s=''):
 if all(w in s for w in l):return s
 for i,w in enumerate(l):
	a=next((s+w[i:]for i in range(len(w)-1,0,-1)if s[-i:]==w[:i]),0)if s else w;x=a and f(l[:i]+l[i+1:]+[l[i]],a)
	if x:return x

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


保存しました

  • -2バイト、再帰のおかげで

最後の2行でタブを使用して、2バイトを節約できます。
再帰的


これはの正しい出力を生成しません["ab", "ba", "ca"]。私のソリューションにも同じバグがあります。
再帰的

1

Pyth、39バイト

JQW}_1mxbdQ=+J|=b*qKOQ<=T+OP._KOJlKTY)b

ここで試してみてください

説明

JQW}_1mxbdQ=+J|=b*qKOQ<=T+OP._KOJlKTY)b
JQ                                        Get a copy of the input.
  W}_1mxbdQ                          )    While there are words in the input
                                          that aren't in b (initially space)...
                   KOQ    OP._KOJ         ... get a random input word, a random
                                          prefix, and a random joined word...
                       =T+                ... stick them together...
                  q   <          lKT      ... and check if joining them together
                                          is valid...
               =b*                        ... then update b accordingly...
           =+J|                     Y     ... and stick the new word into J.
                                      b   Output the final result.

1

スタックス39 36 バイト

ä▬│•.k=╠lƒ☺╜00║¿~,▓╕╠7ÉΔB<e┼>☼Θ²└ô┴\

実行してデバッグする

すべてのテストケースを約1秒で確定的に実行します。

これは再帰的なアルゴリズムです。

  • 入力の各単語を候補として開始
  • 各ステップで、候補の部分文字列として出現する回数で単語を並べ替えます。
  • 現在の候補の末尾と互換性のある単語ごとに、単語を結合して新しい候補を作成し、再帰呼び出しを行います。

以下にプログラムを展開し、アンゴルフし、コメントを追加します。

FG              for each word in input, call target block
}               unbalanced closing brace represents call target
  x{[#o         sort input words by their number of occurrences in the current candidate
  Y             store it in register Y
  h[#{,}M       if all of the words occur at least once, pop from input stack
                input stack is empty, so this causes immediate termination,
                followed by implicitly printing the top of the main stack
  yF            for each word in register y, do the following
    [n|]_1T|[|& intersect the suffixes of the candidate with prefixes of the current word
    z]+h        get the first fragment in the intersection, or a blank array
    Y           store it in register Y
    %t+         join the candidate with the current word, eliminating the duplicate fragment
    y{G}M       if the fragment was non-blank, recursively call to the call target
    d           pop the top of stack

これを実行する

編集:これ["ab", "ba", "ca"]は、他の投稿された答えのほとんどがそうであるように、ループのような入力のクラスでは失敗します。


0

JavaScriptの(ES6)、138の 130バイト

f=a=>a[1]?a.map((c,i)=>a.map((w,j,[...b])=>i!=j&&!/0/.test(m=(c+0+w).split(/(.+)0\1/).join``)?t=f(b,b[i]=m,b.splice(j,1)):0))&&t:a

完全に移植できないリストに対してエラーを返します。

ゴルフをしていない:

f = a =>
  a[1] ?                                        //if more than one element ...
    a.map((c, i)=>                              // for each element
      a.map((w, j, [...b])=>                    //  for each element
        i != j &&                               //   if not the same element
        !/0/.test(m=(c+0+w).split(/(.+)0\1/).join``) &&  //   and the elements overlap
        (t = f(b,                               //   and f recursed is true when
               b[i] = m,    //    replacing the ith element with the 2-element portmanteau
               b.splice(j, 1)                   //    and removing the jth element
              )
        )
      )
    ) &&
    t :                                         //return the recursed function value
    a                                           //else return a

完全なアルファベットの例では、コードは非常に遅くなります(そのため、上記のスニペットには含まれていません)。

mapsをsomesに変更すると、2バイトが失われます。

f=a=>a[1]?a.some((c,i)=>a.((w,j,[...b])=>i!=j&&!/0/.test(m=(c+0+w).split(/(.+)0\1/).join``)?t=f(b,b[i]=m,b.splice(j,1)):0))&&t:a


1
間違いを犯したようです。昨日見たと思った動作を再現できません。私の混乱とあなたの時間を無駄にして申し訳ありません。これらのコメントはすべて間違っていて誤解を招く可能性があるため、削除します。
再帰的
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.