From 6868341bc482209ac736cad103ef85c22f0c6092 Mon Sep 17 00:00:00 2001 From: Roman Spring Date: Thu, 11 Dec 2025 09:50:25 +0100 Subject: [PATCH] feat: Add day 11 (without definitiv solution for part 2) --- AdventOfCode2025/Inputs/Day11_1.txt | 559 +++++++++++++++++++++++++ AdventOfCode2025/Inputs/Day11_ex1.txt | 10 + AdventOfCode2025/Inputs/Day11_ex2.txt | 13 + AdventOfCode2025/Inputs/Input.cs | 5 +- AdventOfCode2025/Solutions/Day11.cs | 126 ++++++ AdventOfCode2025/Solutions/Solution.cs | 5 +- 6 files changed, 714 insertions(+), 4 deletions(-) create mode 100644 AdventOfCode2025/Inputs/Day11_1.txt create mode 100644 AdventOfCode2025/Inputs/Day11_ex1.txt create mode 100644 AdventOfCode2025/Inputs/Day11_ex2.txt create mode 100644 AdventOfCode2025/Solutions/Day11.cs diff --git a/AdventOfCode2025/Inputs/Day11_1.txt b/AdventOfCode2025/Inputs/Day11_1.txt new file mode 100644 index 0000000..f33a86d --- /dev/null +++ b/AdventOfCode2025/Inputs/Day11_1.txt @@ -0,0 +1,559 @@ +gfw: pfg lik +bzp: nky +hzi: ewh wpa qla +cee: zmj her +qas: alt cvb hor uwp +ycy: brw ryu +pqz: uty tvj +wmg: lmz jcz kbm cpo +rxa: poy kmc +sft: lmi kid usa +nrf: out +tje: vth woa xek lec +nim: vox ysr mpg ilk +qok: bkh +jsi: gzs bkh jis +vwt: pzv +dek: yrv pxh +uco: ukv dqz +any: oyb won frr qir +fdx: goj +xea: vpy +gie: out +wcm: ctd ooe pcf +ncl: raz xlp ttr olc uxy voc +zvh: sze ncg +ptz: ibk gbd +tzb: ilk edy mpg ysr +syy: cdu vjy ycy +gfk: vpy mzs gri +khz: out +nxt: her idf nvp +syw: lmz +lry: sxr omu syw wmg +lik: zkt ckl +uxy: usb trt +xig: out +pca: aos lmm +qzg: epb coi cly +uot: rrb dmb +zxb: ncg jsi sze +ank: dhj +mfq: rxq kmc gkx poy +fdh: yfp llu +jzy: euw dar +jcz: sxm +fan: hke uot qnr +jpj: tca +dar: xek qgt woa +ypp: srd xrd +jqv: ztl nrf tca +cdu: rgu ryu +ucf: dzf fkr qzg nrc +nnz: igg cei frj +trg: ifw xyl hmy xxg +uhq: ekd diz bgr +cja: xgm nfj +edy: sok gjl +ilk: bhp jmf qas sok gjl +ldv: stl zbr +usa: dya ctd ooe pcf +szm: tfu woi dyi +igf: xrd +fgg: sxr kxu wmg syw omu +nrn: aes +tre: zpn oct grs +ctj: qow puu kzu +xet: cmx +qxf: aqq yxa nrn plz chi +dnb: zvh dtc jdb +wsw: bkh jis +hzt: vjy trn cdu +mxk: rkf +pez: cjk zzy yqx +hmy: fwj +vjy: rgu ryu +hus: xxo gsy jpy vhp +pzr: pca kng wno +mzr: dqz +mpg: jmf qas +qow: ktu zog bke +bag: goj +woi: udj +her: rwv eof lun +nlo: kcx +hor: zvk mum ngp vgp lil rrk wpm zmr qxf goa hek mll aqf +ksg: crd hzt syy hfb +hzj: tkr zkt +uln: hmi ctd pcf dya +fuk: swo +mum: yxa chi plz nrn +ugx: icr wui nnz +lqg: abd ceu jak +jpc: omu wmg syw +omu: juh cpo kbm +vox: bhp qas gjl sok +sxr: kbm +efa: xvl sue xwl +lle: cwj mfq rxa +bwo: trt fwm +ybp: cvb alt uwp vsq +sze: jis gzs +rrb: woi rxm +srd: ddh +rjp: xiq sps +uwp: mll aqf tmk qxf cja fuk lle wpm ngp vgp mum zvk fhb goa hek ies zmr goe gfw rrk lil kbc hqs eax qxn +hub: nwk +jis: any yzd fwk trg ykn cts qxc jpr +xyl: fwj +xoj: ino dwm mim +bke: hor vsq uwp alt cvb +wwk: ksg bdt +tvj: ewh +pxy: vhx +diz: xhd qok fyt abm +ajl: gzs +abm: bkh gzs +zvg: ctj dwm +iec: tvj tqf uty hzi +bdt: bni crd syy hfb +wpl: dya +lkt: spo muw +dhj: hzt crd +bgr: xhd qok +vip: kcx +ebw: ceu +rrk: ymm qgn +wxu: vop fxl +qet: vip +lyp: tfu rxm dyi +kbc: rxa mfq +dtv: pcf +cjk: yfo tds +ttr: yfp llu tqt +sxm: out +eof: bkh +kng: dks tkw dcr aos +zeh: fmh +fwk: oyb mas qir frr +zmj: lun eof +roi: aby fft +jcy: xrd +tro: out +foi: ekd lwb bgr +fkr: cly ajl coi +yqx: yfo tds +qpl: out +vop: out +cmx: sze +jak: you yfo +mla: oom ppl awl +kdd: owy +xna: jnh dsd +xhd: bkh gzs +cei: usa dtv +qgt: vsq uwp +xtb: fxl vop +gzs: rdd cts qxc aij tbu wid wzp ugx yzd nzw trg ykn fwk nyn yco any awq +rwq: ajc +mks: efa +lmi: hmi ooe +xvw: xig +ias: pzv kcx +flv: dyi tfu +gos: dcr tkw lmm dks +qxc: pkp jmi xar +sdu: wly sps +hgm: qgn +uis: out +cwj: poy ias +wzp: cmc bhl iqx znd +ibk: xvl xwl +frj: ezr lmi +aqq: aes tet +ppl: uby +owy: osv lji +ngp: mfq rxa cwj +ckl: kcx +ejt: kcx pzv ddh +pzv: sdp zlk dvf arm xna vtq ucf dek rwq ycc dnb lkf qti znr +lmz: tjx pbs sxm +yaa: cxo +yzd: iqx znd +mas: wpl pmh uln +chi: qet +lkf: qzg dzf +kid: dya ctd ooe pcf +spo: kcj +hrg: edz ztl +olc: usb trt +aqf: hzj lik +xxo: jpc lry awh +tkw: rxp hrg jqv +qdr: qnr uot sva +xws: ddh +ztl: out +rgu: tds you +suw: uby jns wah wze +dso: voc ijf uxy pym jro nim xoj fdh jzy bwo tzb mzj +brw: yfo +uty: ewh wpa +jka: izz +oyb: uln pno +mdi: pzr oct qrt +blt: lel +kkj: out +vpy: you yfo +ekd: abm qok fyt +nvp: eof rwv +kmc: ddh kcx pzv +xqt: xxo +dya: vqo ccl ebj reh ght ank uou mzr bag hff vpl wwk yya tjh afd fdx +lel: kpc qpl cqf +zpn: wno kng gos +xgf: owy yns +yqy: fam +yco: frr qir oyb won +zgx: tje euw vbw +tzm: fsj ucs wib +igy: nlo +lpf: hmi ctd pcf dya +sdp: zvh +hjt: eqr sbg +uou: jaw dqz +prf: zri +xiq: jvl beg hmg +yfo: xqt hus hdk srn tal fpm tre whm qdr ipe yqy mdi nwm pqz iec tfn +jmf: cvb alt vsq hor +plz: aes +yrv: rjx cee +wid: xyl hmy ifw xxg +hek: aqq chi nrn plz +nrc: coi ofp +cvb: hgm hqs qxn eax zvk lle zmr goe wpm rrk ngp lil vgp kbc ies fuk tmk goa hek qxf +lsq: mpg +swo: paa vai kea hki prf +tds: ipe mdi hus fan xqt nwm srn hdk tal fpm qdr +beg: uwp vsq hor +dmb: tfu rxm +whm: nba fam +vbw: vth woa qgt lec +tqf: qla ewh +clg: vbw tje +wib: wxu xvw +wly: uws jvl beg +trt: lre jry kqx +ies: swo xgm +dps: ysr mpg vox edy ilk +ipe: oct +tjx: out +ymm: eqr +tno: nlo ecr ltp +bhp: hor uwp cvb +goa: lik +dyi: bpq udj qsj +iqh: kcx +fpm: tqf uty tvj +puu: ktu zog +epb: bkh +tmk: aqq yxa chi nrn +rxp: nrf tro +jdb: jsi +lnk: brw ryu +gel: xar +crd: lnk +wno: dks tkw +dac: muw fue +xqo: qzg nti dzf +trn: ryu +ecn: zou ekd bgr lwb +nba: tzm ahp rfs +ecr: kcx +dtc: jsi ncg +mzj: izz nvr pnr pxy +osv: bkh jis gzs +fwj: dya ooe hmi ctd +bpq: jtp gie kkj +dqz: dac +ght: oii put +ucs: fpv glz xtb +wkz: ktu zog bke +vth: hor +put: rkf vcv +wpa: vvh tbp +tjh: dhj bdt +mtq: ryo +bkh: rdd cts aij jpr wid tbu wzp yzd gel trg mnq awq +nti: epb coi cly ofp +lil: xgm nfj +pbs: out +hmg: hor uwp alt cvb +wpm: ymm +ukv: xsz lkt +fhb: hzj lik +vqo: xea +fam: wkk ahp jjl tzm +tbp: fmh +oct: pca kng wno +you: mdi tfn iec nfc fan tre fpm +fuh: nwk xrd +nvr: sdu vhx +alt: rrk mll zmr gfw goe cja ies +dks: hrg +arm: cmx dtc jdb zxb +izz: sdu rjp vhx +tbu: yaa wui +yjj: pcf +tkr: pzv ddh +ycc: jnh yrv dsd +zok: ceu jak +zri: nlo ltp iso +fue: kcj azf csv +hmi: ljz vpl yya mzr fdx ebj uou +sbg: xws kgk ztw +wkk: ucs +tfn: gsy +vcv: gca ebw wnd +azf: tds +rxq: pzv ddh +ryo: igf +cpo: tjx +udj: uis +xgm: hki prf vai paa kea +san: una vcv +gsy: xwt awh fgg jpc +jro: tqt +duc: lel zie fmh +lji: bkh gzs +nfj: paa prf +xwl: hor uwp vsq cvb alt +vvh: fmh +uws: alt hor vsq +vpl: oii put fnb mxk +cly: gzs +igg: ezr lmi kid dtv +muw: csv azf kcj +znd: yjj stl wcm zbr +xvl: cvb alt hor vsq +bni: ycy cdu trn +cvc: fyq yns owy +etg: kdd ajc +iqx: wcm +ztw: kcx pzv ddh +lun: jis bkh +ozq: gbd ubd +llu: ozq ptz pzc dze +jry: vsq uwp hor alt +rfs: wib +uby: pcf ooe hmi ctd dya +fmh: qpl cqf +mim: wkz jbs qow kzu +ljz: har +cmc: zbr wcm stl +qic: dya ctd hmi +wah: hmi ctd ooe pcf dya +yis: qic fwj +zog: hor alt +kcx: qti znr ucf vtq dek rwq ycc bzp dnb lkf dvf arm xna etg iuh xet xqo sdp zlk cnt +znr: fkr nrc +kzu: ktu zog +hff: bdt ksg +mll: mtq tnh lem +vgp: roi lem +hdk: tqf tvj +euw: lec xek woa +won: wpl pmh +qcz: fwm trt usb +xlp: trt +kgk: kcx +ccl: mxk put fnb +afd: san +fwm: lre ybp wfh +wze: dya ctd hmi ooe +fxl: out +paa: zri +pkp: oom ppl awl suw +xrd: ddh pzv kcx +rwv: bkh gzs +ddh: dnb vtq bzp ycc rwq dek znr sdp zlk xet xqo xna etg +mzs: you +dvf: nky ecn +tjq: bdt ksg +wnd: jak abd ceu +una: lqg zok +voc: dar vbw euw +reh: pez +svr: avs dso stu gmu ncl +zlk: jdb zxb +plx: iqh ztw +juh: tjx +ncg: jis gzs +gmu: qcz raz voc gir ijf dps lsq pym tzb xoj eaa +ryu: you yfo tds +pnr: rjp +gjl: vsq uwp hor cvb +awq: xar jmi mla pkp +ahp: wib fsj +wfh: alt hor +icr: cei frj igg cxo +ysr: qas bhp jmf +xwt: sxr +usb: ybp lre +ndb: dya pcf ctd ooe +cnt: ecn uhq nky +bhl: zbr wcm stl yjj +ooe: vpl hff ljz uco wwk yya afd fdx tjh ccl tjq xyx reh mzr ght ank uou +xvk: yqx zzy yeu cjk +kcj: you tds +qla: vvh duc tbp blt zeh +gca: jak ceu +vsq: hek goa ies zmr gfw goe rrk lil kbc hgm hqs qxn eax mll tmk aqf qxf cja fuk lle wpm vgp mum zvk fhb +ubd: xvl xwl +jtp: out +abd: you yfo tds +gkx: ddh kcx +dzf: cly ajl +vhx: xiq wly sps +nky: zou +ezr: hmi ctd pcf dya +edz: out +tet: ltf +kxu: kbm lmz cpo juh +kea: igy +gir: pxy nvr izz +aby: ypp fuh hub +yfp: ozq ptz pzc dze mks +pxh: nxt cee rjx +tfu: bpq qsj adw +tnh: ryo fft +fnb: una rkf +qrt: gos kng +lem: uqj +raz: mim ino +pcf: ebj reh vqo tjq ank uou ght uco vpl hff tjh fdx afd wwk +nzw: jmi +nfc: vhp jpy xxo +grs: wno +hqs: chi aqq +rkf: wnd gca zok +lmm: rxp +jpr: xyl yis ifw +nyn: qir +jaw: lkt dac xsz +iso: kcx pzv ddh +pzc: ibk +oii: rkf +ewh: tbp duc zeh blt +har: zzy yqx yeu cjk +yns: wsw lji +oqe: wkk rfs jjl ahp +poy: pzv +lec: hor uwp vsq alt +eax: mtq tnh +hki: igy +ktu: vsq uwp alt cvb +pym: llu yfp +awh: kxu omu +hke: dmb szm +stl: ooe ctd hmi dya +jpy: jpc +goj: gri vpy mzs +xsz: fue muw +jnh: nxt +rdd: mas +yxa: ods aes tet qet +sps: beg jvl uws +xxg: lpf +tca: out +xek: cvb +ctd: mzr fdx bag ght ccl hff vqo ebj reh +vtq: nky foi +fyq: lji +zzy: you +vhp: xwt awh +ofp: jis gzs +tal: grs pzr zpn oct qrt +zie: khz cqf kpc +cts: znd iqx ldv cmc +qnr: rrb flv lyp +jbs: ktu +fyt: jis +zvk: xgm +frr: uln pmh ndb pno +ifw: lpf fwj +aes: ejt vip +ltp: pzv +eqr: vwt iqh ztw xws +glz: fxl xig +sue: cvb hor uwp +zou: qok abm +mnq: jmi pkp +rxm: adw +eaa: yfp +tqt: ptz pzc dze mks +idf: rwv lun +dcr: jpj +qti: foi +ceu: yfo tds you +sok: vsq cvb alt +woa: uwp vsq cvb alt +fft: jcy igf ypp fuh hub +pno: pcf ctd +ajc: fyq +jvl: hor uwp vsq cvb +jns: pcf ooe hmi ctd +lre: hor +ykn: yaa icr +pfg: ckl +cxo: dtv kid lmi ezr +zbr: ooe dya +aos: hrg jpj jqv +wui: sft cei cxo +ods: ltf +ijf: pxy +zkt: ddh kcx pzv +gri: you tds yfo +zmr: ymm hjt qgn +yeu: tds +goe: ymm hjt +rjx: her zmj idf nvp +kbm: pbs +jjl: ucs +xar: oom awl +dsd: rjx nxt +jmi: oom +ltf: pzv ddh +qsj: kkj +nwk: ddh kcx +sva: dmb flv szm lyp +avs: jzy raz ttr qcz olc gir ijf dps bwo zvg tzb xoj jro pym voc uxy +fpv: vop fxl +hfb: cdu lnk vjy trn +uqj: fuh +pmh: ooe hmi ctd dya +vai: zri tno igy +oom: uby wze wah jns +iuh: kdd cvc xgf ajc +yya: goj xea gfk +ebj: ukv +cqf: out +aij: bhl znd ldv iqx +dze: ubd gbd +csv: yfo you +adw: uis gie kkj +kqx: uwp vsq hor cvb alt +coi: gzs bkh +fsj: fpv xvw xtb glz wxu +srn: fam oqe +qxn: hzj +xyx: har xvk pez +stu: mzj eaa xoj jka jro clg voc uxy xlp ttr zgx dps lsq +kpc: out +qgn: plx +dwm: wkz qow +qir: uln +lwb: abm qok xhd +ino: puu qow jbs wkz +nwm: uot hke +gbd: xwl sue +awl: uby jns wah \ No newline at end of file diff --git a/AdventOfCode2025/Inputs/Day11_ex1.txt b/AdventOfCode2025/Inputs/Day11_ex1.txt new file mode 100644 index 0000000..8dc75a3 --- /dev/null +++ b/AdventOfCode2025/Inputs/Day11_ex1.txt @@ -0,0 +1,10 @@ +aaa: you hhh +you: bbb ccc +bbb: ddd eee +ccc: ddd eee fff +ddd: ggg +eee: out +fff: out +ggg: out +hhh: ccc fff iii +iii: out \ No newline at end of file diff --git a/AdventOfCode2025/Inputs/Day11_ex2.txt b/AdventOfCode2025/Inputs/Day11_ex2.txt new file mode 100644 index 0000000..2bd407b --- /dev/null +++ b/AdventOfCode2025/Inputs/Day11_ex2.txt @@ -0,0 +1,13 @@ +svr: aaa bbb +aaa: fft +fft: ccc +bbb: tty +tty: ccc +ccc: ddd eee +ddd: hub +hub: fff +eee: dac +dac: fff +fff: ggg hhh +ggg: out +hhh: out \ No newline at end of file diff --git a/AdventOfCode2025/Inputs/Input.cs b/AdventOfCode2025/Inputs/Input.cs index a2d1944..1e892fc 100644 --- a/AdventOfCode2025/Inputs/Input.cs +++ b/AdventOfCode2025/Inputs/Input.cs @@ -1,8 +1,9 @@ namespace AdventOfCode2025.Inputs; -public sealed record Input(int Day, int PartNumber = 1) +public sealed record Input(int Day, string Tag = "1") { private const string BasePath = "../../../Inputs/"; - private string ToPath() => BasePath + $"Day{Day}_{PartNumber}.txt"; + private string ToPath() => BasePath + $"Day{Day}_{Tag}.txt"; public List Lines => field ??= File.ReadAllLines(ToPath()).ToList(); + public string AllText => field ??= File.ReadAllText(ToPath()); } \ No newline at end of file diff --git a/AdventOfCode2025/Solutions/Day11.cs b/AdventOfCode2025/Solutions/Day11.cs new file mode 100644 index 0000000..96a2ac6 --- /dev/null +++ b/AdventOfCode2025/Solutions/Day11.cs @@ -0,0 +1,126 @@ +using System.Text.RegularExpressions; +using AdventOfCode2025.Inputs; + +namespace AdventOfCode2025.Solutions; + +public class Day11() : Solution(11, "ex2") +{ + public override string SolvePart1() + { + const string StartVertexName = "you"; + const string EndVertexName = "out"; + Dictionary vertices = GetParsedInput(new Input(Day).Lines); + return GetAllPaths(vertices[StartVertexName], vertices[EndVertexName]) + .ToList() + .Count + .ToString(); + } + + public override string SolvePart2() + { + const string StartVertexName = "svr"; + const string EndVertexName = "out"; + Dictionary vertices = GetParsedInput(new Input(Day).Lines); + return CountAllPathsPart2(vertices[StartVertexName], vertices[EndVertexName]).ToString(); + } + + private static Dictionary GetParsedInput(List inputLines) + { + var regex = new Regex(@"^(?\w{3})|(?\w{3})"); + Dictionary vertices = new(); + + foreach (var matches in inputLines.Select(line => regex.Matches(line))) + { + var firstMatch = matches.First().Value; + vertices.TryGetValue(firstMatch, out var lineVertex); + if (lineVertex is null) + { + lineVertex = new Vertex(firstMatch); + vertices[lineVertex.Name] = lineVertex; + } + + foreach (var match in matches.ToList()[1..]) + { + if (!vertices.TryGetValue(match.Value, out var toVertex)) + { + toVertex = new Vertex(match.Value); + vertices[toVertex.Name] = toVertex; + } + + lineVertex.To.Add(toVertex); + } + } + + return vertices; + } + + // Assume no cycles + private static long CountAllPathsPart2(Vertex from, Vertex to) + { + const string DacKey = "dac"; + const string FftKey = "fft"; + Queue<(Vertex Vertex, bool DacVisited, bool FftVisited)> queue = new(); + queue.Enqueue((from, false, false)); + long counter = 0; + while (queue.Count > 0) + { + var current = queue.Dequeue(); + if (current.Vertex == to && current is { DacVisited: true, FftVisited: true }) + { + counter++; + continue; + } + + foreach (var next in current.Vertex.To) + { + var nextVertex = next; + while (nextVertex.To.Count == 1 && nextVertex.To[0] != to) + { + nextVertex = nextVertex.To[0]; + } + + queue.Enqueue( + ( + nextVertex, + current.DacVisited || nextVertex.Name == DacKey, + current.FftVisited || nextVertex.Name == FftKey + )); + } + } + + return counter; + } + + private static IEnumerable> GetAllPaths(Vertex from, Vertex to) + { + Queue> queue = new(); + queue.Enqueue([from]); + while (queue.Count > 0) + { + List currentPath = queue.Dequeue(); + var lastVertex = currentPath.Last(); + if (lastVertex == to) + { + yield return currentPath; + continue; + } + + foreach (var next in lastVertex.To) + { + if (currentPath.Contains(next)) + { + continue; + } + + var newPath = new List(currentPath) { next }; + queue.Enqueue(newPath); + } + } + } + + private sealed record Vertex(string Name) + { + public List To { get; } = []; + public override int GetHashCode() => Name.GetHashCode(); + } +} \ No newline at end of file diff --git a/AdventOfCode2025/Solutions/Solution.cs b/AdventOfCode2025/Solutions/Solution.cs index 19d7b69..e29afbe 100644 --- a/AdventOfCode2025/Solutions/Solution.cs +++ b/AdventOfCode2025/Solutions/Solution.cs @@ -2,9 +2,10 @@ using AdventOfCode2025.Inputs; namespace AdventOfCode2025.Solutions; -public abstract class Solution(int day, int part = 1) +public abstract class Solution(int day, string tag = "1") { - protected readonly Input Input = new(day, part); + protected readonly int Day = day; + protected readonly Input Input = new(day, tag); public virtual string SolvePart1() => "Part1 is not solved"; public virtual string SolvePart2() => "Part2 is not solved"; } \ No newline at end of file