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。 可以看到的是最简单的模式。
模式至少以三个0或三个1s开头,但每个可能更多,但不能混合!
然后,根据第一个模式中出现的内容,第一个模式后接至少五个0或五个1。由于模式一包含三个0,因此必须至少有五个1,反之亦然
然后,我们想再次看到第一个模式。至少要有3个0或3个1s,再次取决于惠特尔,之前还有1个或0s
最后,我们想再次看到第二个模式,这意味着至少要五个五个0或五个1,这取决于之前看到的是哪个模式
我尝试使用for循环和计数器,但没有设法解决。困扰我的事实是,模式的大小不是固定的,因为连续有三个或五个以上的0和1。
有人能够提供一些伪代码如何实现此代码甚至MQL5代码吗?
答案 0 :(得分:0)
以下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)