首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ode字母删除

Ode字母删除
EN

Code Golf用户
提问于 2015-09-28 06:37:22
回答 3查看 708关注 0票数 17

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

例如,输入

代码语言:javascript
复制
cat
cart
code
golf
ode
verify
versify

给出的输出

代码语言:javascript
复制
ca(r)t
(c)ode
ver(s)ify

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

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

代码语言:javascript
复制
mart
mar
mat
ma

应该有一个输出

代码语言:javascript
复制
ma(r)
ma(t)
ma(r)t
mar(t)

后两者都可能是按顺序排列的。

字典文件可能包括大写、空格、连字符或撇号;这些应该被忽略。例如,

代码语言:javascript
复制
inlay 
in-play

应该产生in(p)lay。您的输出应该都在相同的情况下。允许额外的空白。

输入可以是STDIN,也可以是文件;它由换行符分隔。输出可以是函数或STDOUT的返回值(如果需要,也可以写入文件)。

这是密码-高尔夫,所以以字节为单位的最短代码获胜。

(这是我对PPCG的第一次挑战--如果我做错了什么,请告诉我,我会解决的。)

EN

回答 3

Code Golf用户

发布于 2015-09-28 09:29:22

JavaScript (ES6),225号

一个带有字符串参数的函数,没有来自文件的输入。我问OP这是否有效。

测试在符合EcmaScript 6的浏览器中运行代码片段(实现箭头函数、模板字符串、扩展操作符- Firefox,可能是Safari或MS,而不是Chrome)

代码语言:javascript
复制
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) }
代码语言:javascript
复制
textarea { height: 20em }
代码语言:javascript
复制
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>
票数 5
EN

Code Golf用户

发布于 2015-09-28 08:31:30

Ruby,173

代码语言:javascript
复制
->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

票数 3
EN

Code Golf用户

发布于 2015-09-28 14:51:31

Ruby,211

我决定采用不同的方法来解决这个问题,使用regex。

代码语言:javascript
复制
->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}
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/58859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档