あなたのおじは酔って必要を助けます


10

Drunk Uncle(リージョンロックで申し訳ありませんがMEとAUS)は、Saturday Night Liveの架空のキャラクターです。彼はしばしば彼らのように聞こえる他の人の言葉を混同します。この課題では、通常のスピーチを酔っぱらいに変換する必要があります。

アルゴリズム

drunkspeakに翻訳するには、テキスト内の単語の順序を入れ替える必要があります。スワッピングは、2つの単語の酔いの類似性に基づいています。酔いの類似性は、2つの単語が同じインデックスで発生した文字の数として定義されます。ただし、2つの同一の単語の酔いの類似度は-1です。例えば、treeそしてfriendそれらはインデックス1、インデックス3で「E」で「R」が両方のために、2の酩酊類似性を有します。

あなたがしなければならないのは、最も酔っている類似性を持つテキストの2つの単語を見つけて、それらを交換することだけです。2つの用語を交換すると、それらは移動しなくなります。次に、残りの入れ替え可能な用語を確認し、酔いの類似性が最も高い2つを入れ替えます。スワップできなくなるまでこれを続けます。次に、更新されたテキストを出力(または関数の場合はリターン)します。

詳細

  • 簡単にするために、入力は[A-Za-z]の文字で構成される単語のリストです
  • すべての入力に少なくとも1つの単語が含まれています
  • :文字のマッチングは大文字と小文字を区別しないであるAと一致したa注:この規則に起因Dogdog同一であり、したがって、のDSを有する-1)
  • 複数のペアが最も高い酔いの類似性を持っている場合:
    1. 単語の中で、それは酔いの類似性を最大にすることができます、リストで最も低いインデックスを持つものを選びます
    2. その単語を、酔いの類似性を最大化する最低インデックスの単語とペアにします

  1. Drunk Uncle needs your help (題名)

    • S 1:酔って<=>あなた(DS:1)your Uncle needs Drunk help
    • S 2:ヘルプが必要<=>(DS:1)your Uncle help Drunk needs
    • 出力: your Uncle help Drunk needs
  2. I love fidget spinners (退屈な例)

    • S 1:I <=>愛(DS:0)love I fidget spinners
    • S 2:fidget <=>スピナー(DS:0)love I spinners fidget
  3. dog eat dog ear

    • S 1:食べる<=>耳(DS:2)dog ear dog eat
    • S 2:dog <=> dog(DS:-1)dog ear dog eat(この手順は形式的です)
  4. Let me tell you a story

    • S 1:Let <=> me(DS:1)me Let tell you a story
    • S 2:あなたに伝える<=>あなた(DS:0)me Let you tell a story
    • S 3:a <=>ストーリー(DS:0)me Let you tell story a
  5. Too many money and purple people

    • S 1:紫<=>人(DS:4)Too many money and people purple
    • S 2:多く<=>お金(DS:2)Too money many and people purple
    • S 3:あまりにも<=>および(DS:0)and money many Too people purple

取り上げたい例が他にもある場合はお知らせください。


8
「i fid-getスピナー」を「i hate fid-getスピナー」に変更してください
Okx

1
「自然言語」
HyperNeutrino 2017

回答:


3

JavaScript- 286 279バイト

f=(a,n=(a=a.split` `).length)=>{for(d=n>>1;w=-2,d--;){for(i=n;i--;)for(j=n;j--;)s=((a,f,v=0)=>{for(u=s=a!=f;(r=a[v])&&(t=f[v++]);s+=(p=a=>a.toLowerCase())(r)==p(t));return u*s-1})(a[i],a[j]),!(f[i]|f[j])&&s>=w&&(w=s,x=i,y=j);f[x]=f[y]=1,[a[x],a[y]]=[a[y],a[x]];}return a.join` `}

JSFiddleで試すことができます。


PPCGへようこそ(再び):)素敵な最初の提出!
HyperNeutrino 2017

2

Python 3、285 277 270 267バイト、機能しない

i=input().split();r=range;l=len;t=y=z=-1;n=str.lower
for p in r(l(i)):
 for q in r(p):
  b=min(l(i[p]),l(i[q]));x=0
  for s in r(b):
   if n(i[p][s])==n(i[q][s]):
    x=x+1
  if n(i[p])==n(i[q]):
   x=-1
  if x>t:
   t=x;y=p;z=q
i[y],i[z]=i[z],i[y]
print(" ".join(i))

いくつかのテストケースが課題と矛盾するため、出力をテストケースではなく課題に一致させるようにしました。

編集:「下の」ものにゴルフをした。

編集:split( "")をsplit()に変更しました

編集:私はこれで実際にすべてのことを完了するわけではないことに気付きました、そして私は完全な実用的な答えを思い付くかもしれませんが、その間私はこれが1回の反復しか完了しないことを追加するかもしれません。


1
あなたはどちらかを定義する必要がありますg = str.lowerg = lambda s: s.lower()あなたはのように使うことができ、この
'2017

@ブルース・フォルテありがとう!これは8バイトを取り除きました。(ただし、最も高い類似度が0の場合でも単語を入れ替えるように修正する必要があったため、270に下がりました。これにより、バイトが追加されました)。
無害2017

1
問題ありません。PPCGへようこそ。まだご覧になっていない場合は、この種の投稿が非常に役立ちます。Btw .split(' ')はに置き換えることができます.split()
'2017

待ってください。どのテストケースを変更しましたか。それらの何が問題でしたか?
geokavel 2017

私は投稿を変更するのに十分な担当者がいませんが、明らかな矛盾は最初の例に対するものでした-「酔ったおじはあなたの助けが必要です」に対する与えられた答えは「あなたの叔父が酔った助けを必要とする」より「あなたの叔父は酔う必要がある」でした。これらの回答はどちらも同じ類似度スコアを持つ単語を交換し、どちらも最初の単語で始まるという意味で、ペアの最初を使用してどちらを交換するかを決定することにより、指定されたタイブレーカーに従います。(私はこれを書いているときに、矛盾が実際にはそれではなく、あいまいさであることに気づきました)。決定する所定の方法-charsが不足する場合は、次を参照してください
無害
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.