summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2024-12-26 20:57:56 +0100
committernekineki <nekineki@nekineki.net>2024-12-26 20:57:56 +0100
commit85920352be355ef7f987aba01d6ce3bfc6be5ff6 (patch)
tree765a3c542533823b004f6afefa943a5b9d61d9a8
parent0b078910c52a7fb4f5eb17193f7f2f720f7a6cd7 (diff)
day24 part1
-rw-r--r--2024/day24.rs83
-rw-r--r--2024/in/day24.pzl313
-rw-r--r--2024/in/day24.ref47
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