diff options
| author | nekineki <nekineki@nekineki.net> | 2024-12-26 20:57:56 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2024-12-26 20:57:56 +0100 |
| commit | 85920352be355ef7f987aba01d6ce3bfc6be5ff6 (patch) | |
| tree | 765a3c542533823b004f6afefa943a5b9d61d9a8 /2024 | |
| parent | 0b078910c52a7fb4f5eb17193f7f2f720f7a6cd7 (diff) | |
day24 part1
Diffstat (limited to '2024')
| -rw-r--r-- | 2024/day24.rs | 83 | ||||
| -rw-r--r-- | 2024/in/day24.pzl | 313 | ||||
| -rw-r--r-- | 2024/in/day24.ref | 47 |
3 files changed, 443 insertions, 0 deletions
diff --git a/2024/day24.rs b/2024/day24.rs new file mode 100644 index 0000000..7186e6c --- /dev/null +++ b/2024/day24.rs @@ -0,0 +1,83 @@ +#![allow(dead_code)] +#![allow(unused_variables)] +#![allow(unused_mut)] +use std::collections::HashMap; +use std::env; +use std::fs::File; +use std::io::Read; + +#[derive(Debug, PartialEq, Clone)] +struct Eqa<'a> { + a: &'a str, + b: &'a str, + f: fn(bool, bool) -> bool, +} + +fn solve(s: &str, vals: &HashMap<&str, bool>, eqs: &HashMap<&str, Eqa>) -> bool { + if let Some(val) = vals.get(s) { + return *val; + } + if let Some(eq) = eqs.get(s) { + return (eq.f)(solve(eq.a, vals, eqs), solve(eq.b, vals, eqs)); + } + panic!() +} + +fn main() { + let args: Vec<String> = env::args().collect(); + let filename = if args.len() == 1 { + "in/".to_owned() + args[0].split('/').last().unwrap() + ".pzl" + } else { + args[1].clone() + }; + let mut f = File::open(filename).expect("cannot open file"); + let mut content = String::new(); + f.read_to_string(&mut content).expect("cannot read file"); + let (para1, para2) = content.trim_end().split_once("\n\n").unwrap(); + + let mut vals: HashMap<&str, bool> = HashMap::new(); + for s in para1.split("\n") { + let (s, v) = s.split_once(": ").unwrap(); + vals.insert(s, if v == "1" { true } else { false }); + } + + let mut zs: Vec<&str> = Vec::new(); + let mut eqs: HashMap<&str, Eqa> = HashMap::new(); + for s in para2.split("\n") { + let (a, rest) = s.split_once(" ").unwrap(); + let (op, rest) = rest.split_once(" ").unwrap(); + let (b, s) = rest.split_once(" -> ").unwrap(); + + if s.starts_with("z") { + zs.push(s); + } + + let e: Eqa = Eqa { + a: a, + b: b, + f: match op { + "AND" => |a, b| a & b, + "OR" => |a, b| a | b, + "XOR" => |a, b| a ^ b, + _ => panic!(), + }, + }; + eqs.insert(s, e); + } + zs.sort(); + + let mut res1: u64 = 0; + for (i, z) in zs.iter().enumerate() { + let a = solve(z, &vals, &eqs); + if a { + res1 += 1 << i; + } + println!("{} {} {}", i, z, a); + } + + let res2 = 0; + println!("res1: {}", res1); + println!("res2: {}", res2); + //assert_eq!(res1, ); + //assert_eq!(res2, ); +} diff --git a/2024/in/day24.pzl b/2024/in/day24.pzl new file mode 100644 index 0000000..0264b3b --- /dev/null +++ b/2024/in/day24.pzl @@ -0,0 +1,313 @@ +x00: 1 +x01: 0 +x02: 0 +x03: 1 +x04: 1 +x05: 1 +x06: 0 +x07: 0 +x08: 1 +x09: 1 +x10: 0 +x11: 1 +x12: 0 +x13: 0 +x14: 1 +x15: 1 +x16: 1 +x17: 1 +x18: 0 +x19: 0 +x20: 0 +x21: 0 +x22: 1 +x23: 1 +x24: 1 +x25: 1 +x26: 1 +x27: 1 +x28: 0 +x29: 1 +x30: 1 +x31: 0 +x32: 1 +x33: 0 +x34: 0 +x35: 0 +x36: 0 +x37: 1 +x38: 1 +x39: 0 +x40: 0 +x41: 0 +x42: 0 +x43: 1 +x44: 1 +y00: 1 +y01: 1 +y02: 1 +y03: 1 +y04: 0 +y05: 0 +y06: 0 +y07: 0 +y08: 0 +y09: 1 +y10: 0 +y11: 1 +y12: 0 +y13: 0 +y14: 1 +y15: 0 +y16: 0 +y17: 0 +y18: 0 +y19: 1 +y20: 0 +y21: 0 +y22: 0 +y23: 0 +y24: 0 +y25: 1 +y26: 1 +y27: 0 +y28: 1 +y29: 0 +y30: 1 +y31: 0 +y32: 1 +y33: 1 +y34: 0 +y35: 1 +y36: 1 +y37: 1 +y38: 0 +y39: 1 +y40: 0 +y41: 1 +y42: 1 +y43: 0 +y44: 1 + +x07 AND y07 -> ncs +y24 AND x24 -> wrf +x19 XOR y19 -> tsm +x40 XOR y40 -> svt +rjf OR src -> dfv +fsf XOR fgs -> z44 +mhc AND jqd -> qgn +nrr XOR sms -> kpp +y20 AND x20 -> ngc +y21 AND x21 -> hbc +sgj OR ptb -> rqf +hbc OR wdr -> gjn +tks XOR sbg -> z23 +ddh AND tnm -> hgg +hsf OR bjw -> vbb +x15 XOR y15 -> vqs +x10 AND y10 -> dtm +vqs XOR vss -> z15 +x29 XOR y29 -> mgd +srg OR cwb -> qtn +nmb OR mbk -> z45 +dhs OR njq -> tng +jfw OR jrf -> vpd +x07 XOR y07 -> gck +tdw XOR vrk -> z03 +y11 AND x11 -> ffw +x16 XOR y16 -> bth +x39 XOR y39 -> tnm +cfg AND ngh -> jrq +vpd AND mvn -> hbj +rgp XOR bth -> z16 +qtn AND cjd -> vrv +x14 AND y14 -> cgt +dwh XOR hsk -> z24 +tgp XOR dkh -> z13 +y26 XOR x26 -> cfg +cpc XOR nbm -> z42 +y42 XOR x42 -> cpc +x17 XOR y17 -> cjd +rqf XOR pqn -> z36 +x27 AND y27 -> nwg +bcq AND hnk -> vjp +tks AND sbg -> wqr +wvr OR skq -> gmw +cwm AND tpv -> pqw +x41 AND y41 -> tqh +jcw AND wpk -> sbr +tgp AND dkh -> tbh +wrg XOR nwq -> z38 +y32 XOR x32 -> gds +bmn OR hbj -> msb +wps XOR mtn -> z33 +ncs OR pjf -> sws +wqr OR tqk -> dwh +x31 AND y31 -> pwg +y12 XOR x12 -> jcw +nrr AND sms -> z31 +x38 AND y38 -> npd +y02 AND x02 -> fwt +y37 AND x37 -> rnc +fwt OR vtm -> tdw +x38 XOR y38 -> nwq +gds AND ghr -> ckd +ffw OR nfb -> wpk +ctv XOR wht -> z05 +y11 XOR x11 -> cmg +y05 XOR x05 -> ctv +jhw XOR tcv -> z18 +wrf OR gnt -> rmw +y01 AND x01 -> tnr +x36 XOR y36 -> pqn +gjq OR dfg -> skp +x40 AND y40 -> ptg +y39 AND x39 -> dqn +bjb OR hjf -> sbg +rrn OR rpt -> qfs +ctv AND wht -> dhs +sgs AND rsb -> ccw +rmw XOR psg -> z25 +y24 XOR x24 -> hsk +bgd XOR msb -> z10 +y17 AND x17 -> fvv +y22 AND x22 -> kdh +qfs AND rfv -> fgp +wds AND fps -> rhr +y18 XOR x18 -> tcv +ttd AND nhg -> tfw +bbc AND jkb -> ptb +djn OR tnr -> cpb +y35 XOR x35 -> bbc +tfw OR cgt -> z14 +rgp AND bth -> srg +dwh AND hsk -> gnt +pqw OR ngc -> frt +y25 XOR x25 -> psg +y13 XOR x13 -> tgp +x30 XOR y30 -> rbw +vrv OR fvv -> jhw +skp XOR mgd -> z29 +cmg XOR ntv -> z11 +vjr XOR vbb -> z04 +gkj XOR sws -> z08 +x20 XOR y20 -> tpv +ntv AND cmg -> nfb +x32 AND y32 -> tdk +wmr AND cpb -> vtm +x19 AND y19 -> jps +jhw AND tcv -> rqv +y27 XOR x27 -> bcq +x34 AND y34 -> hdk +wqc XOR qtf -> z01 +wgk OR sbr -> dkh +x43 AND y43 -> kdb +y04 XOR x04 -> vjr +rmw AND psg -> fgg +gkj AND sws -> jfw +cwm XOR tpv -> z20 +cjd XOR qtn -> z17 +fsf AND fgs -> nmb +wps AND mtn -> rpt +x33 XOR y33 -> mtn +bcq XOR hnk -> z27 +tbh OR wwk -> nhg +twb XOR tsm -> z19 +frt AND mhw -> wdr +y15 AND x15 -> pwr +rbw XOR dfv -> z30 +vss AND vqs -> ctt +x28 AND y28 -> gjq +y28 XOR x28 -> dvf +bbc XOR jkb -> sgj +x43 XOR y43 -> fps +y04 AND x04 -> khw +pwg OR kpp -> ghr +x31 XOR y31 -> nrr +gmw XOR gck -> z07 +frt XOR mhw -> z21 +spb AND tng -> skq +svt AND hkg -> knf +gjn AND kdh -> bjb +qfs XOR rfv -> z34 +cpc AND nbm -> jtt +tqh OR ccw -> nbm +jtt OR qkv -> wds +gds XOR ghr -> z32 +rbw AND dfv -> qnv +msb AND bgd -> gjr +qnv OR bjd -> sms +y18 AND x18 -> pns +x41 XOR y41 -> rsb +x26 AND y26 -> srh +nvc OR npd -> ddh +dtm OR gjr -> ntv +x08 AND y08 -> jrf +y14 XOR x14 -> ttd +y06 AND x06 -> wvr +y16 AND x16 -> cwb +rnc OR qgn -> wrg +y30 AND x30 -> bjd +jqd XOR mhc -> z37 +ddh XOR tnm -> z39 +x12 AND y12 -> wgk +cqh OR fgg -> ngh +kdh XOR gjn -> z22 +x01 XOR y01 -> wqc +khw OR djm -> wht +ctt OR pwr -> rgp +y21 XOR x21 -> mhw +vjp OR nwg -> dhh +x02 XOR y02 -> wmr +gck AND gmw -> pjf +rqv OR pns -> twb +y00 AND x00 -> qtf +y05 AND x05 -> njq +y29 AND x29 -> rjf +vrk AND tdw -> hsf +y42 AND x42 -> qkv +y10 XOR x10 -> bgd +cfg XOR ngh -> z26 +tng XOR spb -> z06 +y00 XOR x00 -> z00 +cpb XOR wmr -> z02 +ckd OR tdk -> wps +jrq OR srh -> hnk +y22 XOR x22 -> hjf +x03 AND y03 -> bjw +nhg XOR ttd -> vss +tsm AND twb -> rwg +dqn OR hgg -> hkg +y34 XOR x34 -> rfv +y35 AND x35 -> z35 +x25 AND y25 -> cqh +y33 AND x33 -> rrn +wqc AND qtf -> djn +sgs XOR rsb -> z41 +x08 XOR y08 -> gkj +rwg OR jps -> cwm +rqf AND pqn -> wbv +x37 XOR y37 -> mhc +dvf XOR dhh -> z28 +kdb OR rhr -> fgs +knf OR ptg -> sgs +svt XOR hkg -> z40 +y13 AND x13 -> wwk +y23 AND x23 -> tqk +fgp OR hdk -> jkb +jcw XOR wpk -> z12 +y06 XOR x06 -> spb +x23 XOR y23 -> tks +y09 AND x09 -> bmn +wds XOR fps -> z43 +dhh AND dvf -> dfg +mgd AND skp -> src +wrg AND nwq -> nvc +y03 XOR x03 -> vrk +y36 AND x36 -> kqk +vjr AND vbb -> djm +x44 XOR y44 -> fsf +x44 AND y44 -> mbk +kqk OR wbv -> jqd +vpd XOR mvn -> z09 +y09 XOR x09 -> mvn diff --git a/2024/in/day24.ref b/2024/in/day24.ref new file mode 100644 index 0000000..94b6eed --- /dev/null +++ b/2024/in/day24.ref @@ -0,0 +1,47 @@ +x00: 1 +x01: 0 +x02: 1 +x03: 1 +x04: 0 +y00: 1 +y01: 1 +y02: 1 +y03: 1 +y04: 1 + +ntg XOR fgs -> mjb +y02 OR x01 -> tnw +kwq OR kpj -> z05 +x00 OR x03 -> fst +tgd XOR rvg -> z01 +vdt OR tnw -> bfw +bfw AND frj -> z10 +ffh OR nrd -> bqk +y00 AND y03 -> djm +y03 OR y00 -> psh +bqk OR frj -> z08 +tnw OR fst -> frj +gnj AND tgd -> z11 +bfw XOR mjb -> z00 +x03 OR x00 -> vdt +gnj AND wpb -> z02 +x04 AND y00 -> kjc +djm OR pbm -> qhw +nrd AND vdt -> hwm +kjc AND fst -> rvg +y04 OR y02 -> fgs +y01 AND x02 -> pbm +ntg OR kjc -> kwq +psh XOR fgs -> tgd +qhw XOR tgd -> z09 +pbm OR djm -> kpj +x03 XOR y03 -> ffh +x00 XOR y04 -> ntg +bfw OR bqk -> z06 +nrd XOR fgs -> wpb +frj XOR qhw -> z04 +bqk OR frj -> z07 +y03 OR x01 -> nrd +hwm AND bqk -> z03 +tgd XOR rvg -> z12 +tnw OR pbm -> gnj |
