File tree 5 files changed +116
-0
lines changed
5 files changed +116
-0
lines changed Original file line number Diff line number Diff line change
1
+ 2333133121414131402
Original file line number Diff line number Diff line change
1
+ import os
2
+
3
+ fn main () {
4
+ line := os.read_file ('diskmap.input' )!
5
+
6
+ mut layout := []int {}
7
+ for i := 0 ; i < line.len; i + = 2 {
8
+ file_len := line[i] - `0`
9
+ for _ in 0 .. file_len {
10
+ layout << (i >> 1 )
11
+ }
12
+
13
+ if i + 1 > = line.len {
14
+ break
15
+ }
16
+ gap_len := line[i + 1 ] - `0`
17
+ for _ in 0 .. gap_len {
18
+ layout << - 1
19
+ }
20
+ }
21
+
22
+ print_layout (layout)
23
+
24
+ mut l := 0
25
+ mut r := layout.len - 1
26
+ mut fragment := layout.clone ()
27
+ for {
28
+ for fragment[l] != - 1 {
29
+ l++
30
+ }
31
+ for fragment[r] == - 1 {
32
+ r--
33
+ }
34
+ if l > = r {
35
+ break
36
+ }
37
+ fragment[l] = fragment[r]
38
+ fragment[r] = - 1
39
+ }
40
+
41
+ print_layout (fragment)
42
+
43
+ println ('part1: ${checksum(fragment)} ' )
44
+
45
+ mut compact := layout.clone ()
46
+ r = compact.len - 1
47
+ outer: for {
48
+ for r > 0 && compact[r] == - 1 {
49
+ r--
50
+ }
51
+ l = r
52
+ for l > 0 && compact[l - 1 ] == compact[r] {
53
+ l--
54
+ }
55
+ if l == 0 {
56
+ break
57
+ }
58
+ file_len := r - l + 1
59
+
60
+ mut fl := 0
61
+ for {
62
+ for fl < compact.len && compact[fl] != - 1 {
63
+ fl++
64
+ }
65
+ mut fr := fl
66
+ for fr < compact.len && compact[fr] == - 1 {
67
+ fr++
68
+ }
69
+ if fr > l {
70
+ r = l - 1
71
+ continue outer
72
+ }
73
+ available := fr - fl
74
+ if available > = file_len {
75
+ break
76
+ }
77
+ fl = fr
78
+ }
79
+
80
+ for i in 0 .. file_len {
81
+ compact[fl + i] = compact[r]
82
+ compact[l + i] = - 1
83
+ }
84
+ }
85
+
86
+ print_layout (compact)
87
+
88
+ println ('part2: ${checksum(compact)} ' )
89
+ }
90
+
91
+ fn print_layout (layout []int ) {
92
+ for value in layout {
93
+ if value != - 1 {
94
+ print (value)
95
+ } else {
96
+ print ('.' )
97
+ }
98
+ }
99
+ print ('\n ' )
100
+ }
101
+
102
+ fn checksum (layout []int ) i64 {
103
+ mut total := i64 (0 )
104
+ for i, value in layout {
105
+ if value != - 1 {
106
+ total + = value * i
107
+ }
108
+ }
109
+ return total
110
+ }
Original file line number Diff line number Diff line change
1
+ 00...111...2...333.44.5555.6666.777.888899
2
+ 0099811188827773336446555566..............
3
+ part1: 1928
4
+ 00992111777.44.333....5555.6666.....8888..
5
+ part2: 2858
You can’t perform that action at this time.
0 commit comments