-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path19.v
95 lines (71 loc) · 1.47 KB
/
19.v
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
94
95
import os
fn possible(towels []string, current string, query string, mut visited map[string]bool) bool {
if current == query {
return true
}
if current.len >= query.len {
return false
}
if visited[current] {
return false
}
visited[current] = true
for towel in towels {
n := current + towel
if query == n {
return true
}
if query.starts_with(n) {
if possible(towels, n, query, mut visited) {
return true
}
}
}
return false
}
fn count_combinations(towels []string, current string, query string, mut visited map[string]u64) u64 {
if current == query {
return 1
}
if current.len >= query.len {
return 0
}
if current in visited {
return visited[current]
}
mut sum := u64(0)
for towel in towels {
n := current + towel
if query.starts_with(n) {
sum += count_combinations(towels, n, query, mut visited)
}
}
visited[current] = sum
return sum
}
fn p1(input string) ! {
lines := os.read_lines(input)!
towels := lines[0].split(', ')
queries := lines[2..]
mut sum := 0
for query in queries {
mut visited := map[string]bool{}
sum += if possible(towels, '', query, mut visited) { 1 } else { 0 }
}
println(sum)
}
fn p2(input string) ! {
lines := os.read_lines(input)!
towels := lines[0].split(', ')
queries := lines[2..]
mut sum := u64(0)
for query in queries {
mut visited := map[string]u64{}
sum += count_combinations(towels, '', query, mut visited)
}
println(sum)
}
fn main() {
p1('input')!
p2('input')!
}