This repository has been archived by the owner on Mar 14, 2020. It is now read-only.
/
hrx.go
93 lines (82 loc) · 1.76 KB
/
hrx.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package hrx
import (
"github.com/melias122/engine/engine"
)
// Maximalny pocet riadkov nez nastane udalost 101.
const max101 = 19
type Hrx struct {
*Cislo
n, m int
cache *hCache
Uc engine.Uc
}
func NewHrx(n, m int) *Hrx {
cache := newHCache(n, m)
return &Hrx{
Cislo: newCislo(cache, n, m),
n: n,
m: m,
cache: cache,
}
}
func (h *Hrx) Add(kombs []engine.Kombinacia) {
var (
is101 = make(map[int]bool)
)
for _, k := range kombs {
for _, c := range k {
is101[c] = true
}
if len(is101) == h.m {
break
}
}
// Ak sa v hhrx vyskytli vsetky cisla 1..m
// nastala udalost 101
if len(is101) == h.m {
var reverse bool
if h.Uc.Cislo == 0 {
reverse = true
} else {
last := kombs[len(kombs)-1]
for _, num := range last {
// Ak na riadku narazime na Uc Cislo
// porebujeme ho spatne dohladat
if num == h.Uc.Cislo {
reverse = true
}
}
if !reverse {
h.Cislo.add(last)
}
}
// Uc cislo je 0 len raz po udalosti 101.
// Spatne dohladanie Uc cisla a riadku a inrementovanie cisiel Roddo
if reverse {
// Nova hrx zostava a resetovanie cisiel Roddo
h.Cislo = newCislo(h.cache, h.n, h.m)
is101 := make(map[int]bool)
newUc := engine.Uc{Riadok: len(kombs)}
// Spatne nacitava kombinacie a incremtuje Roddo
// a Hrx az pokial nenastane udalost 101
// udalost 101 nastava ked sa kazde cislo vyskytne aspon 1
for len(is101) < h.m {
newUc.Riadok--
k := kombs[newUc.Riadok]
h.Cislo.add(k)
for _, num := range k {
is101[num] = true
if len(is101) == h.m {
newUc.Cislo = num
break
}
}
}
// Nastavenie noveho Uc cisla a riadku pre archiv
h.Uc = newUc
}
}
}
func (h *Hrx) X(k engine.Kombinacia) float64 {
return h.Cislo.x(max101, k)
}