File tree Expand file tree Collapse file tree 5 files changed +117
-0
lines changed Expand file tree Collapse file tree 5 files changed +117
-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
+ file_type := compact[r] or { panic ('impossible' ) }
53
+ for l > 0 && compact[l - 1 ] == file_type {
54
+ l--
55
+ }
56
+ if l == 0 {
57
+ break
58
+ }
59
+ file_len := r - l + 1
60
+
61
+ mut fl := 0
62
+ for {
63
+ for fl < compact.len && compact[fl] != - 1 {
64
+ fl++
65
+ }
66
+ mut fr := fl
67
+ for fr < compact.len && compact[fr] == - 1 {
68
+ fr++
69
+ }
70
+ if fr > l {
71
+ r = l - 1
72
+ continue outer
73
+ }
74
+ available := fr - fl
75
+ if available > = file_len {
76
+ break
77
+ }
78
+ fl = fr
79
+ }
80
+
81
+ for i in 0 .. file_len {
82
+ compact[fl + i] = compact[r]
83
+ compact[l + i] = - 1
84
+ }
85
+ }
86
+
87
+ print_layout (compact)
88
+
89
+ println ('part2: ${checksum(compact)} ' )
90
+ }
91
+
92
+ fn print_layout (layout []int ) {
93
+ for value in layout {
94
+ if value != - 1 {
95
+ print (value)
96
+ } else {
97
+ print ('.' )
98
+ }
99
+ }
100
+ print ('\n ' )
101
+ }
102
+
103
+ fn checksum (layout []int ) i64 {
104
+ mut total := i64 (0 )
105
+ for i, value in layout {
106
+ if value != - 1 {
107
+ total + = value * i
108
+ }
109
+ }
110
+ return total
111
+ }
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