start += 1;
curr, err = peek_byte(reader);
- if err != .None do break;
+ if err != .None || start == end do break;
}
if is_negative do n = -n;
start += 1;
curr, err = peek_byte(reader);
- if err != .None do break;
+ if err != .None || start == end do break;
}
if is_negative do n = -n;
start += 1;
curr, err = peek_byte(reader);
- if err != .None do break;
+ if err != .None || start == end do break;
}
return n;
start += 1;
curr, err = peek_byte(reader);
- if err != .None do break;
+ if err != .None || start == end do break;
}
return n;
--- /dev/null
+PART :: 2
+
+#load "core/std"
+
+use package core
+
+read_binary :: (r: ^io.Reader) -> i32 {
+ n := 0;
+
+ io.skip_whitespace(r);
+
+ curr, err := io.peek_byte(r);
+ if err != .None do return n;
+ while curr == #char "0" || curr == #char "1" {
+ n *= 2;
+ n += cast(u32) (curr - #char "0");
+
+ r.start += 1;
+ curr, err = io.peek_byte(r);
+ if err != .None || r.start == r.end do break;
+ }
+
+ return n;
+}
+
+main :: (args) => {
+ BITS :: 12
+
+ for io.with_file("./tests/aoc-2021/input/day03.txt") {
+ reader := io.reader_make(it);
+
+ nums := array.make(i32);
+ while !io.reader_empty(^reader) {
+ nums << read_binary(^reader);
+ }
+
+ ones_count: [BITS] i32; // Every digit is 12-bits
+ for BITS {
+ ones_count[it] = 0;
+ for num: nums {
+ if num & (1 << it) != 0 do ones_count[it] += 1;
+ }
+ }
+
+ num1 := 0;
+ for BITS do num1 |= (1 << it) if ones_count[it] >= (nums.count / 2) else 0;
+
+ num2 := ((1 << BITS) - 1) & (~num1);
+
+ printf("Part 1: {}\n", num1 * num2);
+
+ oxygen_array := array.copy(^nums);
+ co2_array := array.copy(^nums);
+
+ filter_array :: macro (arr: [..] i32, index: i32, comparison: Code) {
+ A := 0;
+ B := (arr.count + 1) / 2;
+
+ // Count the number of ones
+ for arr {
+ if (it & (1 << index)) != 0 do A += 1;
+ }
+
+ expected := (1 << index) if (#insert comparison) else 0;
+
+ while i := 0; i < arr.count {
+ defer i += 1;
+
+ if (arr[i] & (1 << index)) != expected {
+ array.fast_delete(^arr, i);
+ i -= 1;
+ }
+ }
+ }
+
+ for iter.as_iterator(range.{ BITS - 1, 0, -1 }) {
+ filter_array(oxygen_array, it, #(A >= B));
+ filter_array(co2_array, it, #(A < B));
+ }
+
+ printf("Part 2: {}\n", oxygen_array[0] * co2_array[0]);
+ }
+}
\ No newline at end of file