Javascript 生成字符串的所有协和音

Javascript 生成字符串的所有协和音,javascript,algorithm,Javascript,Algorithm,我想生成给定字符串的所有协和音 协和是通过重复来识别的一种文体文学手段 指相邻单词中相同或相似的辅音,其元音 声音是不同的。() A是字母表中表示辅音的字母。 下表吸收了英语辅音组,采用以下便利条件使事情变得简单(ISIC): 它忽略了图(“sh”、“ch”、“th”等) 它忽略元音 它忽略了“h”、“y”、“w”、“x” 它假设一个给定的字母只能是一个辅音组的成员。因此,“c”是(随机)与“s”和“z”放在一起的,“g”与“j”放在一起的 我们还假设一个符合案例2和3的输入是允许的,应该忽略。

我想生成给定字符串的所有协和音

协和是通过重复来识别的一种文体文学手段 指相邻单词中相同或相似的辅音,其元音 声音是不同的。()

A是字母表中表示辅音的字母。 下表吸收了英语辅音组,采用以下便利条件使事情变得简单(ISIC):

  • 它忽略了图(“sh”、“ch”、“th”等)
  • 它忽略元音
  • 它忽略了“h”、“y”、“w”、“x”
  • 它假设一个给定的字母只能是一个辅音组的成员。因此,“c”是(随机)与“s”和“z”放在一起的,“g”与“j”放在一起的 我们还假设一个符合案例2和3的输入是允许的,应该忽略。但是,如果输入符合案例1或违反案例4,则输入无效(参见下面的示例)

    因此:

    例如,给定字符串“jedi”,输出应为:

    var consonances = ["gedi", "jeti", "geti"]
    
    注意,“e”和“i”——誓言(案例2)——可以作为输入

    其他一些例子:

    "btb"       --> ["ptb", "pdb", "pdp", "bdb", "bdp", "btp", "ptp"]
    "star"      --> ["ctar", "ztar", "sdar", "cdar", "zdar"]
    
    无效输入:

  • 图:
    “show”、“chair”、“high”、“the”
  • 破案4:
    “当然”、“猫”、“好”
  • 我在试图找到接近它的方法时遇到了麻烦。我讨论了排列问题,因为我想它们可能与这里有关,但我不知道如何在这里应用这样的解决方案

    我需要一个算法,但是一个完整的代码解决方案当然很好。 我将在这里添加我目前剩下的内容(JS代码):


    我建议在地图中组织相关辅音:

    var consonants = {
      "b": "p",
      "p": "b",
      "c": "sz",
      "s": "cz",
      "z": "cs",
      "d": "t",
      "t": "d",
      "f": "v",
      "v": "f",
      "g": "j",
      "j": "g",
      "k": "q",
      "q": "k", 
    ]; 
    
    现在可以逐字符迭代字符串。如果你在地图中遇到一个字符,考虑在POS中插入的映射字符串中的每个字符的改变的单词(除了你所做的不变的递归)。伪代码:

    function generate(word, pos) {
       if (pos == word.length) {
         console.log(word);
         return;
       }
       generate(word, pos + 1);
       mapped = consonants[word.charAt(pos)];
       if (mapped != null) {
         var prefix = word.substring(0, pos);
         var suffix = word.substring(pos + 2);
         for (var i = 0; i < mapped.length; i++) {
           var changed =  prefix + mapped.charAt(i) + suffix; 
           geneate(changed, pos + 1);
         }
       }
     }
    
    函数生成(word、pos){
    if(pos==字长){
    console.log(word);
    返回;
    }
    生成(word,pos+1);
    映射=辅音[word.charAt(pos)];
    如果(映射!=null){
    变量前缀=字。子字符串(0,位置);
    变量后缀=单词子字符串(位置+2);
    对于(变量i=0;i
    我可以给你一个简单的算法,如何在python中使用递归算法来实现

    import itertools
    
    consonants = [['b', 'p'],
        ['c', 's', 'z'],
        ['d', 't'],
        ['f', 'v'],
        ['g', 'j'],
        ['k', 'q']]
    
    # Create a map to indicate which group can the letter be found in
    sound = {} # These are actually index of groups for letters
    for i,a_group in enumerate(consonants):
        for letter in a_group:
            sound[letter] = i # b, p have the sound 0, c,s,z have sound 1 etc
    
    def getConsonantsRec(c, options):
        if len(c) > 0:
            if c[0] in sound:
                options.append(consonants[sound[c[0]]]) # Add all letters as the option at this place
            else:
                options.append([c[0]]) #Only this letter at this place
            getConsonantsRec(c[1:],options) #Make string shorter each call
        return
    
    def getConsonants(c):
        options = []
        getConsonantsRec(c,options)
        return [x for x in itertools.product(*options)] #Generate the combinations from the options at each place
    
    allConsonants = getConsonants('star')
    print(allConsonants)
    
    输出:

    [('c', 'd', 'a', 'r'), ('c', 't', 'a', 'r'), ('s', 'd', 'a', 'r'), ('s', 't', 'a', 'r'), ('z', 'd', 'a', 'r'), ('z', 't', 'a', 'r')]
    

    现在,您可以通过添加对对角线、元音等的检查来进一步增强这一点。

    其他解决方案帮助我省钱:这是一个简单的笛卡尔积问题。拿着适合你需要的东西,你就完成了。例如:

    console.log(…getConsonances('stars').map(con=>con.join(“”));
    函数getConsonances(s){
    让辅音=[];
    设idx=0;
    s、 拆分('').forEach((c)=>{
    const curconsonates=getconsonates(c);
    if(辅音长度){
    辅音组合。按(辅音组合);
    idx++;
    }否则{
    让notConsonant=[combconsonats[idx]?combconsonats[idx]:[],c]。连接(“”);
    组合辅音。拼接(idx,1,[非辅音]);
    }
    }); 
    返回cartesianProduct(组合辅音);
    }
    辅音函数(c){
    常量辅音=[
    ['b','p'],
    [c',s',z'],
    ['d','t'],
    ['f','v'],
    ['g','j'],
    [k','q']
    ]; 
    设辅音=[];
    辅音。每((组)=>{
    if(包括(c)类){
    辅音组;
    };
    return!curconsonates.length;
    });
    返回辅音;
    }
    功能卡特尔产品(arr){
    返回arr.reduce((a,b)=>
    a、 map(x=>b.map(y=>x.concat(y)))
    .reduce((a,b)=>a.concat(b),[],[]);
    }
    import itertools
    
    consonants = [['b', 'p'],
        ['c', 's', 'z'],
        ['d', 't'],
        ['f', 'v'],
        ['g', 'j'],
        ['k', 'q']]
    
    # Create a map to indicate which group can the letter be found in
    sound = {} # These are actually index of groups for letters
    for i,a_group in enumerate(consonants):
        for letter in a_group:
            sound[letter] = i # b, p have the sound 0, c,s,z have sound 1 etc
    
    def getConsonantsRec(c, options):
        if len(c) > 0:
            if c[0] in sound:
                options.append(consonants[sound[c[0]]]) # Add all letters as the option at this place
            else:
                options.append([c[0]]) #Only this letter at this place
            getConsonantsRec(c[1:],options) #Make string shorter each call
        return
    
    def getConsonants(c):
        options = []
        getConsonantsRec(c,options)
        return [x for x in itertools.product(*options)] #Generate the combinations from the options at each place
    
    allConsonants = getConsonants('star')
    print(allConsonants)
    
    [('c', 'd', 'a', 'r'), ('c', 't', 'a', 'r'), ('s', 'd', 'a', 'r'), ('s', 't', 'a', 'r'), ('z', 'd', 'a', 'r'), ('z', 't', 'a', 'r')]