【问题标题】:How to check when sequence repeats in JavaScript?如何在 JavaScript 中检查序列何时重复?
【发布时间】:2021-06-22 14:56:33
【问题描述】:

我正在通过combining musical rhythms 生成一个序列。

基本上,绿色是声音,紫色是没有声音。它绕着轮子移动。在轮子的每个点上,我都会画一个数字(或字母)来表示轮子的旋转位置。

鉴于我在节拍的每一步都构建了一个数组(其中数组中的每个项目都是 3 位数字),一旦组合/节奏在这些节拍的组合中完全重复 ,我该如何判断 em>?

也就是说,我要查找3和4的组合(视觉中的1和2节拍)何时重复,以及3和5重复时,4和5重复,以及3、4和5一起重复全部重复。

一旦节拍重复,我想阻止数组增长。

也许我们可以预先计算所有内容,以便我们知道它何时重复,但即便如此,鉴于我们不一定知道何时重复,它又如何完成?

我想将此扩展到任意“节拍”和字母表。并以不同的方式进行操作,例如紫色 = 0 和绿色 = 1,我们绘制 101、111 等。

我想这里有两个问题。所以这篇文章的第一个问题是,我如何判断像上面这样的序列(渲染每个序列的索引)何时重复?不使用花哨的数学,例如说出这些的共同因素并从那里开始。因为这不适用于其他序列。基本上我只是想知道你什么时候可以说出整个“最终”序列的重复。

这是一个复制/修改的代码示例,用于演示如何生成序列。您可以从那里删除字符串输出或使用生成的数据作为某些算法的输入。

const alphabet = `abcdefghijklmnopqrstuvwxyz`.split('')

const baseDrum = {
  rhythm: [1, 0, 0],
  position: 2,
}

const hiHat = {
  rhythm: [1, 2, 2, 2],
  position: 3,
}

const flute = {
  rhythm: [1, 0, 1, 0, 0],
  position: 4,
}

const instruments = [flute, baseDrum, hiHat]

const update = () => {
  instruments.forEach(instrument => {
    if (instrument.position == instrument.rhythm.length - 1) {
      instrument.position = 0
    } else {
      instrument.position++
    }
  })
}

const sequence1 = []
const sequence2 = []
const sequence3 = []
const sequence4 = []
const sequence5 = []

function generate() {
  const numbers = [
    baseDrum.position + 1,
    hiHat.position + 1,
    flute.position + 1,
  ]

  const playNumbers = [
    baseDrum.rhythm[baseDrum.position],
    hiHat.rhythm[hiHat.position] - 1,
    flute.rhythm[flute.position],
  ]

  const lettersString = numbers.map(x => alphabet[x]).join('')
  const numbersString = numbers.join('')

  const playNumbersDigit = parseInt(playNumbers.join(''), 2)
  const playLettersString = alphabet[playNumbersDigit]
  const playNumbersString = playNumbers.join('')

  sequence1.push(lettersString)
  sequence2.push(numbersString)
  sequence3.push(playNumbersDigit)
  sequence4.push(playLettersString)
  sequence5.push(playNumbersString)
}

let i = 0

while (i++ < 100) {
  update()
  generate()
}

console.log(JSON.stringify({ sequence1, sequence2, sequence3, sequence4, sequence5 }, null, 2))

【问题讨论】:

  • 我们需要查看彩色圆点的数据表示,以展示如何识别数据对象/数组/结构中的模式。换句话说,请粘贴与此相关的代码
  • 我想您需要首先定义重复集的最小模式是什么 - 2 个连续值,3、40?
  • @Kinglish 我添加了一个生成器来根据应用程序的工作方式生成一些输出。
  • 那么,你想知道数组中的任何对象何时重复(意味着对象中的每个属性都是重复的)吗?
  • 要找出重复的步数,乘以各个循环的长度。要获得最小的联合循环大小,请找到最大公约数 (GCD),将所有循环长度除以该值,然后将结果相乘。从那里,您知道数组的最大大小,然后只需要填充它。在您的示例中,对于所有三个循环组合,GCD 为 1,最小循环大小为 60。

标签: javascript algorithm


【解决方案1】:

准系统字符串查找器是一种选择:

let out = JSON.stringify(output),
output = JSON.parse(out
          .substr(0, out
            .indexOf(
              JSON.stringify(output[0]),2
            )-1) + "]"
         );

折叠成一个活泼的小单衬:

