【问题标题】:Pattern recognition in binary numbers (pseudo code or MQL5)二进制数的模式识别(伪代码或 MQL5)
【发布时间】:2019-06-29 09:51:58
【问题描述】:
0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17 
.  .  1  1  1  1  1  0  0  0  1   1   1   1   1   0   0   0

识别从 17 开始,然后倒退到 0。 可以看到的是最简单的模式。

  1. 模式以至少三个 0 或三个 1 开头,但每个可能更多,但不能混合!

  2. 根据第一个模式中出现的内容,第一个模式之后至少有五个 0 或五个 1。由于模式一包含三个 0,因此必须至少有五个 1,反之亦然

  3. 然后我们想再次查看第一个模式。同样,至少三个 0 或三个 1,这取决于之前是否有 1 或 0

  4. 最后我们想再次看到第二个模式,这意味着至少有五个 0 或五个 1,这取决于之前看到的模式

我尝试使用 for 循环和计数器,但没有成功。令我苦恼的是,该模式不是固定大小的,因为连续的 0 和 1 可能超过三个或五个。

是否有人能够提供一些伪代码如何实现这个甚至是一些 MQL5 代码?

【问题讨论】:

  • 如果你“想再次看到第一个模式”,这是否意味着它必须有相同数量的 0 和 1,就像第一次一样,或者只是“至少三个 0 或三个 1”,独立第一次有多少(第二次模式类似)。
  • 你好!谢谢你的问题。只是“至少三个或更多”,例如17 到 15 可以是 0 0 0 然后 1 1 1 1 1 然后 0 0 0 0 0 然后 1 1 1 1 1

标签: pseudocode mql5


【解决方案1】:

以下 Swift 代码并非最佳。它应该只是为您提供如何实现它的提示。

匹配单个模式的函数:

func matchPattern(numbers: [Int], startIndex: Int, number: Int) -> Int {
    var actualIndex = startIndex
    while numbers[actualIndex] == number && actualIndex > 0 {
        actualIndex = actualIndex - 1
    }
    return startIndex - actualIndex
}  

匹配4个模式的函数:

        func match(binNrs: [Int]) -> Bool {
            let firstPatternNr = binNrs[17]
            let secondPatternNr = firstPatternNr == 0 ? 1 : 0
            let pattern1Length = matchPattern(numbers: binNrs, 
                                             startIndex: 17, 
                                             number: firstPatternNr)
            if pattern1Length < 3 { return false }
            let pattern2Length = matchPattern(numbers: binNrs, 
                                              startIndex: 17 - pattern1Length, 
                                              number: secondPatternNr)
            if pattern2Length < 5 { return false }
            let pattern3Length = matchPattern(numbers: binNrs, 
                                              startIndex: 17 - pattern1Length - pattern2Length,
                                              number: firstPatternNr)
            if pattern3Length < 3 { return false }
            let pattern4Length = matchPattern(numbers: binNrs, 
                                              startIndex: 17 - pattern1Length - pattern2Length - pattern3Length, 
                                              number: secondPatternNr)
            return pattern4Length >= 5
        }  

一些带有结果的测试模式:

let match1 = match(binNrs: [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0]) // true
let match2 = match(binNrs: [1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]) // false (4th sequence < 5)
let match3 = match(binNrs: [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0]) // false (1st sequence < 3)
let match4 = match(binNrs: [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1]) // false (2nd sequence < 5)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 2015-01-26
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多