假设你有一个句子:
this is a very long sentence with several words of no significance它只包含26个小写字母和空格。
你有一本字典,每个单词都包含26个小写字母的任意数目,而没有别的:
henge
renton然后,除其他外,输出应包括:
因此,输出的每一行都是原来的句子,但是如果只取一行的大写字母,它们就会形成一个字典词。程序应该找到所有可能的这样的行。
发布于 2020-07-20 05:34:10
k=((e,r)=>{for(o=[],e=[...e],r=[...r],w=r.reduce((r,h,n)=>!(r[n]=e.map((e,r)=>h==e?r:"").filter(Number))||r,[]),[z]=w,h=[],x=0;x<w.reduce((e,r)=>e*=r.length||e,1);x++)z.forEach((e,r)=>{for(g=[z[r]],j=1;j<w.length;j++)for(n=w[j],y=0;y<n.length;y++)if(g.slice(-1)[0]<n[y]&&!h.some(e=>e.toString()==[...g,n[y]].toString())){g.push(n[y]);break}h.push(g)});return h.filter(e=>e.length==w.length).forEach(r=>{d=[...e],r.forEach(e=>d[e]=d[e].toUpperCase()),o.push(d.join(""))}),o})k=((e,r)=>{for(o=[],e=[...e],r=[...r],w=r.reduce((r,h,n)=>!(r[n]=e.map((e,r)=>h==e?r:"").filter(Number))||r,[]),[z]=w,h=[],x=0;x<w.reduce((e,r)=>e*=r.length||e,1);x++)z.forEach((e,r)=>{for(g=[z[r]],j=1;j<w.length;j++)for(n=w[j],y=0;y<n.length;y++)if(g.slice(-1)[0]<n[y]&&!h.some(e=>e.toString()==[...g,n[y]].toString())){g.push(n[y]);break}h.push(g)});return h.filter(e=>e.length==w.length).forEach(r=>{d=[...e],r.forEach(e=>d[e]=d[e].toUpperCase()),o.push(d.join(""))}),o})
console.log(k('this is a very long sentence with several words of no significance', 'henge'));对于单词中的每个字母,都会构造一系列索引,这些索引对应于句子中该字母的每个位置。
然后,在一个由4个for循环组成的嵌套中,计算从第一个数组到最后一个数组的每一条可能的路径,其中每个步骤在下一个数组中被转换成一个数值更大的元素。
这会产生一个路径数组,其长度等于最大可能的路径,这是将每个字母索引数组的长度乘以的乘积(这个数字随着单词长度的增加很快就会变大)。
然后,所有长度小于单词的路径都被排除在外,因为它们无法在每个数组之间找到有效的步骤。
您可以在这堆栈溢出答案中看到无限制的逻辑。
我对这一行(尽管这是我的代码)感到困惑,它的目的是在向当前路径添加一个步骤之前检查现有路径,以确保它构造一个唯一的路径:
if (!paths.some(p => p.toString() == [...path, arrays[j][y]].toString())) {
path.push(arrays[j][y]);
break;
}在我看来,这应该错误地阻止多条路径的构建,这些路径共享任何初始步骤。但它实际上是按预期工作的。所以我很困惑。
发布于 2020-07-20 07:32:51
a=lambda c,w:(([c[0]+k for k in a(c[1:],w)]+([c[0].upper()+k for k in a(c[1:],w[1:])]if c[0]==w[0]else[]))if c else[])if w else[c]
lambda c,d:sum((a(c,w)for w in d),[])将句子作为字符串输入,字典作为字符串列表。使用递归帮助函数a(c,w)一次计算字典中每个单词的输出,然后将列表相加以获得最终输出。助手函数一次遍历句子/单词一个字符,有几种情况:
a(c[1:],w)相同的结果,并在每个结果中加上c[0]。a(c[1:],w[1:])之外,每个结果都有c[0].upper()。在helper方法中肯定有一些字节的节省;我对内联if-expressions周围的括号并不是非常小心(而且优先级有点混乱) --我明天可能会仔细看一看,看看是否可以刮掉几个字节。
https://codegolf.stackexchange.com/questions/203388
复制相似问题