output = JSON.parse(out.substr(0,out.indexOf(JSON.stringify(output[0]),2)-1)+"]") ;

包含一个效率较低的循环版本作为替代。我们只是循环遍历每个项目,将其转换为字符串,测试我们之前是否遇到过它,如果没有则存储它。一旦我们找到重复,我们就停下来。

const output = [{
    "lettersString": "bbb",
    "numbersString": "111",
    "playNumbersDigit": 5,
    "playLettersString": "f",
    "playNumbersString": "101"
  },
  {
    "lettersString": "ccc",
    "numbersString": "222",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "ddd",
    "numbersString": "333",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bee",
    "numbersString": "144",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cbf",
    "numbersString": "215",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "dcb",
    "numbersString": "321",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bdc",
    "numbersString": "132",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "ced",
    "numbersString": "243",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "dbe",
    "numbersString": "314",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "bcf",
    "numbersString": "125",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cdb",
    "numbersString": "231",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "dec",
    "numbersString": "342",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bbd",
    "numbersString": "113",
    "playNumbersDigit": 5,
    "playLettersString": "f",
    "playNumbersString": "101"
  },
  {
    "lettersString": "cce",
    "numbersString": "224",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "ddf",
    "numbersString": "335",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "beb",
    "numbersString": "141",
    "playNumbersDigit": 7,
    "playLettersString": "h",
    "playNumbersString": "111"
  },
  {
    "lettersString": "cbc",
    "numbersString": "212",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "dcd",
    "numbersString": "323",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bde",
    "numbersString": "134",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cef",
    "numbersString": "245",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "dbb",
    "numbersString": "311",
    "playNumbersDigit": 1,
    "playLettersString": "b",
    "playNumbersString": "001"
  },
  {
    "lettersString": "bcc",
    "numbersString": "122",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cdd",
    "numbersString": "233",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "dee",
    "numbersString": "344",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bbf",
    "numbersString": "115",
    "playNumbersDigit": 4,
    "playLettersString": "e",
    "playNumbersString": "100"
  },
  {
    "lettersString": "ccb",
    "numbersString": "221",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "ddc",
    "numbersString": "332",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bed",
    "numbersString": "143",
    "playNumbersDigit": 7,
    "playLettersString": "h",
    "playNumbersString": "111"
  },
  {
    "lettersString": "cbe",
    "numbersString": "214",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "dcf",
    "numbersString": "325",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bdb",
    "numbersString": "131",
    "playNumbersDigit": 7,
    "playLettersString": "h",
    "playNumbersString": "111"
  },
  {
    "lettersString": "cec",
    "numbersString": "242",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "dbd",
    "numbersString": "313",
    "playNumbersDigit": 1,
    "playLettersString": "b",
    "playNumbersString": "001"
  },
  {
    "lettersString": "bce",
    "numbersString": "124",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cdf",
    "numbersString": "235",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "deb",
    "numbersString": "341",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bbc",
    "numbersString": "112",
    "playNumbersDigit": 4,
    "playLettersString": "e",
    "playNumbersString": "100"
  },
  {
    "lettersString": "ccd",
    "numbersString": "223",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "dde",
    "numbersString": "334",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bef",
    "numbersString": "145",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cbb",
    "numbersString": "211",
    "playNumbersDigit": 1,
    "playLettersString": "b",
    "playNumbersString": "001"
  },
  {
    "lettersString": "dcc",
    "numbersString": "322",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bdd",
    "numbersString": "133",
    "playNumbersDigit": 7,
    "playLettersString": "h",
    "playNumbersString": "111"
  },
  {
    "lettersString": "cee",
    "numbersString": "244",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "dbf",
    "numbersString": "315",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "bcb",
    "numbersString": "121",
    "playNumbersDigit": 7,
    "playLettersString": "h",
    "playNumbersString": "111"
  },
  {
    "lettersString": "cdc",
    "numbersString": "232",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "ded",
    "numbersString": "343",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bbe",
    "numbersString": "114",
    "playNumbersDigit": 4,
    "playLettersString": "e",
    "playNumbersString": "100"
  },
  {
    "lettersString": "ccf",
    "numbersString": "225",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "ddb",
    "numbersString": "331",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bec",
    "numbersString": "142",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cbd",
    "numbersString": "213",
    "playNumbersDigit": 1,
    "playLettersString": "b",
    "playNumbersString": "001"
  },
  {
    "lettersString": "dce",
    "numbersString": "324",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bdf",
    "numbersString": "135",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "ceb",
    "numbersString": "241",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "dbc",
    "numbersString": "312",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "bcd",
    "numbersString": "123",
    "playNumbersDigit": 7,
    "playLettersString": "h",
    "playNumbersString": "111"
  },
  {
    "lettersString": "cde",
    "numbersString": "234",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "def",
    "numbersString": "345",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bbb",
    "numbersString": "111",
    "playNumbersDigit": 5,
    "playLettersString": "f",
    "playNumbersString": "101"
  },
  {
    "lettersString": "ccc",
    "numbersString": "222",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "ddd",
    "numbersString": "333",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bee",
    "numbersString": "144",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cbf",
    "numbersString": "215",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "dcb",
    "numbersString": "321",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bdc",
    "numbersString": "132",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "ced",
    "numbersString": "243",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "dbe",
    "numbersString": "314",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "bcf",
    "numbersString": "125",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cdb",
    "numbersString": "231",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "dec",
    "numbersString": "342",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bbd",
    "numbersString": "113",
    "playNumbersDigit": 5,
    "playLettersString": "f",
    "playNumbersString": "101"
  },
  {
    "lettersString": "cce",
    "numbersString": "224",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "ddf",
    "numbersString": "335",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "beb",
    "numbersString": "141",
    "playNumbersDigit": 7,
    "playLettersString": "h",
    "playNumbersString": "111"
  },
  {
    "lettersString": "cbc",
    "numbersString": "212",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "dcd",
    "numbersString": "323",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bde",
    "numbersString": "134",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cef",
    "numbersString": "245",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "dbb",
    "numbersString": "311",
    "playNumbersDigit": 1,
    "playLettersString": "b",
    "playNumbersString": "001"
  },
  {
    "lettersString": "bcc",
    "numbersString": "122",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cdd",
    "numbersString": "233",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "dee",
    "numbersString": "344",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bbf",
    "numbersString": "115",
    "playNumbersDigit": 4,
    "playLettersString": "e",
    "playNumbersString": "100"
  },
  {
    "lettersString": "ccb",
    "numbersString": "221",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "ddc",
    "numbersString": "332",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bed",
    "numbersString": "143",
    "playNumbersDigit": 7,
    "playLettersString": "h",
    "playNumbersString": "111"
  },
  {
    "lettersString": "cbe",
    "numbersString": "214",
    "playNumbersDigit": 0,
    "playLettersString": "a",
    "playNumbersString": "000"
  },
  {
    "lettersString": "dcf",
    "numbersString": "325",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bdb",
    "numbersString": "131",
    "playNumbersDigit": 7,
    "playLettersString": "h",
    "playNumbersString": "111"
  },
  {
    "lettersString": "cec",
    "numbersString": "242",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "dbd",
    "numbersString": "313",
    "playNumbersDigit": 1,
    "playLettersString": "b",
    "playNumbersString": "001"
  },
  {
    "lettersString": "bce",
    "numbersString": "124",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  },
  {
    "lettersString": "cdf",
    "numbersString": "235",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "deb",
    "numbersString": "341",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "bbc",
    "numbersString": "112",
    "playNumbersDigit": 4,
    "playLettersString": "e",
    "playNumbersString": "100"
  },
  {
    "lettersString": "ccd",
    "numbersString": "223",
    "playNumbersDigit": 3,
    "playLettersString": "d",
    "playNumbersString": "011"
  },
  {
    "lettersString": "dde",
    "numbersString": "334",
    "playNumbersDigit": 2,
    "playLettersString": "c",
    "playNumbersString": "010"
  },
  {
    "lettersString": "bef",
    "numbersString": "145",
    "playNumbersDigit": 6,
    "playLettersString": "g",
    "playNumbersString": "110"
  }
]

// here's a raw string method
let out = JSON.stringify(output),
  soutput = JSON.parse(out.substr(0, out.indexOf(JSON.stringify(output[0]), 2) - 1) + "]");
console.log(soutput.length, soutput);

// here's a loop method

let ctr = 0,
  rep = false;
let pattern = output.map(o => JSON.stringify(o)).reduce((b, a, i) => {
  if (!rep && b.includes(a)) {
    rep = true;
    ctr = i;
  } else if (!rep) b.push(a)
  return b
}, []).map(o => JSON.parse(o));

console.log('output length', output.length, '/pattern length:', pattern.length, '/pattern:', pattern)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-04
    • 2015-03-02
    • 2019-03-17
    • 2013-07-30
    • 2017-11-26
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多