Skip to content

Commit aa824bb

Browse files
committed
feat(2020-19/angch): Moar hack
1 parent b57298f commit aa824bb

3 files changed

Lines changed: 345 additions & 0 deletions

File tree

2020-19/angch/main.go

Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"log"
7+
"os"
8+
"regexp"
9+
"strconv"
10+
"strings"
11+
)
12+
13+
type Rule struct {
14+
Subrules [][]int
15+
Literal string
16+
}
17+
18+
func match(l string, rules []Rule, ii []int) bool {
19+
for _, i := range ii {
20+
r := rules[i]
21+
22+
if r.Literal != "" {
23+
if l[0] == r.Literal[0] {
24+
l = l[1:]
25+
continue
26+
} else {
27+
return false
28+
}
29+
}
30+
31+
// for subrule := r.Subrules {
32+
33+
// }
34+
35+
}
36+
return true
37+
}
38+
39+
var rules_ = map[int]Rule{}
40+
var rulesMap = map[int]string{}
41+
42+
func compile(i int) string {
43+
// regex := ""
44+
r, ok := rulesMap[i]
45+
if ok {
46+
return r
47+
}
48+
49+
if rules_[i].Literal != "" {
50+
rulesMap[i] = rules_[i].Literal
51+
return rules_[i].Literal
52+
}
53+
subrules := make([]string, 0)
54+
55+
hasPlus := false
56+
57+
a:
58+
for _, v := range rules_[i].Subrules {
59+
subsubrules := make([]string, 0)
60+
for _, v2 := range v {
61+
if v2 == i {
62+
hasPlus = true
63+
break a
64+
}
65+
subsubrule := compile(v2)
66+
subsubrules = append(subsubrules, subsubrule)
67+
}
68+
subrule := "(" + strings.Join(subsubrules, "") + ")"
69+
subrules = append(subrules, subrule)
70+
}
71+
r = "(" + strings.Join(subrules, "|") + ")"
72+
73+
if hasPlus {
74+
// subrules = make([]string, 0)
75+
// for k, v := range rules_[i].Subrules {
76+
// if k == len(rules_[i].Subrules)-1 {
77+
// break
78+
// }
79+
// for _, v2 := range v {
80+
// subrule := "(" + compile(v2) + ")+"
81+
// subrules = append(subrules, subrule)
82+
// }
83+
// }
84+
// r = "(" + strings.Join(subrules, "") + ")"
85+
if i == 8 {
86+
r = "(" + compile(42) + "+" + ")"
87+
}
88+
if i == 11 {
89+
r42 := compile(42)
90+
r31 := compile(31)
91+
92+
r2 := "(" + r42 + "" + r31 + ")"
93+
// r2 := ""
94+
for k := 2; k < 10; k++ {
95+
r2 = fmt.Sprintf("(%s|(%s{%d}%s{%d}))", r2, r42, k, r31, k)
96+
}
97+
r = r2
98+
}
99+
}
100+
101+
rulesMap[i] = r
102+
return r
103+
}
104+
105+
func do(fileName string) (ret1 int, ret2 int) {
106+
file, err := os.Open(fileName)
107+
if err != nil {
108+
log.Fatal(err)
109+
}
110+
defer file.Close()
111+
scanner := bufio.NewScanner(file)
112+
113+
rules := make(map[int]Rule, 0)
114+
// input := make([]string, 0)
115+
for scanner.Scan() {
116+
l := scanner.Text()
117+
_ = l
118+
119+
if l == "" {
120+
break
121+
}
122+
rule := strings.Split(l, ":")
123+
r := rule[1]
124+
ruleNStr := rule[0]
125+
ruleN, _ := strconv.Atoi(ruleNStr)
126+
r = r[1:]
127+
128+
myrule := Rule{}
129+
if r[0] == '"' {
130+
myrule.Literal = r[1 : len(r)-1]
131+
} else {
132+
subs := strings.Split(r, "|")
133+
r0 := make([][]int, 0)
134+
for _, sub := range subs {
135+
r2 := strings.Split(sub, " ")
136+
137+
r3 := make([]int, 0)
138+
for _, r4 := range r2 {
139+
a, err := strconv.Atoi(r4)
140+
if err != nil {
141+
continue
142+
}
143+
r3 = append(r3, a)
144+
}
145+
r0 = append(r0, r3)
146+
}
147+
myrule.Subrules = r0
148+
}
149+
rules[ruleN] = myrule
150+
// rules = append(rules, myrule)
151+
}
152+
log.Printf("%+v\n", rules)
153+
rules_ = rules
154+
rule := "^" + compile(0) + "$"
155+
log.Println(rule)
156+
re := regexp.MustCompile(rule)
157+
158+
// input := make([]string, 0)
159+
count := 0
160+
for scanner.Scan() {
161+
l := scanner.Text()
162+
_ = l
163+
164+
if l == "" {
165+
break
166+
}
167+
m := re.MatchString(l)
168+
log.Println(l, m)
169+
// input = append(input, l)
170+
if m {
171+
count++
172+
}
173+
}
174+
ret1 = count
175+
//
176+
// log.Println(input)
177+
178+
return ret1, ret2
179+
}
180+
181+
func do2(fileName string) (ret1 int, ret2 int) {
182+
file, err := os.Open(fileName)
183+
if err != nil {
184+
log.Fatal(err)
185+
}
186+
defer file.Close()
187+
scanner := bufio.NewScanner(file)
188+
189+
rules := make(map[int]Rule, 0)
190+
// input := make([]string, 0)
191+
for scanner.Scan() {
192+
l := scanner.Text()
193+
_ = l
194+
195+
if l == "" {
196+
break
197+
}
198+
rule := strings.Split(l, ":")
199+
r := rule[1]
200+
ruleNStr := rule[0]
201+
ruleN, _ := strconv.Atoi(ruleNStr)
202+
r = r[1:]
203+
204+
myrule := Rule{}
205+
if r[0] == '"' {
206+
myrule.Literal = r[1 : len(r)-1]
207+
} else {
208+
subs := strings.Split(r, "|")
209+
r0 := make([][]int, 0)
210+
for _, sub := range subs {
211+
r2 := strings.Split(sub, " ")
212+
213+
r3 := make([]int, 0)
214+
for _, r4 := range r2 {
215+
a, err := strconv.Atoi(r4)
216+
if err != nil {
217+
continue
218+
}
219+
r3 = append(r3, a)
220+
}
221+
r0 = append(r0, r3)
222+
}
223+
myrule.Subrules = r0
224+
}
225+
rules[ruleN] = myrule
226+
// rules = append(rules, myrule)
227+
}
228+
229+
rules[8] = Rule{
230+
Subrules: [][]int{{42}, {42, 8}},
231+
}
232+
rules[11] = Rule{
233+
Subrules: [][]int{{42, 31}, {42, 11, 31}},
234+
}
235+
// 8: 42 | 42 8
236+
// 11: 42 31 | 42 11 31
237+
238+
log.Printf("%+v\n", rules)
239+
rules_ = rules
240+
rule := "^" + compile(0) + "$"
241+
log.Println(rule)
242+
re := regexp.MustCompile(rule)
243+
244+
// input := make([]string, 0)
245+
count := 0
246+
for scanner.Scan() {
247+
l := scanner.Text()
248+
_ = l
249+
250+
if l == "" {
251+
break
252+
}
253+
m := re.MatchString(l)
254+
log.Println(l, m)
255+
// input = append(input, l)
256+
if m {
257+
count++
258+
}
259+
}
260+
ret1 = count
261+
//
262+
// log.Println(input)
263+
264+
return ret1, ret2
265+
}
266+
267+
func main() {
268+
// log.Println(do("test.txt"))
269+
// log.Println(do2("test2.txt"))
270+
// log.Println(do2("test2.txt"))
271+
// log.Println(do2("test3.txt"))
272+
// log.Println(do("test2.txt"))
273+
// log.Println(do2("test2.txt"))
274+
// log.Println(do("input.txt"))
275+
// log.Println(do2("input.txt"))
276+
// log.Println(do2("test3.txt"))
277+
278+
// 371 too high
279+
// 266 too low
280+
// 273
281+
// 274
282+
283+
// 357
284+
log.Println(do2("input.txt"))
285+
// log.Println(do("input.txt"))
286+
}

