y2024d17p2 needed u64 also, kinda cheating as I didn't really understand the puzzle
This commit is contained in:
parent
5296af36dd
commit
4cb23761b2
@ -2,7 +2,7 @@ use std::{collections::HashMap, error::Error};
|
|||||||
|
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
|
||||||
pub fn process_part1(input: &str) -> (String, HashMap<&str, u32>) {
|
pub fn process_part1(input: &str) -> (String, HashMap<&str, u64>) {
|
||||||
let (registers, program) = input.split_once("\n\n").unwrap();
|
let (registers, program) = input.split_once("\n\n").unwrap();
|
||||||
let mut registers = parse_registers(registers);
|
let mut registers = parse_registers(registers);
|
||||||
let (_, instructions) = program.split_once(": ").unwrap();
|
let (_, instructions) = program.split_once(": ").unwrap();
|
||||||
@ -19,7 +19,7 @@ pub fn process_part1(input: &str) -> (String, HashMap<&str, u32>) {
|
|||||||
.collect_vec()
|
.collect_vec()
|
||||||
.concat();
|
.concat();
|
||||||
|
|
||||||
let mut instruction_pointer: u32 = 0;
|
let mut instruction_pointer: u64 = 0;
|
||||||
|
|
||||||
while let Some((opcode, operand)) = instructions.get(instruction_pointer as usize) {
|
while let Some((opcode, operand)) = instructions.get(instruction_pointer as usize) {
|
||||||
let opcode = OpCodes::try_from(*opcode).unwrap();
|
let opcode = OpCodes::try_from(*opcode).unwrap();
|
||||||
@ -37,7 +37,7 @@ pub fn process_part1(input: &str) -> (String, HashMap<&str, u32>) {
|
|||||||
(out.into_iter().join(","), registers)
|
(out.into_iter().join(","), registers)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_part2(input: &str) -> u32 {
|
pub fn process_part2(input: &str) -> u64 {
|
||||||
let (registers, program) = input.split_once("\n\n").unwrap();
|
let (registers, program) = input.split_once("\n\n").unwrap();
|
||||||
let mut registers = parse_registers(registers);
|
let mut registers = parse_registers(registers);
|
||||||
let (_, instructions) = program.split_once(": ").unwrap();
|
let (_, instructions) = program.split_once(": ").unwrap();
|
||||||
@ -56,8 +56,8 @@ pub fn process_part2(input: &str) -> u32 {
|
|||||||
.iter()
|
.iter()
|
||||||
.map(|(opcode, operand)| {
|
.map(|(opcode, operand)| {
|
||||||
[
|
[
|
||||||
opcode.parse::<u32>().unwrap(),
|
opcode.parse::<u64>().unwrap(),
|
||||||
operand.parse::<u32>().unwrap(),
|
operand.parse::<u64>().unwrap(),
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
.collect_vec()
|
.collect_vec()
|
||||||
@ -70,8 +70,8 @@ pub fn process_part2(input: &str) -> u32 {
|
|||||||
loop {
|
loop {
|
||||||
registers.insert("A", new_a);
|
registers.insert("A", new_a);
|
||||||
let out = exec_program(instructions.clone(), &mut registers);
|
let out = exec_program(instructions.clone(), &mut registers);
|
||||||
println!("target {target:?}");
|
//println!("target {target:?}");
|
||||||
println!("output {out:?}");
|
//println!("output {out:?}");
|
||||||
if out == target {
|
if out == target {
|
||||||
a = new_a;
|
a = new_a;
|
||||||
break;
|
break;
|
||||||
@ -82,9 +82,9 @@ pub fn process_part2(input: &str) -> u32 {
|
|||||||
a
|
a
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exec_program(instructions: Vec<(&str, &str)>, registers: &mut HashMap<&str, u32>) -> Vec<u32> {
|
fn exec_program(instructions: Vec<(&str, &str)>, registers: &mut HashMap<&str, u64>) -> Vec<u64> {
|
||||||
let mut out = Vec::new();
|
let mut out = Vec::new();
|
||||||
let mut instruction_pointer: u32 = 0;
|
let mut instruction_pointer: u64 = 0;
|
||||||
|
|
||||||
while let Some((opcode, operand)) = instructions.get(instruction_pointer as usize) {
|
while let Some((opcode, operand)) = instructions.get(instruction_pointer as usize) {
|
||||||
let opcode = OpCodes::try_from(*opcode).unwrap();
|
let opcode = OpCodes::try_from(*opcode).unwrap();
|
||||||
@ -102,7 +102,7 @@ fn exec_program(instructions: Vec<(&str, &str)>, registers: &mut HashMap<&str, u
|
|||||||
out
|
out
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_registers(input: &str) -> HashMap<&str, u32> {
|
fn parse_registers(input: &str) -> HashMap<&str, u64> {
|
||||||
let mut registers = HashMap::new();
|
let mut registers = HashMap::new();
|
||||||
input.lines().for_each(|line| {
|
input.lines().for_each(|line| {
|
||||||
let (register, value) = line.split_once(": ").unwrap();
|
let (register, value) = line.split_once(": ").unwrap();
|
||||||
@ -126,11 +126,11 @@ enum OpCodes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl OpCodes {
|
impl OpCodes {
|
||||||
fn exec(&self, operand: &str, registers: &mut HashMap<&str, u32>) -> Option<(u32, bool)> {
|
fn exec(&self, operand: &str, registers: &mut HashMap<&str, u64>) -> Option<(u64, bool)> {
|
||||||
let a = *registers.get("A").unwrap();
|
let a = *registers.get("A").unwrap();
|
||||||
let b = *registers.get("B").unwrap();
|
let b = *registers.get("B").unwrap();
|
||||||
let c = *registers.get("C").unwrap();
|
let c = *registers.get("C").unwrap();
|
||||||
let operand: u32 = operand.parse().unwrap();
|
let operand: u64 = operand.parse().unwrap();
|
||||||
let combo = if operand <= 3 {
|
let combo = if operand <= 3 {
|
||||||
operand
|
operand
|
||||||
} else if operand == 4 {
|
} else if operand == 4 {
|
||||||
@ -146,9 +146,9 @@ impl OpCodes {
|
|||||||
OpCodes::Adv => {
|
OpCodes::Adv => {
|
||||||
//println!(
|
//println!(
|
||||||
// "a = a / 2 ** combo = {a} / 2 ** {combo} = {}",
|
// "a = a / 2 ** combo = {a} / 2 ** {combo} = {}",
|
||||||
// a / 2_u32.pow(combo)
|
// a / 2_u64.pow(combo)
|
||||||
//);
|
//);
|
||||||
registers.insert("A", a / 2_u32.pow(combo));
|
registers.insert("A", a / 2_u64.pow(combo as u32));
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
OpCodes::Bxl => {
|
OpCodes::Bxl => {
|
||||||
@ -182,17 +182,17 @@ impl OpCodes {
|
|||||||
OpCodes::Bdv => {
|
OpCodes::Bdv => {
|
||||||
//println!(
|
//println!(
|
||||||
// "b = a / 2 ** combo = {a} / 2 ** {combo} = {}",
|
// "b = a / 2 ** combo = {a} / 2 ** {combo} = {}",
|
||||||
// a / 2_u32.pow(combo)
|
// a / 2_u64.pow(combo)
|
||||||
//);
|
//);
|
||||||
registers.insert("B", a / 2_u32.pow(combo));
|
registers.insert("B", a / 2_u64.pow(combo as u32));
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
OpCodes::Cdv => {
|
OpCodes::Cdv => {
|
||||||
//println!(
|
//println!(
|
||||||
// "c = a / 2 ** combo = {a} / 2 ** {combo} = {}",
|
// "c = a / 2 ** combo = {a} / 2 ** {combo} = {}",
|
||||||
// a / 2_u32.pow(combo)
|
// a / 2_u64.pow(combo)
|
||||||
//);
|
//);
|
||||||
registers.insert("C", a / 2_u32.pow(combo));
|
registers.insert("C", a / 2_u64.pow(combo as u32));
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user