-
Notifications
You must be signed in to change notification settings - Fork 0
/
14b.kt
67 lines (62 loc) · 1.5 KB
/
14b.kt
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
import kotlin.io.path.Path
import kotlin.io.path.readLines
import kotlin.math.*
typealias Tab = MutableList<MutableList<Char>>
fun tilt(tab: Tab) {
val n = tab.size
val m = tab[0].size
for (j in 0 until m) {
var countStones = 0
var previousEnd = 0
for (i in 0 until n+1) {
if (i == n || tab[i][j] == '#') {
for (k in previousEnd until i) {
tab[k][j] = if (k - previousEnd < countStones) 'O' else '.'
}
previousEnd = i+1
countStones = 0
}
else if (tab[i][j] == 'O') countStones++
}
}
}
fun rotate(tab: Tab) : Tab {
val n = tab.size
val m = tab[0].size
val rotated = MutableList(m) { MutableList(n) { ' ' } }
for (i in 0 until n) {
for (j in 0 until m) {
rotated[j][n - 1 - i] = tab[i][j]
}
}
return rotated
}
fun main() {
val fileName = "14.in"
var tab = Path(fileName).readLines().map { it.toMutableList() }.toMutableList()
var result = 0
val n = tab.size
val m = tab[0].size
var steps = 1000000000
var mem = HashMap<List<List<Char>>, Int>()
while (steps != 0) {
val immutableTab = tab.map { it.toList() }.toList()
if (mem.containsKey(immutableTab)) {
val cycle = mem[immutableTab]!! - steps
steps %= cycle
}
mem[immutableTab] = steps
for (d in 0 until 4) {
tilt(tab)
tab = rotate(tab)
}
steps--
}
// tilt(tab)
for (i in 0 until n) {
for (j in 0 until m) {
if (tab[i][j] == 'O') result += n - i
}
}
println(result)
}