2020-19/angch/test.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
0: 4 1 5
2+
1: 2 3 | 3 2
3+
2: 4 4 | 5 5
4+
3: 4 5 | 5 4
5+
4: "a"
6+
5: "b"
7+
8+
ababbb
9+
bababa
10+
abbbab
11+
aaabbb
12+
aaaabbb

2020-19/angch/test2.txt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
42: 9 14 | 10 1
2+
9: 14 27 | 1 26
3+
10: 23 14 | 28 1
4+
1: "a"
5+
11: 42 31
6+
5: 1 14 | 15 1
7+
19: 14 1 | 14 14
8+
12: 24 14 | 19 1
9+
16: 15 1 | 14 14
10+
31: 14 17 | 1 13
11+
6: 14 14 | 1 14
12+
2: 1 24 | 14 4
13+
0: 8 11
14+
13: 14 3 | 1 12
15+
15: 1 | 14
16+
17: 14 2 | 1 7
17+
23: 25 1 | 22 14
18+
28: 16 1
19+
4: 1 1
20+
20: 14 14 | 1 15
21+
3: 5 14 | 16 1
22+
27: 1 6 | 14 18
23+
14: "b"
24+
21: 14 1 | 1 14
25+
25: 1 1 | 1 14
26+
22: 14 14
27+
8: 42
28+
26: 14 22 | 1 20
29+
18: 15 15
30+
7: 14 5 | 1 21
31+
24: 14 1
32+
33+
abbbbbabbbaaaababbaabbbbabababbbabbbbbbabaaaa
34+
bbabbbbaabaabba
35+
babbbbaabbbbbabbbbbbaabaaabaaa
36+
aaabbbbbbaaaabaababaabababbabaaabbababababaaa
37+
bbbbbbbaaaabbbbaaabbabaaa
38+
bbbababbbbaaaaaaaabbababaaababaabab
39+
ababaaaaaabaaab
40+
ababaaaaabbbaba
41+
baabbaaaabbaaaababbaababb
42+
abbbbabbbbaaaababbbbbbaaaababb
43+
aaaaabbaabaaaaababaa
44+
aaaabbaaaabbaaa
45+
aaaabbaabbaaaaaaabbbabbbaaabbaabaaa
46+
babaaabbbaaabaababbaabababaaab
47+
aabbbbbaabbbaaaaaabbbbbababaaaaabbaaabba

0 commit comments

Comments
 (0)