From cdb2c491fa8e2a58e1829c3d28ecad6acaf712d7 Mon Sep 17 00:00:00 2001 From: Burnus Date: Fri, 29 Dec 2023 06:36:13 +0100 Subject: [PATCH] Added Solution for 2023 day 25 --- 2023/day25_snowverload/Cargo.toml | 15 + 2023/day25_snowverload/challenge.txt | 89 ++ 2023/day25_snowverload/src/lib.rs | 159 +++ 2023/day25_snowverload/tests/challenge_input | 1202 ++++++++++++++++++ 2023/day25_snowverload/tests/sample_input | 13 + 5 files changed, 1478 insertions(+) create mode 100644 2023/day25_snowverload/Cargo.toml create mode 100644 2023/day25_snowverload/challenge.txt create mode 100644 2023/day25_snowverload/src/lib.rs create mode 100644 2023/day25_snowverload/tests/challenge_input create mode 100644 2023/day25_snowverload/tests/sample_input diff --git a/2023/day25_snowverload/Cargo.toml b/2023/day25_snowverload/Cargo.toml new file mode 100644 index 0000000..67e00e4 --- /dev/null +++ b/2023/day25_snowverload/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "day25_snowverload" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +[dev-dependencies] +criterion = "0.5.1" + +[[bench]] +name = "test_benchmark" +harness = false diff --git a/2023/day25_snowverload/challenge.txt b/2023/day25_snowverload/challenge.txt new file mode 100644 index 0000000..790e9bd --- /dev/null +++ b/2023/day25_snowverload/challenge.txt @@ -0,0 +1,89 @@ +\--- Day 25: Snowverload --- +---------- + +*Still* somehow without snow, you go to the last place you haven't checked: the center of Snow Island, directly below the waterfall. + +Here, someone has clearly been trying to fix the problem. Scattered everywhere are hundreds of weather machines, almanacs, communication modules, hoof prints, machine parts, mirrors, lenses, and so on. + +Somehow, everything has been *wired together* into a massive snow-producing apparatus, but nothing seems to be running. You check a tiny screen on one of the communication modules: `Error 2023`. It doesn't say what `Error 2023` means, but it *does* have the phone number for a support line printed on it. + +"Hi, you've reached Weather Machines And So On, Inc. How can I help you?" You explain the situation. + +"Error 2023, you say? Why, that's a power overload error, of course! It means you have too many components plugged in. Try unplugging some components and--" You explain that there are hundreds of components here and you're in a bit of a hurry. + +"Well, let's see how bad it is; do you see a *big red reset button* somewhere? It should be on its own module. If you push it, it probably won't fix anything, but it'll report how overloaded things are." After a minute or two, you find the reset button; it's so big that it takes two hands just to get enough leverage to push it. Its screen then displays: + +``` +SYSTEM OVERLOAD! + +Connected components would require +power equal to at least 100 stars! + +``` + +"Wait, *how* many components did you say are plugged in? With that much equipment, you could produce snow for an *entire*--" You disconnect the call. + +You have nowhere near that many stars - you need to find a way to disconnect at least half of the equipment here, but it's already Christmas! You only have time to disconnect *three wires*. + +Fortunately, someone left a wiring diagram (your puzzle input) that shows *how the components are connected*. For example: + +``` +jqt: rhn xhk nvd +rsh: frs pzl lsr +xhk: hfx +cmg: qnr nvd lhk bvb +rhn: xhk bvb hfx +bvb: xhk hfx +pzl: lsr hfx nvd +qnr: nvd +ntq: jqt hfx bvb xhk +nvd: lhk +lsr: lhk +rzs: qnr cmg lsr rsh +frs: qnr lhk lsr + +``` + +Each line shows the *name of a component*, a colon, and then *a list of other components* to which that component is connected. Connections aren't directional; `abc: xyz` and `xyz: abc` both represent the same configuration. Each connection between two components is represented only once, so some components might only ever appear on the left or right side of a colon. + +In this example, if you disconnect the wire between `hfx`/`pzl`, the wire between `bvb`/`cmg`, and the wire between `nvd`/`jqt`, you will *divide the components into two separate, disconnected groups*: + +* `*9*` components: `cmg`, `frs`, `lhk`, `lsr`, `nvd`, `pzl`, `qnr`, `rsh`, and `rzs`. +* `*6*` components: `bvb`, `hfx`, `jqt`, `ntq`, `rhn`, and `xhk`. + +Multiplying the sizes of these groups together produces `*54*`. + +Find the three wires you need to disconnect in order to divide the components into two separate groups. *What do you get if you multiply the sizes of these two groups together?* + +Your puzzle answer was `546804`. + +\--- Part Two --- +---------- + +You climb over weather machines, under giant springs, and narrowly avoid a pile of pipes as you find and disconnect the three wires. + +A moment after you disconnect the last wire, the big red reset button module makes a small ding noise: + +``` +System overload resolved! +Power required is now 50 stars. + +``` + +Out of the corner of your eye, you notice goggles and a loose-fitting hard hat peeking at you from behind an ultra crucible. You think you see a faint glow, but before you can investigate, you hear another small ding: + +``` +Power required is now 49 stars. + +Please supply the necessary stars and +push the button to restart the system. + +``` + +If you like, you can . + +Both parts of this puzzle are complete! They provide two gold stars: \*\* + +At this point, all that is left is for you to [admire your Advent calendar](/2023). + +If you still want to see it, you can [get your puzzle input](25/input). \ No newline at end of file diff --git a/2023/day25_snowverload/src/lib.rs b/2023/day25_snowverload/src/lib.rs new file mode 100644 index 0000000..c98a819 --- /dev/null +++ b/2023/day25_snowverload/src/lib.rs @@ -0,0 +1,159 @@ +use core::fmt::Display; +use std::collections::{HashMap, VecDeque}; + +const MAX_DISCONNECTS: usize = 3; + +#[derive(Debug, PartialEq, Eq)] +pub enum GraphError<'a> { + LineMalformed(&'a str), + NoDisconnection, +} + +impl Display for GraphError<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::LineMalformed(v) => write!(f, "Line must consist of at least two components, separated by \": \": {v}"), + Self::NoDisconnection => write!(f, "Unable to find a way to disconnect this network"), + } + } +} + +pub fn run(input: &str) -> Result { + let graph = try_parse_network(input)?; + try_separate(&graph).map_err(|_| GraphError::NoDisconnection) +} + +fn try_parse_network(input: &str) -> Result>, GraphError> { + let mut res = Vec::new(); + let mut ids = HashMap::new(); + for line in input.lines() { + let words: Vec<_> = line.split([':', ' ']).collect(); + if words.len() < 3 { + return Err(GraphError::LineMalformed(line)); + } + let name = words[0]; + let lhs = *ids.entry(name).or_insert_with(|| {res.push(Vec::new()); res.len()-1 }); + words.iter().skip(2).for_each(|name| { + let rhs = *ids.entry(name).or_insert_with(|| {res.push(Vec::new()); res.len()-1 }); + res[lhs].push(rhs); + res[rhs].push(lhs); + }); + } + Ok(res) +} + +fn try_separate(graph: &[Vec]) -> Result { + // Find nodes that can't be disconnected because there are more connections between them than + // we are allowed to cut. + let mut strongly_connected = vec![Vec::new(); graph.len()]; + graph.iter().enumerate().for_each(|(lhs, conn)| { + conn.iter().cloned().for_each(|rhs| { + // max_len is a tradeoff betweeen the runtime of this loop vs. the large one below. 11 + // is benchmarked to be the best for my input. This eliminates 3209 out of the 3310 + // total connections. + if lhs < rhs && is_strongly_connected(graph, lhs, rhs, 11) { + strongly_connected[lhs].push(rhs); + } + }); + }); + + // Try cutting everything that remains and see what sticks + for (first_lhs, conn) in graph.iter().enumerate() { + for first_rhs in conn.iter().cloned().filter(|&rhs| rhs > first_lhs && !strongly_connected[first_lhs].contains(&rhs)) { + for (second_lhs, conn) in graph.iter().enumerate().skip(first_lhs) { + for second_rhs in conn.iter().cloned().filter(|&rhs| rhs > second_lhs && !strongly_connected[second_lhs].contains(&rhs) && (first_lhs, first_rhs) != (second_lhs, rhs)) { + for (third_lhs, conn) in graph.iter().enumerate().skip(second_lhs) { + for third_rhs in conn.iter().cloned().filter(|&rhs| + rhs > third_lhs && + !strongly_connected[third_lhs].contains(&rhs) && + ![(first_lhs, first_rhs), (second_lhs, second_rhs)].contains(&(third_lhs, rhs))) { + let unaffected_idx = (0..).find(|idx| ![first_lhs, first_rhs, second_lhs, second_rhs, third_lhs, third_rhs].contains(idx)).unwrap(); + let mut new = graph.to_vec(); + new[first_lhs] = new[first_lhs].iter().cloned().filter(|rhs| *rhs != first_rhs).collect(); + new[first_rhs] = new[first_rhs].iter().cloned().filter(|rhs| *rhs != first_lhs).collect(); + new[second_lhs] = new[second_lhs].iter().cloned().filter(|rhs| *rhs != second_rhs).collect(); + new[second_rhs] = new[second_rhs].iter().cloned().filter(|rhs| *rhs != second_lhs).collect(); + new[third_lhs] = new[third_lhs].iter().cloned().filter(|rhs| *rhs != third_rhs).collect(); + new[third_rhs] = new[third_rhs].iter().cloned().filter(|rhs| *rhs != third_lhs).collect(); + let size = flood_fill(&new, unaffected_idx); + if size < graph.len()-MAX_DISCONNECTS { + return Ok(size*(graph.len()-size)); + } + } + } + } + } + } + } + Err(()) +} + +fn is_strongly_connected(graph: &[Vec], start: usize, dest: usize, max_len: usize) -> bool { + let mut used = vec![Vec::new(); graph.len()]; + let mut found = 0; + let mut open_set = VecDeque::from([Vec::from([start])]); + let stop: Vec<_> = graph[start].iter().cloned().chain(std::iter::once(start)).collect(); + while let Some(path) = open_set.pop_front() { + let curr = *path.last().unwrap(); + if curr == dest { + if found == MAX_DISCONNECTS { + return true; + } else { + path.windows(2).for_each(|w| { + used[w[0]].push(w[1]); + used[w[1]].push(w[0]); + // discard any remaining paths that share any connection with this one, since + // they wouldn't really be redundant to it. + open_set.iter_mut().filter(|p| p.windows(2).any(|pw| pw == w || pw[0] == w[1] && pw[1] == w[0])).for_each(|p| *p = stop.to_vec()); + }); + found += 1; + } + } + if path.len() == max_len { + return false; + } + graph[curr].iter().for_each(|next| { + if !path.contains(next) && !used[curr].contains(next) { + open_set.push_back(path.iter().cloned().chain(std::iter::once(*next)).collect()); + } + }); + } + false +} + +fn flood_fill(graph: &[Vec], starting_idx: usize) -> usize { + let mut reachable = vec![false; graph.len()]; + reachable[starting_idx] = true; + let mut open_set = Vec::from([starting_idx]); + while let Some(curr) = open_set.pop() { + graph[curr].iter().for_each(|neighbour| { + if !reachable[*neighbour] { + reachable[*neighbour] = true; + open_set.push(*neighbour); + } + }); + } + reachable.iter().filter(|n| **n).count() +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs::read_to_string; + + fn read_file(name: &str) -> String { + read_to_string(name).expect(&format!("Unable to read file: {name}")[..]).trim().to_string() + } + + #[test] + fn test_sample() { + let sample_input = read_file("tests/sample_input"); + assert_eq!(run(&sample_input), Ok(54)); + } + + #[test] + fn test_challenge() { + let challenge_input = read_file("tests/challenge_input"); + assert_eq!(run(&challenge_input), Ok(546804)); + } +} diff --git a/2023/day25_snowverload/tests/challenge_input b/2023/day25_snowverload/tests/challenge_input new file mode 100644 index 0000000..ff2a72f --- /dev/null +++ b/2023/day25_snowverload/tests/challenge_input @@ -0,0 +1,1202 @@ +lzr: bkh +ckv: ljh nnd qmc zfv +ckj: jtt jkp tgd cmg +rdz: vgl dpc ljq +svn: fdm nrg rkr tsv +xcj: zrl lnt +mgs: ztf qzl +qzs: vpp xxg mqx ngm +tqr: mtq vpg djd +tbp: hbv +jgj: qfp vcm pkp +xdh: slr +snm: xrh psc vgv mpn cbd +cts: zmp lng tbg +qsn: njh +qfc: cnn +nhr: jzs +xhv: gjb fps dzl +rjh: rgt jql +rdq: rhd msl dfz bkc +pmd: jxd jmb +tsq: fnm mgl nln +bfx: zgr cld tsv xrd +jnt: tqv mpd +trj: nmm nln +ppt: xjk xnr zfq dzx +rxp: ldd +drm: ccj jtt zxf mxb +bxg: txf bnh vgk tmh +lfm: fgj sjq sxr pzn +gzd: shc pzj +kpb: blc cnn lkc fkj +hgj: lbh pnj sbm cdb +lpr: rzt +lmc: xlx tvk +rfp: ffx cqg +mvt: npn dtq xnq +hkr: gpd bbl shn +tbg: qzl +tqb: fxb mrh +bhq: ktc mgl qcb +rlk: qvj +xkt: bbx jsm tsk gxz +jnr: xgb fjr +rfc: hxv tqf cln bbn +xnd: gkn fcm nnc +vlf: gss qct qth qtx +ldg: fgs fjr bvg +nvh: dtf vxb +ttq: thc +fhn: bfz djd jtz +ztk: fmm hvz +xhd: ngv +frj: hkm +xpp: jhs lzs slr dgd +mzz: dtn bhl kmk +kkq: ksg ssc +cdb: clt lzs xxm +rrv: dcj mjv lrp bmm +jsz: kss +jjv: kzx xjb nkl bfj vpd +rhp: qzl hsr mkl +drp: thr hkr mnr qdm +khl: mhb +vjr: vqm qhn jgg +blc: dgx +qmk: jbm tbp jdh dqr vgl +llp: zkp njs xnd mtq +zzh: zjc xqm +qkj: lgj rgb +dzb: fgc nxr vpg hzz +qsm: gps lhm +fxz: cbg +kns: snt znl +tqm: nrk jjh szj mcg +rpt: jnq lpb gqs glk +hmz: qmf +vmf: pvl lrj vrs +pgq: znv +fxv: xrl kgf llh xhm hql +dhr: xcs trr ccj skh +vgx: gbb ldk jqs +rpv: jqd djz hsc sfz +kzn: fsh scp +hhd: gqb rpm gtd xxm +pcz: kdd kzd +rjq: lkc qps +rxq: rqr nzm flf sdk +jtk: vmx tzf pbb jqs +bbs: zrl vbs +bqm: vts jzq +gkx: pcf jxz +tqf: rxd bfz zqt +lkr: fbs bdc +kbh: gvs bnh cvg kbl kcn +kpm: dkm dtq pkj npf +gcb: czn nvr +vrp: ddd nvg pxz vgv +rvp: tsr sxm dfc +dxd: rdn gmv +qfs: xrf klv +qtl: mzq xqb hhc +dqr: zpv +fqc: cbd vvd xdf +ggc: lpr bxp +vgz: cft jzj qkb cjq xvn tgd +fxp: ctr nvc +vpr: ksg jdh dbm +tfn: tvs rxf gqt +jjq: jhh qfc cjq dhl +pfv: vkh fsf lrp +kkz: flb dhl nqr xhv rks hxb +sfl: qxp zzg kcs tsk +pxv: kvz snk fqc cgc +rmx: hhk zcb khl fdm tsc +szf: sjn sxm npm +fsh: pcj +jsb: gxn +jjn: hjs gmv ltt kxs +gsz: ssz cxf ngp +drn: bdc tdl qmv thr +ppr: dvk +hrj: fzf hzv +dsp: bzv nvv pgq +vfx: vxg rpm zpf +qqs: fkv cdc +grh: kfk plf nvh fxd +qdc: qsm mvn qsd vbv +jhh: qqc kzd bqx +mgl: zcc mps +lvp: njs drn jnr nnt shg +zsc: mmp svc rks pcz +xgt: zzg dmn stl +tlf: vtz mfn kvq dxx +cqg: dmb +jml: ckj hjc cjq jpr +mhr: flq qmg sfb gkb +mct: vxb znv tsf bln +shg: jfv jsz +kvv: pvj mpz rpg dtn +cgc: bln ckt +vlv: qfp rgb +bvq: pdh qxd brd fpf +ckx: jxd +cvk: jjh brt qfq +dtf: nvk dnz +ftv: dkk lrz npf mhm +vzp: bsc szr +zcd: xbk tbn sck gvs +bnf: fsf qxd qpp fpx +ksn: gck fcj +cpn: ptx ccj jgj vpv +flc: shf +lrp: qpl +dxb: lhm xhd vpd +rmj: rfp mgs pmd ppk +zfc: ckk bpk qtv khl +ccz: vhc ctr lrz dqv +bsc: pgq +tkx: mkc zrx +gtb: xgb cnj +dhg: znl rnc jgn hrg fbl +ppk: pbb vfx +jtz: lkr bbn +fdh: snt +rvn: dft gnv +ghg: rks kgf +kfk: pcf +xpj: pvk fjh hsc gtd +bgx: rzt +rps: cdc gqs +tnz: vrx xdh xxm +jsp: bhl +jsm: xvg ptx mvb mrh +smg: cdx xpr xzq +qgl: bcc blc +fzf: rcg +rmb: dmq vgl hpq +dlg: zvk sbx ghg ldd trj rvh +vvm: mvc cnd +zvm: fcm fgc cbd +hgd: dmr tjt pbg ljh +nkr: tvz scp +rqr: hnb ndn msr vqm +qxb: jlh kff sph hzc +sxh: cjz qmg xmj +mlc: qzg fdh rxh +rlh: ppr xfz xdz glv bpv cpv +dnx: zcv +fdq: zkm csd +zvg: vtl drk +zrk: dsh zcb blb ppr +vck: vtf +qtx: hbt +svc: qqh +lvm: zvd dtf jsb +rxd: tmh drk +bmx: zkb fnc hhx drg +kmt: qtp gjh smh +rjp: rkb mgr zpj jsb +gkn: hvb +gxp: htl xcs bfr zzn fbx +xhm: ftn +jlm: kkn plp +xlv: trp cnj kpq bkc +hfg: tlp vkz zkb nkr fbl +txj: vdq plh +lmx: srj frt vxj qmh +bsp: qps plf +vtz: mvb +gmh: cbd znl +hfb: pzp zgb gsx dmf brf +lrz: nlr skr +pfd: nmm bck pkz +nfs: tcc hmc nfc +flq: flv jnt mzq +pbg: qdr +btd: bgv cqc ptl fgs +bgn: kbb kxm hql qjk +qsc: vcb kzq zqt gbh +bhj: ckx jgd vmg gbb +kcs: hvd zrf qgl +qlt: fdv bmm dhl fsf +bbr: dmq kbn znj scr +gpf: bkh qdr vtm crd dvj +jjx: dgx gbs +rct: ldv vgk mck fbl +xvb: jdk zqt nvg jfl +nkl: xzm jzj mhx +nxg: fgc +tzs: zjc xhc mdh +qpf: czm dxx hzs zpk +ssd: jsc kld shf frx +gtd: shf +nxr: kcn qfj mpm +mmp: dmn pzg +sfz: hrl ssz ghn +vmj: xzd pzj pbq mzd +jft: zxs cnn +jkp: zxs hbg mxb +tfr: vtj pnp hsf gmh +xql: pkz hhf xfs +vpd: sss +hsk: zpt +lqr: ghm +ptx: dmb +fcq: ntb zkb dbm lgb smg +bvv: jsb vkz lnt nnc +ldv: jnf drc +qpc: bgv ctr +rnm: qkz +pjk: hxb stk vjc shv sjq rxp +hsf: psc nvv jvv +khs: sdk bjm bxp +pvp: kzn mln +gsx: vhp cvj +ghn: dgx qzl +lfq: rql gcb lhz +jfv: zjc +pkv: fgd qvz fpk +qmh: shc mzm +fpn: qps dtz +pbd: hrj qcq +qlf: frj +jgs: rdk lnt jsz bsx +pcj: qnt +vgf: gps shr +zbv: gzd xnk bmq pnj +rbh: xcx fkc sgb smv hfs +gbb: gkh dkf +fdn: zpt fll +pvk: rvn mrg +fxg: vjr pcz hrh +nqj: lrp ngp +sfb: krq rfv xnt +xpx: lxd tts nxh +jzv: bnt vfr sxm +lxs: kxs grd sbh +gtl: kvt fsf xnr kxd +bgl: rvn nst jzb +vhp: cdc +qdm: fct zzh mzq +jvb: kxd qpl gtf nrk bqg htx +clv: jgs shk mlc +msh: brf qmc lss hfk +vlp: rff kjf lqm ctv +zfq: dcd xhm +tzh: jzq lqx lxg kkn vxb +xrl: hxq frx +khz: qcq hnr psl ztc +nhz: vft +xqb: vmk dmf +kbm: kbn xrh +rzt: slr +kzq: bdb tsr prh +vxf: slb vts fsh +nsh: stc mpn +qdg: bqf clk snn lpg +jdd: mjg nvl tkx tqr +hrh: clt plt dmb +gjh: klz brd +kbk: dlg xhd rjq pkz +psq: czz nbp hpd qkz +fcm: plh +tpv: snt stc +vvt: fsh +ptf: pbg zjc xnq mvc qgc dfc tvt kns +hsg: drk glk kfj bsr +bfz: vhc vhh +mxf: qgx lkc +kgd: lzr fll +klv: kqr +dcd: bfm +trq: rht +xmj: ffd cjh gtj xvd +fvn: mgh rkr znz grd +pdq: qfj +hrb: tfn glc kns xfn dkb +blb: qpl kld +qrj: jsm +ldr: jmb mzj vqm +rlf: vgt htc fxz +hnq: tkr kxv jpc +njn: fhn xnd pht njh +vrx: mzj tqb +cln: vpr hxv vfp +krl: nld xdl fdn dtq +xfm: thc dlb ndn czm fpx zcb +ndl: tvz +npf: vxb +fql: ntb +ccd: cxf ccf +clt: kxm +sbj: bck +vzl: kqj bpt bhl +ccj: xsl +kxs: mhb qrq vpp +qth: qvr bpp +rdl: kzn kfj zxj nzj +fpx: sxr nzm bfm +shl: zft bfj mjv +rds: jqf phc flc sld nnz +czx: hqv +lsc: lpg mlc tbp nvr xpx fkc +qsd: slr hbg hnr +trp: ldv dph glr +lzp: lzs mps +pdv: jmp zzn +htx: cfm bpt flc +nzs: pzc hmz tfg +crs: xgr zrt +hsm: bsr lmc gjp +mnp: czn lmc xpr bmx +mfn: smh +dkb: zph +ppx: xgb dpc gpd hpd +mnr: cdc kkt +pbr: sxg hhc ljz vtf +fkj: qpp +hcm: pdh xdh cpv lcq +mcf: llp ljq zpv hfs +jdk: ssc +mck: kcj rgh +hzf: tvt tkx hrt +dhj: fxb gjd +lpz: qkz htc +tts: rnm bdc scb kgd mvc +jxd: xxm vcm qtp +xpl: zgr gbs xhm sxr tsc +qqm: pcm +rgb: qrj fqd +msl: cvs nlr +fmm: mhm lpb +rtt: xql tbg vgx lgj +xbt: qlf kjr zqk vpv +mgm: sgz mps gjd +clk: tvk vmk bnt +rqd: ptl bpl xgr vbk drg +vgl: txf +bbx: zdd jsc jql +fpk: xdd ffr hbt cqg +dmq: qzg +ncb: znj mls kmq cvq +xjk: ghn gtd cvk +bcc: mrh bfm +tnh: rqm lrj +xfz: jkd zdf +zrv: rmx mgl rpm +ztf: xzd bpk mvb +gjb: xfz xxg +zgq: xlf ddd vvt scb +hmc: kbb ckm +jts: qpc vhc dfn vpg +slb: qkz +dpd: klv mpd mhm +msr: mrg +zhs: qct ccf +plp: rqm qzg +jvv: gqt +cpk: zdd svc gqb dtn kfk +bgk: nvk gck +mkv: ksn +bnt: vts +mpn: qxh nlr +fdb: vvg +qcq: gsm fzf +ccf: xcf +mvn: bph fzf qqc +zbs: vcb cvg crd +jlh: qsn xbk vhc +ckm: vvg qxp +rkr: vrx xcf fxl +scs: hmc ngm mgm pcz +nbp: drc kbm prj rlk jxb glc +szj: pxf rjq pjc +kxm: tcv kbd ghm +gdv: srg fsv qfp psr mrm vdf +qgc: bkh zfv +tvg: fpf +lhm: pzn mvr +rkl: mqf bkp qlf +lph: flv qfs +hfh: vxt zvd +fqr: mkl xzm nkb +mpd: tlp +jng: cmn lhm +czm: ggs fdb +sbc: psc kcj fns +dqt: gkx mfm +cft: xcf +nnt: gkb kss dfz +cjz: dfz +nnd: mnr jjz +gtx: trj gsz vlv psg +czn: ljz +bgp: fpx ldr lpr hzv +tss: nhx dmq sxh rqm qdm +xmr: qjd qtv nqj smh +znv: gbh qvj +lng: fdb nzm trj +bmk: nst bcc jcp ghg +xfb: mqf hcm flb fxg +rjs: qhb rps dns cjh gtb lqp nrf +mxb: bfj tpl +kvj: pdq ptm xrz nnc +kfx: xnk xhd xkd cqg +kmq: ttn xcj +xvl: qlf gzp dkf svq mgl +pks: chd mzz qgt +qxh: pzx +vmk: rnm +xcx: xqm ljz +zdf: flb mrg +gtf: pzn +cjq: dxb +snp: hvz glt ckc +brt: fqd vgf +fdf: fvr tqb jmr +zhm: msr fxd fzl +flf: tvg gbs pzj +qtn: bmq kmt hmr mgs +trz: rpm pdv cmn +grg: mhm zrt +jjh: mht nsl jft +dxx: jsp pzn +rlg: qtx +grd: sbj +mhn: pdx csd ncq xdc pnj +chp: jzz ddj vjv bqx +nvl: jsz ttn +tzn: xlf ksg xpx ktz +grq: pfd szj fsv +kqj: hkm +vkz: zph +kkt: hpd +fll: zcv +gbj: sfr ktc bjl rkf ttd bck +rnn: hnq lkr mfr gpd +sln: bqg llh zrv +nms: znf mnz rps +lcb: jqf shv zpk zxf +bmq: gjd +bzv: vtf +dzp: lxs ptk nhr djz +xgr: fkc +zfj: vxt lph mtq cst rfj +cld: fpf tsv vgf +xxq: sgq ppk zcc sbh +zmp: rzt qqm ntm klz +xdl: vks qmc jgn +lhd: qfp nhj lgj ftd rxp +zpd: lpf dft pzn mjb +bvg: dfc zcv xlf rfj +vbk: fpv nhz +tdl: kxv slb glr +tjt: nvc lpb gpj +pzp: pnp +dpv: dgg jkd pzj lzp +gzp: qgx fbx +gkh: srj nsl ntm +pfs: qps cfm +fkc: tgz +zlv: rlk ptm cnj vgk +dfn: lpz tts cnd +jxb: xbm jdk phs +kbn: rlk vhc +jgg: fxx vlv tsk ncq +kkx: sln djz hjt dcd +rhd: qnt vdq +hll: gcb sgp tvt ldg +flv: jgv +gkz: vbz ldv bqm bhk +dpc: xvd tts spz +ztt: lkr xvs tqq hfk kkt +zxf: gzp +dqn: vch qgf ncq +kgj: grg jpc hrg vks xpr +lrv: bgv +gzj: shl grq zrf ffr +psg: trr +frz: hbg xvn vch +tsf: qgc ldq scr +nqb: tgz ztk smf gkz +gpd: tkr +hgq: shk zmz jgn +xvd: zmx +gbd: skp clk djv gts +czz: vrs nkr +hrl: flb qzt +xrd: dtz sdn ftd +ttn: cbg +xfh: xsl hhk sfr +jzs: pjc +lgx: smh ppr zcc kzm +vgv: kmq tfg +rzh: lgz qfc cnn +ttg: lzv npm gpd gxn +hst: kxs xnr tcv +stl: vmg mqx +nzx: vtj rlq +nrg: lzs +vmx: tmd nln vtz +xsk: rff jhs +qxd: sbn +vmh: dph kxv +srf: zcv qdr +rxm: fdg lrb dqr sgb +rkf: mzj thc pdh pbd jzs +qcb: pdx csd qxd gsm +krn: xrz bhk zqt djd +ngm: sfr blc +ffr: llh pfc +rdk: jzq jdh +fsz: dxb mqf dpv jmr +mnz: grs +lnf: thc srj psl hcq +jpj: ngv cft +zbq: sqh cln hfg +vjc: pcm ztc qpf +nnz: shl mps fdq +fdv: bcc rxp +dzl: gtf +krm: npm nrf qmc jsb +qkd: mgn lrv fgs zrt +mkz: dgx xvg dvk jng +xdc: bmq +rgt: kmk +szr: pzx njh +xnt: vxt cvj +dtz: qtp +qjk: mxf nqj +rnc: vck vmh njs bxt +fth: bjm ltm zzg lcb +dgg: rff +fhz: xhk mkl dlb sdk +jqd: nhr +gjp: ncf qmf dnx +bph: zkm kdd +vss: xvg fdb +fgd: kzm +gqk: jmc zmz fgs +tbq: hbg fpn kxd blb +cbg: vtm qxh ncf +znf: bnt bbl xrh jgv +vdd: fdv pzg rfp cpn +kdj: sqq lms vxj sjg vtz +pfl: ptx sbn sxr gbs +mln: qmf lzr +zfv: pnp qqs +fps: vcm jzz shr +jnq: vck vft bqm +nzq: xcj +hzz: jdk lzr msl +ztc: kbd +fgs: vkz +xgf: snp tvk +grp: nlr zph xnt plh +hxv: mdn nxh nvc +lql: pdq vgl npg hnm ddd bln jgn +mvr: qtx bfm +qgf: frt pmf +vqm: ngs +hhx: vrx cvs prp +tpb: qlf nnz jhs +btl: dmb khs srj zgr +glc: skr gbh +skl: pmf qqh vcj +gqb: ctv +zgb: xgf ksg vzp +tzf: csd +mhb: ckk +dfc: pnp +bks: rck svq pfv bfm sfr +xfs: mgm pxf lsp +vdq: ljz +kgt: qct pvj ngs dmn +nnc: vts +lnt: ccp +shv: dtn rxx +mqq: snk kqr snn fjr +ljh: kkq hnm +vhn: dcq hfh vbs zrt +xqm: ljz +ldk: vcj xnr nfs +nvc: tmk +dmh: dmf cbd vft vtj +ztv: lhz +snk: nrf hfh jjz +mlz: tsv ttd qkj xdd shr +nqp: snn gck qkz dxm +cqc: ncf dkm bqf lpz +jxp: bgk fdh rhs lds nzq +glk: xbm hzc +hnp: ckk lmx qfd tpb +hxb: mht kfr +rvh: xdh dbj svc +vfr: fct pxz stc +cfm: hxq +kng: bzv +bzp: xvs znj pnr ssc +pkz: qxp gps +trr: qtp kdd +lds: xrh fpv bhk +nqr: znp ccf +lkl: gbh jnt ncf +jmc: fxz +hlv: gqt cvs dkk shn +sjn: zrx glr bbs +hfk: htb +cst: vmf pqt +jgd: jqd fbp stl +ptk: zhs qrj pks +rql: hzz zvd mkv kbl +qns: lfq vcg shn dbm vhn +dns: cdx zmx nzq +trx: pcm +nkb: pjc qgt +bth: kcn txp msl hrt +jnj: jjx dgx tsv vxg +znb: bgv dpd +jmr: nln gzd +mvp: thr qmg ncz gkn +rdn: tcc qgl +gmv: tvg +kpq: vvt fql srf +vmg: nrg ngp +ccb: ztv xrf znj +ndt: vch xcs hkf sbn +qcc: rht fxl zvc dqt +bql: lgz xzm pdv bjm +zpf: sqq +mfm: zcc hkm cnn +pbq: ccd fqd pxf +blp: htb npn bkh +jls: vcg grs spz +jkk: bgk thr +pzc: tkr zjc tlp +xdg: fnm frt hvd llx +dzx: mvn kjc bpk +sgb: nvk +vtn: qrp tmh gcb dkb +tgd: mzm ggc +kzm: dmn +vfj: tnh tfg tkr ljq +hvx: jkd rxv llh pmd dqn +bqg: sbx qpl +gxv: smr stc vfr bxn +zvk: jjn ngv +psl: ldr dqt +pjv: rfv ssc ndl jnf lph +jgx: qsn rgh +prp: scp vgt +hhc: bxt hhx bpg +jzj: qhv lqr +scr: pgq +dkp: dkf ftn +xzf: pfc qqm kcs fxl htx +bkp: qgx +ftd: vgf +xnk: pzn mrh +bqf: czx +lrr: jmc tnl xlf vtf dcq dkb +qrp: jfv hgq ptm +svz: ndl rmb lpg mnz szf +nrk: dhj hhk +kft: qmf jgx gtb lql gmh hsk +pmf: pjc +thb: ggc dxd pcm bfc +tbn: nsh hfk npn +rpb: sss bsp ldd trq hnr +fqg: fcj tll lvf jvv +kjf: mcg qxd qvz +pkj: ksn hsg nsj +hbz: xbk smv pzx gvs lrb +xmv: fdf ttq lpf +zlp: cgc lqp krk sxg +pkp: dgg xsk zft nmm +mfr: vks skp +gpn: krk clv vhh zph qmg +rhs: tmh fxz +rrx: nrt lgz xvn glv jqf +sss: fnm kzd +ptm: znj zgd djd +qhq: jfl kkq bbn rlf +bbn: zgd +mtq: nnc +tsr: txj +htb: vmk kcj +zgr: mfn mvr +qpg: hqv ksn +vfp: dnz +ljq: scp +fjr: bsr +sfq: qqs klv tvk xgf +sld: fdm llx frx rcg +npm: hrg +gqn: hbv zpv htb pnr +qjd: xsl mqx dsh +xhk: pfc rkl ccc +nst: jzz +vqb: drc fgc scp zpt +vhb: ztf pjc trl fsv +dcz: zfq pzg mkl zvc +kfj: sck htc +vkb: jbm tnh lxk jzj +xcg: zvk fqr rjh bgx dzx mhb +jjg: fqk kgf kdd +nvv: ffd njh +lzs: cxd +cnj: trp sgp +rnq: fdh snt rfj lxh +skp: pnt qnt +vbz: shn rjd dnz +trl: sgz jqs +nrf: qxh +tpl: hhf ckx fdb +qhv: cqg cnn qgf +ctb: lvm nvv pcj lqt tpv +vpp: jsp flb +vrk: nxr sbc vbk pqt shg +jbv: grs znj fbl fkv +cdx: cvq phs +qdz: kng krk fql nzx +glr: dtq +vcb: bsh vhp lrj +kll: bhk ccp fxp npg +vzx: qrq kbd mcg nkb sgq +tlp: ncf +pbb: rlg jkd dcd +mpz: bxp jxd +skh: fxb +hnm: nvg +khm: hvb cdd ksn hvz +qcd: pvj fps dgd bgl jjx +klz: chd +kmc: jsz dfz nzs znb +tzq: fxl jxz jpj gps +csz: psl fxd tsc rck +sqv: czz tvz ntb fkm +hbg: sgq +tmd: vbv fbp fhx fqk +sxg: nzq skr qpg jzr +ngp: jsp +hxm: ncf psc mzq prj mln +vcg: lrv +hjp: scr cdd hvb zcl +gkb: bfz rgh +psr: mnl ghm trx xxg nsl +pcv: kfk msr zxf +npg: dnx +pnp: zvd lxh +znz: htl +mtb: mgl rcg fxl +kbl: vfp +tmg: mhx jng chd +ggh: fcj cjv rhs tts +sbx: lvn mfm +rjv: sjg lzp xzm zpf +jzr: vxb bkc zgd +lpb: lgb +prh: tfg +fgh: mgg lpb ztv dbm +dmr: mhm sgp +lbh: jmb fqk +ckr: mhx xdg mzm ldd +ltz: pxf bhq hsc nst +jcp: rmj dzl pbq +xcs: ncq pfd +sxz: lgz nqr qtp +mgr: vcg nzg lpz +spz: fjr hpd +tvt: vgl vtl +zxh: tqq vck xnt xph +fff: bkc mvc kst rgh +qfd: tnz dft vxg dhj +cqb: gtd hst fzl jhh xdc qhd fdq +zcj: jmr vcm zqk qct +nsj: gck mdh scb nms +qgt: zvc kbb +smf: pxz srf pzp +fhx: skh +pnr: jjz +sqh: qpg xlx +cdd: ljz +lxg: fql bzv kmq +tqz: rdq hqv mkc zfj +qfp: khl +cjh: kss nhx +fjh: qpp klz +dkh: jbh trz plf cxd psg +fmb: hhk gjd bhq bjm hbt +bdb: gpj crs +jmp: dcj +xgj: lrj qnt mls qpc tvk +jfl: cst jgv +zzn: cpv qrj +lqx: plp vhh jlm +xph: ccp czx dkm +pbs: xnq mjg +nhm: jgg lpf znd rzh brt +bll: htb fct bsh nvh +krj: gzd rpg vch qcq +kld: frj jcz +bpt: ftd rms +smr: mkv rqm cnd +qfl: hcm khs qfc jxz +tnl: lrj ccp +jpr: zdf ccf +dls: lxd zvm fkc vgk +hvb: gtj +bpk: mfm +kvq: ftn mcg +sqb: fjh lbh zbv zpk ggt +xjb: bpt gjb +cxr: qvr lgj rlg +rxf: lgb glt znb +jfk: xxv fpz jnf zbq +fnc: zrx +cmn: pdh ttq pfs +cpg: pdq jgx rrl +mdn: vfp +srg: qth rxx pgz mvb hvd +hjt: ftn fbp lcq +rpg: flb +znp: xhm +zmv: hzv bsp dtn lqr qrq +qmv: fcm +msn: ngp zhs trj pkv +plt: ngs +cqn: tpv crd czn +hnb: kqj kbb +zqk: xrl mgh fpn fqk pfs +rks: jzs +xvt: ckx hhd rck vvg +ffx: gnv bkp +gfd: mqx cxr sbj mjb kgt +qtv: ckm sjg +llv: lrv pnp qtl srf +bxt: pnt vhc +txp: rlk nvh dtx +mjb: xxm kbd jqd +ltm: fsv vss lcq +xnq: mdn vtm dtf +nvz: pnr zvg vdq pbg fgs grg +blj: jqf llx fbp +kfq: jbh hnr hbg cft +tpj: tbp prh gtj fgc +slk: vtm pnt qpc +xdz: znz gsm +nxh: fbs +xdd: nqt vdf +jpc: vxt zrl +bmm: pcz +frn: bxp mtb hrh vss +tvs: htc jzq +hql: shc fsv +hcq: trr jjg brt fhx +dkk: kxv bsc +vmd: kkt jls znj +phs: gsx drk tnl +rjd: vfp bsh vtl +zrl: dtx +vjv: tqb hzs plf rxx pmd +szc: vft gtj gxn lqt +qvj: klv +nfc: dvk +smv: npn pnt +lvb: trp nxh sgp kgj +djz: fqd +tqq: zph +kpd: cqn cvj kss jzv +zvc: shf +kst: lhz fbl nzx vvd +hpq: sxm vtl fkc +snn: kxv xrz mpn +mls: cdd +fzd: vqk rlg rtt qvz +xgb: bnt +chd: fhx +xhc: znl nsh +kgv: pgz tbg ngm +svq: tsq zfq +hgh: mvn pcz trl tvg +lxd: gck zgd +mqk: qmv fpv +pcm: qps +nnm: zrx xzq tqq bfk fdn +dkf: bqx +pfc: fpf dlb +ctr: ckc +bln: xdf +hfx: bbl mpm tkx +zpv: fnc +bpg: fbs prj +ndn: dgg glv +hcc: flv npf rxd +dbj: vdf cfm fgd +pht: prp gkr vvm +jbm: hsk +nhj: ttd frj +cnd: hbv +gbp: jkk dvj vpg zzh pzx cdc dph +rck: kbb +xxv: stc dtx +crd: vrs ksj +hmr: zrf sbh smh +fxx: gkx qvr sgq +ddj: rdn tmg ggs hbt +krq: drc crs +xsb: frz rfp vpd htl qvr lmq +dnf: mzm qsm sbm gtx +xrf: hbv +zxj: npg +cvs: vfr +qhb: vmf ddd bpg +lxk: xcj +lvf: qsn ztv krq +lsp: fkj fbx mmp qqc +rfv: fll vrs +bqx: bpp +pnf: btd xvd qqs gkn mvt +qqh: blj jqs jmp +tgz: lxk +hrt: mpd +nzj: lrv jzq hnq vmh +vgt: hrt +vkh: jbh tcv jcz +jzb: jsc rgt gtd jtt +vtq: kzx zzg +jhs: ktc fsv +hjs: kmk pmf +lpg: qpc +kjr: lpr vkh jmb ccd +bpl: xgr ndk mqk vhh gbh pzp mjg +fgj: mps mrg +zpj: mpn lpz nsj +qhr: zxf vlf mkz htl sqq sbj +jcz: fxb rks +vgs: skl rjh ltt cxd sdk +xzq: bdc +tll: dmf mls hqv rvp tmk +nld: bbs fkv plh +lvx: rxh rhn tqq dnx hcc +xdf: gqs +lss: nvk nvl +bpv: qkj jtt shv +plk: hsk dqv sgp gmh skm +qpj: glt ksj dqv stc +znl: drk +sqq: tsk nfc vtq qfq +plf: trq +vpv: frx jft +xnp: pzg ffr tcv mhn dzx +hgv: gtj xrf sck fxp +sph: sqh nnd dsp +xxg: rhp +lqt: bbl mnz jfv +phc: lcq xdd pcv +zmz: jdh zrx +brd: xvg zdf +rrl: fns sph rdk +xbm: zmk dqv jvv +hvd: ntm +dhl: shc +pnv: qpj ndl cpg bxg smg +hhf: zxf bhl +pxz: lxh +rxh: hnm xlx +bsx: czn mkv bsh +ltt: mzj gtf +kkn: njh jnf +zls: ljh gqs htb gbp +rkb: ztk kss scb +xpr: xdf +tzc: tcn zxj ccb slk bsh +fpz: xxv mct sck +bmb: gtx fck lms ttq +lms: kzm +hvz: tqv prj kbl dqv +ksj: vhp zxj +rxv: xfz dsh qpq +hfs: ckc tgz +fdg: pbs nvg cjv +vhf: dbj mfn lms dlb +djv: lgb nxg jmc +hkf: ssz kjc mcg kbb +ssz: qrj +zcb: ggs +kff: fff jmc lkl +glt: blp rnm +btq: cvj hsm vxf pvl +kvt: tzf pdx bgx +pgt: xqb kng fcj hmz plh nhz +kzd: slr +mgg: lxh cst lrb +vbm: pdx jpj hnb +pnh: tmk rps pcj ksj krk +kvz: gpj dmq rfj +zjv: mkv bkc ptl ptm +tqv: qvj gxn +zkp: vvd +zkb: jdh pvl +nrt: hxq llh jsm +sbh: chd +mcg: bpp qpp +rbd: bpg ljh jlm ptl lqt vvm +mnl: xsk vtq zgr +qhn: qjk sdn zrf hkm +rsc: jrl jtt vqm zpf +bkh: qvj grs +fdm: ssz dxd cxr +dxm: cnd dmr vgt +qzk: lhz crs fnc sgb +nhx: mjg pvl +hjc: qzl clt mps +mqf: fkj +dgd: ghm trq +vxj: qzl +fkm: bqf mdh xhc +gxz: trx gjd lcq cpv +krg: cgc dkm zbs vmd +dpl: pnj zcb rfp qvz +vbv: gqb +zkm: vvg +ttr: czx mfr tvz fmm +ctv: rht csd +tpn: gbs gnv zxs trl dtz +bfk: bzv jls lxk nvr drg +fzl: nfc bfj +fct: skr +bck: pcf bfc +xvs: fcm mhm hrg +ndk: nxg vks +ccc: zpk lvn ngv +sqm: lds zcl ndk jbm +xcf: tvg +vqk: vxj gvd xkd blc +lvn: ngs gsm +gss: hjs cxd xfz +nzg: snt vbs fkc +lqp: kqr vtj +drg: txj ksg szr +rms: plt ggs glv +lzv: snn mpn mqk +lmq: fvr fsf bmm +brf: cvs vgk +zft: nsl jzz +kxd: sxz dmb +xkd: skh kld +smh: trx +qhd: ngv xsl flc +drv: mkl jmp vzl xdz qxp +ttt: jgn vmd lss pbs kbm +nfd: qfs tmk ncf bsc +sbm: vdf cxf dcj +jql: kfk gmv +ptl: hzf dph thr +pzr: rzh gjh kgf +jgn: kgd +rlx: hzv dzl dxd jnj nhr +stk: bkp qqm zxs zkm +rlq: prh tsr glt +bnh: jpc slb +zmk: zmx npm txf +mgh: sjg hrj +xrk: xgr gqk pvp xcx vvt +fns: dqr rdz +qcm: nmm csd shr xmv rvh bks +lgb: xrz +skm: hfx plp xlx +bcb: bfc zvk xfh sjq +znj: gvs +zdq: cnj qdr vgk +gts: jjz bsr +sxm: mkc klv spz +cvq: xlx ckc +dcj: sjq +tsc: kqj +dcq: vxt tvz +ktz: cgc bkc dvj kqr +mrm: rgt ckk rpg fgd +fhd: xqm ckt bdb kng +qct: zdf +zqt: mkc drk +sdn: rht fvr +kch: sgz gxz zfq dft jbh pzr +bkc: hmz +qpq: gps bgx kzx +hzs: shv lzs +mht: rxx bpp fvr +nqt: mxf qmh xnr +kmk: mjv +xvn: qgx +qfq: shf +jrl: xhd dkp grd +bxn: mdh vfp +mpm: txf lrb jkk pvp +cmg: mpz gnv sbn +pgz: plt xdp pbd +zvz: zmp cts tqm pcf +pvz: qzg tvs jnr mvp +pqt: fct qfj +hjx: psg sbh znp xpl +tfk: tcv fgj cxr qpl +fck: frt ppr hrl kgv fxx +cvg: drk zpt +bzs: nrk dmn msr vcj xdg +lqm: llx vbm bph grq +zcl: kbm dvj +ckh: pnj qfq fhx sgz +mzj: fnm +tcn: mdn gts dtx +xdp: fbp qrj mtb +dsh: qrq +hzc: xhc zdq srf +xzm: bxp +mzd: lqr zhm qct lzp qqc +ggt: dkp ztc pks pnj +ccn: kcn hvz qhb llp +vdf: lkc +hsc: rff qgf sss +ffd: ljz bkc +ncz: nvr pcj jtz +cpj: tpn jsm pvk bxp +qkb: jpr xjb fdb +ldq: gpj xzq zkp +znd: tzf ftd dsh +tbj: bfc jsc cpk cxf +xfn: nxg vzp nzg +jxz: fxd qxp +kzx: fxl +mjv: kjc +ckt: bxn qfj fbs +kfr: ffx pmd nzm ktc mxf +fbx: shc +hcg: ztv jgv nsj ttn +vrs: zrx +mgn: cjv zkp nhz bsc +xbk: lrz +lpf: qvz +shk: vvd zvg +rhn: rhd cjz czn +qvr: rcg +bjl: fhx xgt znz hnr nhj +xzd: gjd ntm +njs: qmv +ntb: dbm jdh +rjz: fkv mck zmx lpb +gvd: vbv hxq ttd +cjv: lrj +tcc: mrg vxg +hsr: lgx znp pvj +zdd: nrg mtb +qzq: rdk tzs vbs mpm +vtj: dnz +fpv: kcj +qzt: rht ngs mrh +sdq: xdc ttq mhx kjc stl kvq +vcj: slr dvk qvz +gkr: qmc cjz gts nvc +bfr: mgl fvr stl +gqt: jsb plh diff --git a/2023/day25_snowverload/tests/sample_input b/2023/day25_snowverload/tests/sample_input new file mode 100644 index 0000000..bbfda0b --- /dev/null +++ b/2023/day25_snowverload/tests/sample_input @@ -0,0 +1,13 @@ +jqt: rhn xhk nvd +rsh: frs pzl lsr +xhk: hfx +cmg: qnr nvd lhk bvb +rhn: xhk bvb hfx +bvb: xhk hfx +pzl: lsr hfx nvd +qnr: nvd +ntq: jqt hfx bvb xhk +nvd: lhk +lsr: lhk +rzs: qnr cmg lsr rsh +frs: qnr lhk lsr