特定の文字列に収まるように単語を並べ替える


10

文字列と単語のセットを指定して、不要な文字を削除することで文字列内で見つけられるように、単語の順序を出力します。単語セット内で単語が複数回出現する場合があります。入力文字列とすべての単語は、それぞれ1〜1000個の小文字で構成されます。ドロップされる文字は、単語の内部または単語の間にある場合があります。

プログラムまたは関数は、文字列と単語をリスト、文字列、またはSTDINから受け入れることができ、すべての単語をリストまたは文字列の出力として正しい順序で出力する必要があります。正しい解が複数ある場合は、そのうちの1つだけを出力します。考えられる正しい解決策がない場合は、空のリストまたは空の文字列を出力します。

例:

dogcatfrog cat frog dog
-> dog cat frog

xxcatfixsxhingonxgrapexxxfishingcxat cat grape catfish fishing
-> catfish grape fishing cat

dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
-> da ab ba ba ba cc bb aa ac dc db dd

flea antelope
->
(no solution)

これはコードゴルフです。最小バイト数が優先されます。

編集:単語の中に余分な文字を含めることができることを説明しました。


入力形式を1つの文字列にしてから、残りの文字列の別のリストにすることはできますか?
ドアノブ

@ドアノブ、はい、それで結構です。入力と出力の構造は柔軟です。チャレンジに追加されました。
ロジックナイト

テストケースから、ドロップされた文字は常に単語の間にあるように見えます。そうですか?チャレンジにその旨を
明記

その3番目のテストケースは理解できません。あなたの答えはcc前に置かれますbbが、bband cc部分文字列は一度だけ現れ、bb部分文字列が最初に現れます。
Neil、

@Neil、ccbcb文字列の一部でcc出力bbし、中央をドロップしてから出力しますc
ロジックナイト

回答:


5

Pyth、20 24バイト

Pythへの私の最初の試み:)

Jcw;FG.ptJI:hJj".*"G0jdG

使い方:

Jcw;FG.ptJI:hJj".*"G0jdG
Jcw                         assign("J",chop(input()))
    FG.ptJ                  for G in permutations(tail(J)):
          I:hJj".*"G0        if match(head(J),join(".*",G)):
                     jdG      print(join(" ",G))

注:3番目の例(dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc)では時間がかかります。


5

Pyth、10バイト

h@s./Myz.p

デモンストレーション

このプログラムは非常にブルートフォースです。最初に入力のすべてのサブセット、次にサブセットのすべてのパーティションを作成し、次に単語リストの並べ替えである最初のものをチェックします。メタコンセンサスで許可されているstdoutへの出力がないエラーによって処理される可能性はありません。エラーは、2バイト余分に取り除くことができます。

与えられたテストケースの多くでは、プログラムは妥当な時間内に完了しないことに注意してください。


2番目のテストケースを逃しました。
Leaky Nun

@KennyLau私がそのケースを試したとき、それは単に妥当な期間内に戻らないだけです。しかし、それは間違った答えを出しません。うまくいくと思います。答えを返すテストケースがありますか?その答えは間違っていますか?
isaacg

本当にいい方法。
Leaky Nun

あなたは私を倒しました。
Leaky Nun

それを答えに追加してもらえますか?
Leaky Nun

1

JavaScript(ES6)、119バイト

(s,a,t=``,...r)=>a[0]?a.find((w,i)=>(b=[...a],b.splice(i,1),f(s,b,w+t,w,...r)))&&q:~s.search(t.split``.join`.*`)&&(q=r)

文字列と単語の配列を受け入れ、単語の配列を返しますundefined。失敗した場合は 失敗時に空の文字列を返す必要がある場合は2バイトを追加します(?q:``)。この場合、この代替バージョンは120バイトのみで、失敗時に空の文字列を返します。失敗時に0を返すことが許可されている場合は2バイトを節約することもできます。

(s,a,t=``,...r)=>a[0]?a.reduce((q,w,i)=>q||(b=[...a],b.splice(i,1),f(s,b,w+t,w,...r)),0):~s.search([...t].join`.*`)?r:``

(これを書いた後、アルゴリズムが基本的に@KennyLauのPyth回答と同じであることに気付きました。)

編集の編集:質問の明確化後に更新されましたが、3番目のテストケースでは実際に遅くなっています。私はそれを前の晩に始めました、そして今朝私はちょうどそれが実際に解決策を見つけたことに気づきました、30から40時間後のどこか。私は本当に意地悪だったし、それに解決策を与えた(それはすぐに検証される逆の解決策で最もよく機能する)。


1

Java 7、256バイト

import java.util.*;String c(String...a){Map s=new HashMap();int j,i=1,l=a[0].length();for(;i<a.length;i++)if((j=a[0].indexOf(a[i]))>-1)s.put(j,s.get(j)!=null?s.get(j)+" "+a[i]:a[i]);a[0]="";for(j=0;j<l;j++)a[0]+=s.get(j)!=null?s.get(j)+" ":"";return a[0];}

別のアプローチを使用することで、これを確実にゴルフできるはずですが、今のところはこれで十分です。

Ungolfed&test code:

ここで試してください。

import java.util.*;
class M{
  static String c(String... a){
    Map s = new HashMap();
    int j,
        i = 1,
        l = a[0].length();
    for(; i < a.length; i++){
      if((j = a[0].indexOf(a[i])) > -1){
        s.put(j, s.get(j) != null
                  ? s.get(j) + " " + a[i]
                  : a[i]);
      }
    }
    a[0] = "";
    for(j = 0; j < l; j++){
      a[0] += s.get(j) != null
               ? s.get(j) + " "
               : "";
    }
    return a[0];
  }

  public static void main(String[] a){
    System.out.println(c("dogcatfrog", "cat", "frog", "dog"));
    System.out.println(c("xxcatfixsxhingonxgrapexxxfishingcxat", "cat", "grape", "catfish", "fishing"));
    System.out.println(
        c("dababbabadbaccbcbaaacdacdbdd ", "aa", "bb", "cc", "dd", "ba", "ba", "ba", "ab", "ac", "da", "db", "dc"));
    System.out.println(c("flea", "antelope"));
  }
}

出力:

dog cat frog 
cat grape fishing 
da ab ba ba ba bb db ac cc aa dd 

1

Groovy(44バイト)

他の誰もこれに正規表現を使用したとは信じられません...

{a,b->a.findAll(/${b.join('|')}/).join(" ")}

説明

/${b.join('|')}/-正規表現を作成して、文字列内の単語を検索します。
.findAll(...)-文字列内のすべての出現箇所を検索して配列に収集します。
.join(" ")-配列をスペースで結合します。

基本的に、出現がない場合、配列は空であり、空の文字列を暗黙的に返します。出現箇所が見つかった場合は、出現箇所のある配列オブジェクトを返し、それを文字列にフラット化します。

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