颂高尔夫-信件删除


17

给定一个字典文件(一个文本文件,每行包含一个单词或短语,可能带有标点符号,但不带数字;行均按字母顺序排列),您必须输出单词的每种组合,其中一个单词可以从一个单词中删除以换成另一个;删除的字母应放在括号中。

例如,输入

cat
cart
code
golf
ode
verify
versify

应该输出

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

获得同一对的多种方法只能显示一次。您可以输出scra(p)pedscrap(p)ed,但不能两者都输出。

输出应按较长的条目按字母顺序排序

mart
mar
mat
ma

应该有一个输出

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

而后两个可以是任意顺序。

词典文件可以包含大写字母,空格,连字符或撇号;这些应该被忽略。例如,

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

在第一个示例中,单词golf不在输出中。那是因为这个词没有其他组合吗?
LukStorms

@Luk:是的!对于大多数词典文件,将有很多单词根本不构成其他单词-这些单词不应出现在输出中的任何位置。
Deusovi

2
允许具有(大)字符串参数的函数将请求的输出作为字符串数组返回怎么办?这将重点放在算法上,从而无需管理文件I / O。
edc65

Answers:


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是存储在数组中的字典,由运行时标志magic提供。(b-ost,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,也许是Safari或MS Edge,而不是Chrome)

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 right,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这种情况无法正常工作。我现在正在修复...
Cristian Lupascu 2015年

@Deusovi更新!
克里斯蒂安·卢帕斯库

该答案无法为['jacklantern','jackslantern','jack-o-lantern']dict 提供正确的输出。
14mRh4X0r 2015年

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个分隔的单词),请添加.linesf(+6个字节)。

用法示例:

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分成两个部分在每一个可能的位置和使三元组(i,j,k),其中i是第一部分,j是所述第二部分的第一字符和k是第二部分的尾部。保持三元组在i++k单词列表中也出现的位置。如果此列表为非空列表,则采用第一个元素,将其命名为(l,m,n)。通过周围将所有这些表头到所需的输出格式m()并把它之间ln

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.