add day 12
This commit is contained in:
Generated
+7
@@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "day12"
|
||||||
|
version = "0.1.0"
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "day12"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
cpy 41 a
|
||||||
|
inc a
|
||||||
|
inc a
|
||||||
|
dec a
|
||||||
|
jnz a 2
|
||||||
|
dec a
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
cpy 1 a
|
||||||
|
cpy 1 b
|
||||||
|
cpy 26 d
|
||||||
|
jnz c 2
|
||||||
|
jnz 1 5
|
||||||
|
cpy 7 c
|
||||||
|
inc d
|
||||||
|
dec c
|
||||||
|
jnz c -2
|
||||||
|
cpy a c
|
||||||
|
inc a
|
||||||
|
dec b
|
||||||
|
jnz b -2
|
||||||
|
cpy c b
|
||||||
|
dec d
|
||||||
|
jnz d -6
|
||||||
|
cpy 19 c
|
||||||
|
cpy 11 d
|
||||||
|
inc a
|
||||||
|
dec d
|
||||||
|
jnz d -2
|
||||||
|
dec c
|
||||||
|
jnz c -5
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
#[cfg(debug_assertions)]
|
||||||
|
const FILENAME: &str = "example.txt";
|
||||||
|
#[cfg(not(debug_assertions))]
|
||||||
|
const FILENAME: &str = "input.txt";
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let program: Vec<_> = std::fs::read_to_string(FILENAME)
|
||||||
|
.unwrap()
|
||||||
|
.lines()
|
||||||
|
.map(Instruction::parse)
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
part1(&program);
|
||||||
|
part2(&program);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Registers {
|
||||||
|
registers: [usize; 4],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Registers {
|
||||||
|
fn set(&mut self, register: char, source: &Source) {
|
||||||
|
let address = Self::get_address(register);
|
||||||
|
match source {
|
||||||
|
Source::Register(from_register) => {
|
||||||
|
let from_address = Self::get_address(*from_register);
|
||||||
|
self.registers[address] = self.registers[from_address];
|
||||||
|
}
|
||||||
|
Source::Value(value) => self.registers[address] = *value,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn inc(&mut self, register: char) {
|
||||||
|
let address = Self::get_address(register);
|
||||||
|
self.registers[address] += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dec(&mut self, register: char) {
|
||||||
|
let address = Self::get_address(register);
|
||||||
|
self.registers[address] -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_nonzero(&self, value: &Source) -> bool {
|
||||||
|
match value {
|
||||||
|
Source::Register(register) => {
|
||||||
|
let address = Self::get_address(*register);
|
||||||
|
self.registers[address] != 0
|
||||||
|
}
|
||||||
|
Source::Value(value) => *value != 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_address(register: char) -> usize {
|
||||||
|
match register {
|
||||||
|
'a' => 0,
|
||||||
|
'b' => 1,
|
||||||
|
'c' => 2,
|
||||||
|
'd' => 3,
|
||||||
|
_ => panic!("unknown register: {register}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new() -> Self {
|
||||||
|
Self { registers: [0; 4] }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn value_a(&self) -> usize {
|
||||||
|
let address = Self::get_address('a');
|
||||||
|
self.registers[address]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(program: &[Instruction]) {
|
||||||
|
let mut registers = Registers::new();
|
||||||
|
|
||||||
|
run_program(program, &mut registers);
|
||||||
|
println!("{}", registers.value_a());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(program: &[Instruction]) {
|
||||||
|
let mut registers = Registers::new();
|
||||||
|
|
||||||
|
registers.set('c', &Source::Value(1));
|
||||||
|
|
||||||
|
run_program(program, &mut registers);
|
||||||
|
println!("{}", registers.value_a());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_program(program: &[Instruction], registers: &mut Registers) {
|
||||||
|
let mut pointer = 0;
|
||||||
|
|
||||||
|
while let Some(instruction) = program.get(pointer) {
|
||||||
|
match instruction {
|
||||||
|
Instruction::Cpy(source, register) => {
|
||||||
|
registers.set(*register, source);
|
||||||
|
pointer += 1;
|
||||||
|
}
|
||||||
|
Instruction::Inc(register) => {
|
||||||
|
registers.inc(*register);
|
||||||
|
pointer += 1;
|
||||||
|
}
|
||||||
|
Instruction::Dec(register) => {
|
||||||
|
registers.dec(*register);
|
||||||
|
pointer += 1;
|
||||||
|
}
|
||||||
|
Instruction::Jnz(register, offset) => {
|
||||||
|
if registers.is_nonzero(register) {
|
||||||
|
pointer = (pointer as isize + offset) as usize;
|
||||||
|
} else {
|
||||||
|
pointer += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum Instruction {
|
||||||
|
Cpy(Source, char),
|
||||||
|
Inc(char),
|
||||||
|
Dec(char),
|
||||||
|
Jnz(Source, isize),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum Source {
|
||||||
|
Register(char),
|
||||||
|
Value(usize),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Source {
|
||||||
|
fn parse(s: &str) -> Self {
|
||||||
|
let first_char = s.chars().next().unwrap();
|
||||||
|
if first_char.is_ascii_digit() {
|
||||||
|
Self::Value(s.parse().unwrap())
|
||||||
|
} else {
|
||||||
|
Self::Register(first_char)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Instruction {
|
||||||
|
fn parse(s: &str) -> Self {
|
||||||
|
let words: Vec<_> = s.split_whitespace().collect();
|
||||||
|
dbg!(&words);
|
||||||
|
match words[0] {
|
||||||
|
"cpy" => Self::Cpy(Source::parse(words[1]), words[2].chars().next().unwrap()),
|
||||||
|
"inc" => Self::Inc(words[1].chars().next().unwrap()),
|
||||||
|
"dec" => Self::Dec(words[1].chars().next().unwrap()),
|
||||||
|
"jnz" => Self::Jnz(Source::parse(words[1]), words[2].parse().unwrap()),
|
||||||
|
_ => panic!("unknown pattern: {s}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user