オードゴルフ-レターの削除


17

辞書ファイル(各行に単語または句を含むテキストファイルで、句読点は使用できますが数字はありません。行はアルファベット順です)を指定すると、単語から文字を削除して別の文字を作成できます。削除した文字は括弧で囲む必要があります。

たとえば、入力

cat
cart
code
golf
ode
verify
versify

の出力を与える必要があります

ca(r)t
(c)ode
ver(s)ify

同じペアを取得する複数の方法は、一度だけ表示する必要があります。scra(p)pedまたはを出力できますscrap(p)edが、両方はできません。

出力は、長いエントリのアルファベット順に並べる必要があります。

mart
mar
mat
ma

の出力が必要です

ma(r)
ma(t)
ma(r)t
mar(t)

後者の2つはどちらの順序でもかまいません。

辞書ファイルには、大文字、スペース、ハイフン、またはアポストロフィを含めることができます。これらは無視する必要があります。例えば、

inlay 
in-play

を生成する必要がありin(p)layます。出力はすべて同じケースにする必要があります。余分な空白は許可されます。

入力は、STDINまたはファイルから行うことができます。改行で区切られています。出力は、関数の戻り値またはSTDOUT(または必要に応じてファイルに書き込まれます)です。

これはであるため、バイト単位の最短コードが優先されます。

(これはPPCGに対する私の最初の挑戦です-何か間違ったことをしたかどうかを教えてください。それを修正します。)


3
出力は何にすべきmart mar mat maですか?そうでしょうmar(t) ma(r)t ma(r) ma(t)か?
Sp3000

@Sp:順序を指定するのを忘れた-明確にするために編集。
-Deusovi

最初の例では、ゴルフという単語は出力に含まれていません。それは他の組み合わせがない単語だからですか?
LukStorms

@ルク:うん!ほとんどの辞書ファイルには、他の単語をまったく作成しない単語がたくさんあります。これらの単語は出力のどこにも表示されません。
-Deusovi

2
(大きな)文字列パラメーターを持つ関数を許可し、要求された出力を文字列配列として返すのはどうですか?これにより、アルゴリズムに重点が置かれ、ファイルI / Oを管理する必要がなくなりました。
edc65

回答:


1

Perl -an0、101 + 3バイト

