diff --git a/day_03/Cargo.toml b/day_03/Cargo.toml new file mode 100644 index 0000000..dd71587 --- /dev/null +++ b/day_03/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day_03" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/day_03/input.txt b/day_03/input.txt new file mode 100644 index 0000000..cce464e --- /dev/null +++ b/day_03/input.txt @@ -0,0 +1,6 @@ +,what(936,615)*:who()[[[~:mul(364,505)~;&{-*mul(431,254)) select(){}#*+]mul(617,948)$mul(117,664){) &why()<,why()mul(271,823)what(674,989);/~{'+[mul(311,405),-!mul(651,968)$?;[from()+ {mul(595,193)*}]what()^mul(250,791)!mul(114,297))]$from()from(573,794)how()why()how()mul(130,657)how()select(){what()mul(676,119)>{~@{%why(105,423)mul(307,665)&mul(757,115)/'*{};:mul(800,484),[:(,+why()~mul(679,186)]#where()'~where() do()+mul(699,53))/>}mul(332,602)@)}})mul(393,425)?(why(265,628)where()how()when()mul(598,633)]>? mul(200,581)@+[$who()mul(627,543):%(<^?mul(884,432)mul(896,310)mul(49,151)#^where()^>(+-@mul(732,887)from()where()%)?@);mul(176,994):from()*;&,/?mul(436,323) what()select()->/}-?:mul(312,150):<+mul(156,680)#;who()mul(768,550)>how()>what()#why()$don't()mul(713,94)@why(26,903):}where())+mul(173,537)mul(999,212)who(447,54)how(283,784)[{)where()/how() mul(966,107)select()-mul(246,450)'&mul(669,517)where(){mul(833,144)>/ ]]}( ~select()mul(890,267)mul(255,376):)'^@^*/do(){ , :{-mul(504,930):[when()^mul(558,410)}~+why():--#:(do()&]{where()#when()}#mul(407,999)%from(250,471)don't()>'@mul(750,449)what()mul(407,714)~from()how()mul(305,743),;who()-/[ }-mul(424,849)}]from()who()how(104,652)-<<:mul(423,458)@@)%~select()/mul(860,398)%(mul(943,958))$< /#+&[,mul(412,371)when(940,34)mul(482,638)when()(from(972,898)select()!mul(831,126)%don't()!mul(157,741)/;-}&+where()mul(307,860)<'(,why()mul(649,820);mul(275,560)}'+how()do()?,]why(49,835)#mul(936,375)where()mul(60,815)?&$+,,?who()mul(241,128)>]'?();-don't()*} ,who()mul(797,221)<]-$~mul(876,802)$what()%**mul(987,371)^ mul(918,15)'mul(323,693):why()@;who()([select()from()mul(408,140)#&'#who()why())^:}mul(850,606)^mul(661,471)who(),where(),when()[why();where()mul(439,437)*when(),:# mul??}from()-mul(151,663)$select(),~}when()select(303,600),select()mul(954,887),#mul(204,473)+~~:who():how()?what()when()mul(295,834)@{@!mul(321,586)>what()mul(848,598):~+from() mul(79,54)&*from()when()&]mul(856,657)@!!?}>mul(186,780)mul(280,999)how()+*don't()when()when()}}&how()$mul(161,922)mul(296,159)>'mul(664,400)* #mul(818>>;mul(589,575)^why()mul(598,449)-^+from()*mul(168,826)##where();mul(68,484)*[-}mul(767,665)%where()+mul(323,94)#~!who()what()mul(937,993) !%#+')$mul(920,949)?]: $!mul(606,26),what()*-how()where()do():+<-,mul(854,484)]$'(~select(229,111) '#when(793,632)mul(732,170)-mulwhy())who(759,347)%$,;who()when()%mul(957,812)~when():(select()> (&)mul(573,961)what()what()#!)(where()[mul(99,37):why()(mul(297,734!-+mul(333,746)#?where():mul(60,228)#{)!who()%mul(89,999)])(>?why();^mul(359,707)*;select()mul(116,922)when():%[/who()*mul(320,991) +*+mul(493,591)-/}$mul(91,783)what()*%#^mul(806,374)where():[mul(958,335)-&&!from()$''mul(281who()*when()?%what(580,440)][+what()mul(509,540)+select()when()select(56,885)why(376,584);'mul(217,966)when()<@^+$,why()[mul(247,428)%,select()~mul(138,420)--mul(476,605){?mul(468,911)>!do()mul(255,269){who()%select()who()select()mul(36,834)!when(562,637)-@?select(933,67)how()[mul(739,400):what()]}*(mul(694,323)!^]mul(454,448)what(){>@;mul(272,610)mul(738,477);~ )from()$mul(876,457)); ;/+][from()))when()#mul(483,391)'}where()'when(609,88)from(),@why();mul(153,986)%mul(591,201)mul(738,458)select()<-<#mul(773 -?what()select()[$when()where()mul(5,483)<%[mul(499,582)~mul(163,315)what()select()mul(402,163}mul(948,693)select()mul(831,988)'}(~who()mul(446,802)how()mul(774,486)&%what()select();),^~>mul(755,126))where()mul(961,642)mul]]~when()from():'mul(858,593)why()><)mul(928,842)-)[mul(263,295)(@what()};, @mul(105,256)-#/>what()%mul(712,214)select()(from()mul(502,844)][(why()+(mul(321,154){what()[+why()mul(823,327),[when()#mul(340,443){'mul(96,564)when()what()/mul(851,26)mul(207,207)$where()##~?-why()^mul(675,26)<:%from()*!mul(327,650) mul(259,233)[(!mul(988,958)*,~~mul(251,348)what()+mul(914,701)/from()})<(^mul(787,646)?-?*what(579,540)select()mul(651,39)&#[+}*'^{mul(341,73):mul(623,630)mul(84,356)(mul(323,42)why()}why(122,686)^$what()~';mul/do()#)select()+#where()mul(23,522)%)])mul(184,346from()]select()?mul(83,389)+how(),why()who()mul(142,536);:mul(928,118)why()mul(703,997))/where()why()%%-(,mul(65,386)#select()from()+^what()where();$mul(674,585)/%'/why()[/):#mul(971,693)#,/mul(335,902)select()>,+mul(191,675) mul(522,174){(who()mul(83:&mul(484,524):](*what()!^mul(178,617)**?@do()<]!^#)@]when()^mul(727,829)+)~+,how()^do()%[what()+]mul(839,249)@^mul(104,433)'* ;}@[^mul(692,606)select())(^from()*:(mul(24,900)&(select()+when()mul(812,794)<;mul(925,341)>mul(365,784)*?^?~''~mul(275,690)who()select()[:($mul(447,489))^()*)%what()how()why(468,537)mul(77,201)();#^,>'mul(733,315)mul(850,854)@$why()(when()mul(421,536)what()'-^+>:why()mul(722,332)&from()#[*&mul(746,186)#*; /where()select()mul(376,137)'(]/+#from()mulwhat():;;~mul(229,429)%;^{ from(),@why()mul(169,569)/from()when()+<^where()mul(73,254),where()mul(84,140)}]mul(976,738)%>mul(350,459)#]'{mul(591,862) +[!(@{mul(366,513)mul(878,543)how()}mul(922,30)%select()?mul(767,176)select()mul]@[+)mul(815,681) :when();mul(87,245)*@?;why():&;<#mul(535,470){, @where()%how()mul(830who(575,955)what()#where(919,307)why()!*]~mul(233,814))<'>#?what()mul(127,180)+,where()>!::*mul(579,498*{why()mul(418,393)~#:,;mul(264,329))?~mul(743,344)':,)mul(727,235),!where()->what()^mul(236,130):mul(473,181)]select()&/-why()from()mul(121,297)?{;#[{'mul(416,389~from()-;][mul(31,555))#(>why(974,532)/)who()'~mul(486,593)'select()what()when()mul(365,633)/select()what()'@select()what(),mul(724,381)/+mul(166,268)!when(858,667)/)what()mul(133,803)+don't()when();how()mul(463,838)select(441,978)$?#{mul(317,193)why()#-@mul(410,395) /^?why())mul(504,778)(:how()&# @)$[mul(387,981))when(566,719)/who(250,360)who(137,588)mul(324,685)mul(604,345)+:select()mul(769,189)+what())mul(544,481) who()){*when()how()[)mul(453,120)mul(270,73)~:[#?what()do()'mul(412,833)#(who()>[@when() mul(133,896)(<(%from()select()'select()mul(416,503)(*}how(930,729):mul(198,432)};~,why()#+mul(925,673);how()mul(433,922<}]{(*&+%mul(872,81)^@[][)?mul(532,353)^*how()mul(883,756)do()'@mul(363,561)why(938,173)),{do()mul(940,613)#!#!%>where()})mul(582,742)#who()}]'from(628,90)select()~mul(230,336)when()%what()how()*how()'mul(390,297)mul(258,984)$,mul(67,720)#what()mul(718,797what()where()*~?(how()>]}?mul(490,457)&*]?:?mul(978,639)what()how()-'!who(),}:don't()>*mul(604,711)^-where()&] mul(879,235)where()mul(179,65)(?;)how()who()from()don't()why()how()who()!(from()]select(180,350)mul(23,319)#!(mul(789,115)from()*,($mul(231,932))#when();from()[mul(619,377)(where()don't()where(998,613);*mul(892,277)who()'who()who()mul(668,73)'where() >^(why()mul(634,416)@+[~~mul(353,482)<<[,#~-select()do()mul(802,411)how():~{[mul(364,145)^ +@)$<+mul(738,946)}why()?}+)*^+$mul(198,712)/~!mul(740,158)^<^/!mul(904,309)%]how()who();mul(884,292)who()*^+mul(683,391)/)*)-+]mul(226,37)#select()why():-when())mul(194,461)+why()+how()mul(383,917>[-(why():#/when()mul(885,707))>select()]@*do()*{#*mul(166,956)select()@-when()>%mul(692,209)+<~~what()$(mul(828,644)&why(799,466)$why()-!mul(691,598)who(868,775)]who()~~when()'mul(759,166)}what()%]](}&mul(144,589)}>mul(211,314)' why()mul(471,19)+mul(378,424)%who()~@&how()^what()~^mul(980,381)mul(538,166)@who()how()do()who(459,112)how()why()select()$@when()when()<[mul(434,460)from() *(mul(575,162)$+^why()[mul(528,793)^/when()mul(406,843),#when();mul(753,396)/+&&@]do()%what()@what()!when()how()@what()~mul(322,908)where()']-;'mul(759,320)&~/$who()[+mul(86,675)^]+how()&mul(91,996)+^mul(262,908)/why()mul(250,843)+ why()how(){)]&'#!/usr/bin/perlmul(629,107) +?+when()-mul(895*,!$;[~?/don't()';#mul(813,596){;mul(443,525)mul(568,373)mul(562,661)select()'select()#~'from(541,223) :why()mul]$%mul(235,124)where()-:from()<*@who()-?mul(268,919)mul(460,967) ~mul(71,173)(who(17,54)#where()select()~how()mul(502,446)@how():(mul(724,103)*mul ~how()how()~'%>}what()select()mul(206,702)why()%?~mul(152,874)when()where()who()<#}(^<[mul(784,415)when()#);{>mul(648,341)mul(842,838)*;from()when()'mul(334,67) /#mul(964,285)]:how()!mul(985,585)!mul(120,507)mul(679,201)what()when():@/+select()]mul(634,373)what(),'from(471,181)%%)mul(899,586)>%-{*?}]when()mul(943,417){from()^/,/why()mul(304,754)mul(813,371)&>,mul(447,797)&#$)>>{{+from()when()('}mul(166,556)what()mul(67,233)how(){mul(736,874)$,-mul(314,249)why() -how()$,where()select()mul(224when(379,562)#^+from()/-mul(755,62);-*mul(250,569)+who(307,838)+-from()mul(637,410)mul}:$$$mul(868,919)!when(){^&from()mul(587,834),mul(41,503),/!/]):[mul(266,118)<{<(&do()! <>from()mul;%what()'$>what()[mul(709,366):%why()(?#]+?mul(955,288)who()#what()mul(990,858)$% when()&*mul(409,113)/ from(),&-(*mul(456,740)do()>who()what()why()%what()[mul(810,186)mul(263,285)$'from()*:select()where()who())do()-%(why()@&mul(705,640);>select()why(61,263) {where()mul(742,869)when()mul(651,369){ why()why()how()'@mul(661,360)where()(~)mul(432,713)>/who()how()mul(86,348)select())mul(747,783)why()//>?, ^~@mul(158,203)][({select()^what()select()mul(229,945)]%~from()*<}mul(968,325)what()&do())~~how()mul(101,882)^what()<;where()>from()select(184,173)}mul(513,563)what()()&*where()$mul(442,237))mul(39,572)^*mul(753,637);mul(46,122):select()-how(974,73)/ (mul(827,817)]?where()$]from()what()^)mul(559,203)?<,where()(^>/!%mul(823,69)select()~;%~*how()!$mul(291,838)[mul(888,306)~#:$ }#^~why(270,533)mul(463,460)$@don't()mul(975,594)select()~@;who(973,38)when()'mul(665,454)mul(570,640)/([who()@who()?why()mul(97,557);([[mul(291,602)what(590,172)$}++';/mul(831,385){mul(299,25)mul(402,592)):what()]mul(49,44)/ &?~~,@$$)^%mul(21,890)}when()]+mul(696,311)<&when()when()/who()%^&mul(967,563)*@why(38,563){%{(mul(539,838)''&%)!mul(140,574)@mul(872,800)$$*[};?(mul(589,800)'[[<))'what()mul(571,216)+{!$!mul(327,56)}>@mul(179]{mul(728,336))who()*}/#from(385,957)mul(528,971)how(607,239)who()when()>mul(699,576),[where()-?;,mul(953,122why()from())-mul(50,327))&]select()*mul(191$<*}+*;%?~mul(717,832);!,-;#mul(877,863)})mul(10,865)how()>~mul(471,191)when()+;-,:#+>{mul(98,339) ,%%who()select()mul(590from()^,from(943,773)/%/(mul(498,29)+[-when()mul(556,808)$,{why()'who()what()}select()$mul(408,17)}@^}%what()when(533,550)mul(119,401)<&?select()!!],mul(800,82)~'++'-^'mul(202,735)'-;how()(why()-mul(878,380)++:,'%>select()why(),mul(517,67):(,mul(57,468)]!!?^who()'who()how()(mul(362,246){[select()@-,mul(790,848)who()/how()&;~mul(896,459)mul(244,758)^do()]*mul(393,498)how(827,483)++[;$^mul(242,357)?mul(246,74)mul(243,685)$-*how(); @;${when()[mul(507,599)'(>mul(814,895)mul(334,391)):/don't()$~,'{)#&+@mul(346}~:{,from()/[mul(545,281))[!&**/,what()mul(505,164)mul(992,413)from()why()from()#}&#!%mul(570,812)/&:&%~*who()who(),>%'#mul(849,141)mul(808,151)>'}~!>select()[:when()mul(547,749)/&+}how();when()$[:don't()from()&@&~mul(48,835)%:&){(who()<'mul(939,418):where()what()%mul(281,802)],who();^^#[mul(243,694)^[ mul(155,458)where(933,846)select()/)$>~%!$mul(412,437)mul(760,807)when()who()! what()<)who()mul(835,695)]&>when()#^mul(605,495) *)',:^*'mulwhat()what()}(,},/mul(268,328)]&mul(311,488)from(246,449):-!mul(728,913)who()]!why()*-why()({&mul(147,343)mul(87,236)from(233,81)#how()from()mul(72,161)!when()-/))mul(649,993)how()}where()where()~}do()<(mul(909,297)/?++mul(458,304)-mul(189,748):['!^%)mul(472,150)}#-mul(813,811)-who()mul(999,939)mul(748,494)why()<$$;!@{select()mul(679,545)who()!+%;mul(539,710)#}{#{do(){where()('(>*what(161,284)*]mul(822,730){)who()/mul(834,405)@-when()[why()^?#mul(651,356)don't()select()~ @+[mul(647,152)who()from(){mul(313,955)from()}{}#+why(),from(),mul(322,157)'+{^*mul(616,129)@%+where(),don't()%who()why()*#![@mul(765,206)%from()>when()where()@>mul!(mul(613,820)!(why()[[mul(195,689)select()mul(287,64}(mul(227,843){}@/^mul(755,318)mul(545,146) )select()'&mul(157,240)-!]}mul(19,327,~mul(784,50)&?mul(852,312):what(313,343)~@:where()!&,mul(255,419)when()*%do()+#'>:what(),$)mul(677,837)+)}* from()where()select()who()what()mul(997,527)#^/how()mul(213,791#}('why()^ }&mul(919,990)+%&$(mul(215,630/')&~^where()>{~mul(654,677)why()/how()when()select()mul(852,638)mul(71,501)where())/+:mul(141,473)%)why();mul(504,165)select()#,( ~mul(30,152)^where(),what()$from()>&)mul(352,484)who()?[)*]+$:@don't()~})$$(mul(795,493)*mul(523,934)-$#when()where()mul(628,695)+[mul(350,307)!-#<(don't();-+/mul(454(+mul(351,814)when()&when();%;:mul> ?/*+(['&mul(588,769)what(893,970)+ }mul(192,561)from()mul(949,495)<%%@/how()~%where()mul(240,75)mul(498,644)what(443,293)select()@'[mul(339,505))~@$who(55,600)&-mul(802,658); select(),mul(411,736)#::[mul(535,739)#}where()mul(628,133)what(){[]what()do()mul(378,833)}^[+who()when()mul(272,918)]mul(142,109){?:^<)mul(385,751){select()mul(888,606)who()who())/%;'when()mul(21,135)&'*,+): ;mul(185,209)mul(827,134)/~why()when()*@mul(878,159)#mul(621,651)mul(366,275)#!?~!>{mul(695,683);mul(625,943)-{who()/mul(358,71)#~'+why(845,349)[mul(599,523)@^mul(492,279)<)$why(),from()select()from()+/mul(763,890)^who(416,926)-@@+?~who()mul(220,104) +/<-(,(do()+when();>~mul(4,604)what()from()don't():/%who()$mul(263,144)mul(524,547)mul(751,211)^when();:;+when()mul(79,232)mul(918,973)how(449,332)@who()){from():@mul(235,405)$[select()})&when()do()*how()-&mul(679,136)>~mul(374,747)}from()mul(835,437)'when();^';/mul(197,989)^when()?+;/+mul(344,942)*%where()!from()%(mul(798,73)who(){#who()*select(628,265)$]do()>^${>why()-mul(430,277)]select():!%mul(678,453)~how()%how()/*mul(832,734)*who():/?who(156,121)/why()do()<#<$@,why()@mul(945,879)&^]&?#]where()( don't();)~*'!<+mul(286,848)~(^^mul(773,10)mul(66,770)#from()(~!::why()select()*mul(261,873)why(279,409);]}+mul(122,222)[how()+why()when()why()what()^,mul(531,742)+}}!how()^mul(937,106)&#how()~^:>-(mul(482,447)(mul(282,573)}?)mul(123,394)mul(918,324),@^+{{*@do()mul(288,561)/what()[# %~mul(426,213);*do())!+@where()&)mul(117,442)$~ $?~:why()[:don't() from()-from()>mul(818,513)how(800,358)where(),#+[+mul(463,762)mul(400,662)]#mul(689,771)select()when()>why(),*where()mul(933,332)mul(976,816))~from()%{mul(310,407)(:!(/-@!*$mul(536,576)? [!when()!^ mul(862,302)]select(336,393)@select()mul(296,939)mul(745,689)mul(162,820)((@when()when(115,188) diff --git a/day_03/small_input.txt b/day_03/small_input.txt new file mode 100644 index 0000000..2e1a90a --- /dev/null +++ b/day_03/small_input.txt @@ -0,0 +1 @@ +xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5)) \ No newline at end of file diff --git a/day_03/src/main.rs b/day_03/src/main.rs new file mode 100644 index 0000000..6cd3261 --- /dev/null +++ b/day_03/src/main.rs @@ -0,0 +1,182 @@ +//https://adventofcode.com/2024/day/3 +// +// Run command: cargo run ./input.txt + +use core::ops::Mul; +use core::panic; +use std::env; +use std::error::Error; +use std::fs::File; +use std::io::{BufReader, prelude::*}; +use std::str::FromStr; +#[derive(Eq, PartialEq, Clone, Debug)] +enum Token { + Text(String), + Number(String), + Comma, + OpenParenthesis, + CloseParenthesis, + SpecialChar(char), + Whitespace, + NewLine, +} + +// struct StringBuffer { +// string: String, +// seek_index: usize, +// } + +// impl StringBuffer { +// pub fn new(string: String) -> StringBuffer{ +// StringBuffer { +// string, +// seek_index: 0, +// } +// } + +// pub fn take_char(&mut self) -> Option { +// if self.seek_index < self.string.len() { +// self.seek_index += 1; +// return self.string.char_indices()[self.seek_index - 1]; +// } +// return None; +// } +// } + +fn is_mul_text_token(text_token: &str) -> bool { + if text_token.ends_with("mul") { + true + } else { + false + } +} + +fn tokenize(input_str: String) -> Vec { + let mut tokens: Vec = Vec::new(); + let mut chars = input_str.chars().peekable(); + while let Some(c) = chars.next() { + let token = match c { + // Text Numeric + _ if char::is_alphabetic(c) => { + let mut text = c.to_string(); + while let Some(alphabetic_char) = chars.next_if(|p| p.is_alphabetic()) { + text.push(alphabetic_char) + } + Token::Text(text) + } + // Numbers + _ if char::is_numeric(c) => { + let mut number = c.to_string(); + while let Some(numeric_char) = chars.next_if(|p| p.is_numeric()) { + number.push(numeric_char) + } + Token::Number(number) + } + // whitespace + _ if char::is_whitespace(c) => { + while chars.next_if(|p| p.is_whitespace()).is_some() {} + Token::Whitespace + } + _ if c == ',' => Token::Comma, + _ if c == '(' => Token::OpenParenthesis, + _ if c == ')' => Token::CloseParenthesis, + _ if c == '\n' => Token::NewLine, + _ => Token::SpecialChar(c), + }; + tokens.push(token); + } + tokens +} + +#[derive(Debug)] +struct MulOp { + lhs: String, + rhs: String, +} + +impl MulOp { + pub fn multiple(&self) -> Result<::Output, ::Err> + where + T: FromStr + Mul, + { + let lhs: T = self.lhs.parse()?; + let rhs: T = self.rhs.parse()?; + Ok(lhs * rhs) + } +} + +fn parse_tokens(tokens: &Vec) -> Vec { + let mut tokens = tokens.iter().peekable(); + let mut muls: Vec = Vec::new(); + while let Some(token) = tokens.next() { + match token { + Token::Text(t) => { + if is_mul_text_token(t) { + // Take OpenParenthesis or continue + if !tokens.next_if_eq(&&Token::OpenParenthesis).is_some() { + continue; + } + // Take Number or continue + let lhs = if let Some(Token::Number(lhs)) = + tokens.next_if(|v| matches!(v, Token::Number(_))) + { + lhs.to_owned() + } else { + continue; + }; + // Take Comma or continue + if !tokens.next_if_eq(&&Token::Comma).is_some() { + continue; + } + // Take Number or continue + let rhs = if let Some(Token::Number(rhs)) = + tokens.next_if(|v: &&Token| matches!(v, Token::Number(_))) + { + rhs.to_owned() + } else { + continue; + }; + // Take CloseParenthesis or continue + if !tokens.next_if_eq(&&Token::CloseParenthesis).is_some() { + continue; + } + muls.push(MulOp { lhs, rhs }); + } + } + _ => (), + } + } + muls +} + +fn main() -> Result<(), Box> { + // Handle command input + let args: Vec = env::args().collect(); + if args.len() != 2 { + panic!( + "{} must be run with a single argument of files name!", + &args[0] + ) + } + let input_file_string = &args[1]; + + let input_buffer = BufReader::new(File::open(input_file_string)?); + + let mut tokens: Vec = Vec::new(); + for line in input_buffer.lines() { + tokens.append(&mut tokenize(line? + "\n")); + } + //println!("{:?}", tokens); + + let muls = parse_tokens(&tokens); + //println!("{:?}", muls); + + let mut accumulator: i64 = 0; + for mul in muls { + accumulator += mul.multiple::()?; + } + + println!("Answer: {}", accumulator); + + Ok(()) +}