2016-05-13 43 views
1

我在写测验的提示系统。提示将是答案的变体。为了使字谜更容易,我保留第一个和最后一个字母相同。如何生成易于保存标点符号的字典?

var _ = require('underscore'); 

var easy = function(s) { 
    if (s.length <= 1) { 
     return s; 
    } 
    return s[0] + _.shuffle(s.slice(1, -1)).join("") + s.slice(-1); 
}; 

对于多个单词的答案,我想分开每个单词的字谜。我写道:

var peasy = function(s) { 
    return s.split(/\W/).map(easy).join(" "); 
} 

但是,这会在答案中丢失任何标点符号(用空格替换它)。我想将标点符号保留在原来的位置。我怎样才能做到这一点?

这里有三个例子来测试:

console.log(peasy("mashed potatoes")); 
console.log(peasy("computer-aided design")); 
console.log(peasy("sophie's choice")); 

My功能peasy以上失败第二和第三例子,因为它失去连字符和撇号。

+1

你'easy'函数可以返回's'如果'(s.length <= 3)'。通过保留第一个和最后一个字符,只有长度大于3的字符串真的被洗牌... – ericbn

回答

4

通过拆分单词分隔符的伎俩:

var peasy = function(s) { 
    return s.split(/\b/).map(easy).join(""); 
} 

说明: "computer-aided design".split(/\b/)结果["computer", "-", "aided", " ", "design"]。然后,你得洗每个元素与easy加入他们,越来越像"ctemopur-adeid diegsn"回来......

+0

谢谢你的工作 –

2

它更简单易用String.prototype.replace,而不是分裂的:

  • 你不需要后的第一个切片和在最后一封信之前。
  • 替换只发生在单词字符上(其他字符保持不变)
  • 跳过少于4个字符的单词。
  • 它更短,不需要easy功能。
var _ = require('underscore'); 

var peasy = function(s) { 
    return s.replace(/\B\w{2,}\B/g, function (m) { 
     return _.shuffle(m).join(''); 
    }); 
}