@F=sort{length$a<=>length$b}map{s/\W//g;lc}@F;map{$`.$'~~@F?print"$`($1)$'\n":$\while/(.)(?!\1)/g}@F;

どこ

  • @Fランタイムフラグマジックによって提供される配列に格納された辞書です。(b-oost、BoO#@%@#$%$#@ T)
  • map{s/\W//g;lc}@F単語からすべての記号を削除し、すべてを小文字にします。(ブースト、ブート)
  • sort{length$b<=>length$a}長さでソートします。(ブート、ブースト)
  • map{ (...) while/(.)(?!\1)/g}@F同じ文字が後に続かないすべての文字に一致します([b] oot、bo [o] t、boo [t]、...)
  • print"$`($1)$'\n"マッチする前、括弧、および成功する部分を出力します... (boo(s)t)
  • if $`.$'~~@F...一致する前後のすべての連結が辞書にある場合。([ブースト])

5

JavaScript(ES6)、225

文字列パラメーターを持つ関数。ファイルからの入力はありません。これが有効かどうかをOPに尋ねました。

EcmaScript 6準拠のブラウザーでスニペットを実行するテスト(矢印関数、テンプレート文字列、スプレッド演算子の実装-Firefox、Chromeではなく、SafariまたはMS Edge)

f=t=>t.split`
`.map(w=>(d[k=w.replace(/\W/g,'').toLowerCase()]={},k),d={},r=[]).map(w=>[...w].map((c,i,v)=>(d[v[i]='',x=v.join``]&&!d[x][w]&&r.push(d[x][w]=(v[i]=`(${c})`,v.join``)),v[i]=c)))&&r.sort((a,b)=>a.length-b.length)

// LESS GOLFED

Q=t=>{
  // convert to canonical form and put in a dictionary
  // each value in the dictionary is an hashtable tha will store the list
  // of words that can generate the current word, removing a letter
  d={},
  t=t.split`\n`.map(w=>(k=w.replace(/\W/g,'').toLowerCase(),d[k]={},k))
  r=[], // result array 
  t.forEach(w =>
    [...w].forEach((c,i,v)=>( // for each letter in word, try to remove
      v[i]='', x=v.join``, // build string with missing letter
      v[i]='('+c+')', y=v.join``, // and build string with brackets
      v[i]=c, // restore the current letter
      d[x] && // if the word with removed letter is present in the dictionary
      !d[x][w] && // and not already from the same generating word
         r.push(d[x][w]=y) // update dictionary and add word to result array
    ))
  )
  return r.sort((a,b)=>a.length-b.length) // sort result by length
}  

// TEST
function test() { R.innerHTML=f(I.value) }
textarea { height: 20em }
Test <button onclick="test()">-></button>
<span id=R></span>
<br><textarea id=I>cat
cart
code
golf
node
scraped
scrapped
verify
versify
mart
mar
mat
ma</textarea>


@ ETHproductions、thx
edc65

3

ルビー、173

->d{o=[]
c={}
d=d.sort_by{|w|[w.size,w]}.map{|w|w=w.upcase.gsub /[^A-Z]/,''
c[w]=l=1
w.size.times{|i|p,x,s=w[0...i],w[i],w[i+1..-1]
c[p+s]&&l!=x&&o<<p+"(#{w[i]})"+s
l=x}}
o}

ここでテストしてください:http : //ideone.com/86avbe

ここで読みやすいバージョン:http : //ideone.com/ynFItB


モバイルでは、今はテストできません-SCRAPPED / SCRAPEDのテストケースを追加できますか?
デウソビ

@Deusoviその場合は正しく機能しません。私は今それを修正しています...
クリスチャンルパスク

@Deusoviが更新されました!
クリスチャンルパスク

この答えは、例えば['jacklantern','jackslantern','jack-o-lantern']辞書の正しい出力を提供しません。
14mRh4X0r

1
@ 14mRh4X0rは質問でそのリクエストを見つけることができませんThe output should be ordered by the longer entry;... and the latter two could be in either order.
...-edc65

1

ルビー、211

これを解決するために、正規表現を使用して別のアプローチを取ることにしました。

->d{o=[]
d.map{|x|x.upcase!.gsub! /[-' ]/,''}
d.map{|x|(x.size+1).times{|i|o+=d.map{|w|w.b.sub! /(#{x[0...i]})(.)(#{x[i..-1]})/,'\1(\2)\3'if w[i]!=w[i+1]}}}
o.compact.sort_by{|w|[w.size,w.gsub(/[()]/,'')]}.uniq}

0

Perl 5、210

コードは、ソートされた配列に入力をロードし、配列内の1バイト長いすべての値に対して各値をチェックします。

map{@W=split//,$w=$_;map{@X=split//,$x=$_;if(@W+1==@X){$i=0;while($W[$i]eq$X[$i]&&$i<@W){$i++}$c=$X[$i];$e=substr($w,$i);print substr($w,0,$i)."($c)$e\n",if substr($x,$i+1)eq$e}}@D}@D=sort(map{s/[^\w]//g;lc}<>)

テスト

$ perl dictionairy_same_words.pl dictionairywords.txt
ca(r)t
in(p)lay
ma(r)
ma(t)
mar(t)
ma(r)t
(c)ode
ver(s)ify

0

Haskell、201バイト

import Data.List
import Data.Char
a#(b:c)=(a,b,c)
g a=[l++'(':m:')':n|x<-a,((l,m,n):_)<-[[o|o@(i,j,k)<-zipWith(#)(inits x)$init$tails x,elem(i++k)a]]]
f=sortOn length.g.map(filter isLetter.map toLower)

どの入力形式が許可されるかわかりません。f文字列のリストを取ります。単一の文字列(nlで区切られた単語)のみが許可されている場合、(+ 6バイト)に追加.linesfます。

使用例:

f ["cat","cart","code","golf","od-e","verify","versify","on","s-o-n","Scrapped","scraped"]

["(s)on","ca(r)t","(c)ode","ver(s)ify","scra(p)ped"]

仕組み:すべての単語を小文字にし、文字のみを保持します。すべての単語に分割x可能なすべての位置で2つの部分には、トリプル作る最初の部分であるが、第二部の最初の文字であり、第二部の尾です。単語リストにも表示されるトリプルを保持します。このリストが空でない場合、最初の要素を取得して呼び出します。周囲で必要な出力形式にすべてのそれらのリストのヘッドを回してとの間に置くと。(i,j,k)ijki++k(l,m,n)m()ln

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