【问题标题】:Reversing shell-style brace expansion反转 shell 式大括号扩展
【发布时间】:2018-10-17 18:31:50
【问题描述】:

Brace expansion 接受一个模式并扩展它。例如:

sp{el,il,al}l

扩展到:

spell spill spall

是否有一种算法(可能使用 JavaScript 实现)以最小化构造字符串的方式进行反向操作?

即,接受一个数组[spell spill spall]并返回一个字符串"sp{e,i,a}ll"

【问题讨论】:

  • 为什么不{spell,spill,spall}? {s}{p}{e,i,a}{l}{l} 呢{spe,spi,spa}{ll} 呢? sp{e,i,a}ll 呢?我认为识别字符串数组中的常见模式并使用这种外壳扩展形式搜索此类字符串中不常见模式的“最佳”(最佳方式?以什么方式?)表示,这是一个非常广泛的主题。你试过什么?
  • 好点,我已经更新了问题以指示最小的结果字符串作为优化目标。我目前尝试创建一个扩展器,然后在字符串中以相似的深度暴力破解字符组,但是运行时会随着更长的字符串爆炸。
  • 您可能可以创建a trie(是的,使用“i”)以更快地找到匹配的前缀。您也可以对反向字符串执行相同的操作,以更快地找到匹配的后缀。这将减少求职者的工作量。
  • 还应注意,花括号添加一个字符(左花括号),而花括号中的每个替代字符都会添加另一个字符(紧随其后的字符,逗号或右花括号)。这可用于查找结果的潜在部分的长度,而无需浪费时间创建一堆中间字符串并获取它们的长度。
  • 您接受的答案不适用于您在问题中提供的示例[spell spill spall]。

标签: arrays shell brace-expansion


【解决方案1】:

可以通过多种不同的方式来最小化生成的字符串,但是既然你提到了 Bash,我会选择不是最优化的 Bash 方式。

是的,有一种 Bash 方式! Bash 创建者已将其作为 readline 命令 complete-into-braces 包含在内。当以交互方式使用 Bash 时,如果您点击 Meta{(即 Alt{ 或 Esc-then-{ 在我的机器上),所有可能的完成都被分组到一个大括号扩展中。

$ echo /usr/
bin/     games/   include/ lib/     local/   sbin/    share/   src/  

$ echo /usr/{bin,games,include,l{ib,ocal},s{bin,hare,rc}}

在上面,我第一次点击 Tab 以显示所有可能的完成,第二次点击 Alt{。

回到您的问题:您正在寻找一种算法。显然你可以在Bash source code 中找到一些东西。你要找的函数是really_munge_braces() in bracecomp.c

【讨论】:

  • 太棒了!相当详尽的答案,并带有指向源代码的深思熟虑的链接。
  • @ElleFie 我忘了补充really_munge_braces()的第一个参数是一个排序的数组(它在调用函数hack_braces_completion()中排序)
【解决方案2】:

按照原始问题中的要求,node-brace-compression 包含一个 JavaScript 实现。例如

var compress = require('brace-compression');
var data = [
  'foo-1',
  'foo-2',
  'foo-3'
];

console.log(compress(data));
// => "foo-{1..3}"

【讨论】:

  • 仅适用于序列{m..n}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2021-09-01
相关资源
最近更新 更多