add day 8, part 1

This commit is contained in:
Christian Ulrich 2022-12-08 16:21:18 +01:00
parent ed3e4ffaa7
commit 02a1b2b68b
No known key found for this signature in database
GPG Key ID: 8241BE099775A097
4 changed files with 200 additions and 0 deletions

55
day08/common.rs Normal file
View File

@ -0,0 +1,55 @@
// Copyright 2022 Christian Ulrich
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
use std::io;
pub struct Forest {
trees: Vec<Vec<u8>>,
}
impl Forest {
pub fn from_stdin() -> Result<Forest, &'static str> {
let mut trees = vec![];
for line in io::stdin().lines() {
let line = line.unwrap();
if line.len() > 0 {
trees.push(line.bytes().map(|b| b - '0' as u8).collect());
}
}
Ok(Self { trees: trees })
}
pub fn dimensions(&self) -> (usize, usize) {
(self.trees[0].len(), self.trees.len())
}
pub fn tree(&self, x: usize, y: usize) -> Option<u8> {
match y < self.trees.len() && x < self.trees[0].len() {
false => None,
true => Some(self.trees[y][x]),
}
}
pub fn line(&self, index: usize) -> Option<impl Iterator<Item = &u8>> {
Some(self.trees.get(index)?.iter())
}
pub fn column(&self, index: usize) -> Option<impl Iterator<Item = &u8>> {
match self.trees[0].len() > index {
false => None,
true => Some(self.trees.iter().map(move |line| &line[index])),
}
}
}

100
day08/input Normal file
View File

@ -0,0 +1,100 @@
233314113252402225351463633453424226362041164065666135612411011040522031304523540110205035014411044
332122310405013102405106464353665644607664150663467462700534002161131361415444052114131045140243410
440000154211143151036643465424430437150326344660672414322263612306613505030214413503140154240143331
323343255421523302132452525040120535030306056101323626031642774451731442413053643256135313042003043
442005315501104446243554125512523705520741532675611167103501123704102401231225310004344454441311331
332130414130356034341366056652625210567702243041400445367704317060210626605415512605335350520122311
324030243443122504054434240071266742352112321376000244606511532513331523563532353420154204241013554
405514351330112521566052015217062045756373753646835340126272647475527567717322610632203041311303430
335344112324634006053114070623702457531233080182014252513623435405053472452142020411651513420241150
242041131336116162436425631055271632161034811060125876160151764545471725530572712055225156042443422
510115143602101614215644471437202165862138121575207306363288027622104656656232657106303540123445433
323023452213641660103641556437400327347513153233743771336775454828804123702623477265225140631521412
202414114362551307121033522362685234048874113835556780630765201243481547353207660367310163062450444
251210540002101157605104272102100805434031582776285412180762321556517203802774651440303062465423305
415154424136606622417173367536300675207863456056626612502574128212038664377073051707565151352430241
422343416235314110055766487664127721622002932278537772434781110282275624223646255613020563013414324
402501442363526063250415576530161587636599439927185751837499351077528874028027725403237453225064102
504234134044257264655215060321538257751387982248126653446534117721070521632241341327330746014516212
046421106227215776577005025532583722724216237543578962475762466531136887322178170357170305360651141
055031536466374206237511402485882788415741555457619525942245935594343888851226034246745555525105303
313316632007533014153074787161584766685843475942726193487858652825242238106152063072370317116502432
345426660702445442335226831889943991158617188464619968385935798291964336101667488024624136722351004
553433023431367776013442510449498261312593877587925648886725526355324173132272087282444404673023212
156321141760325157812461514459436947142926654837377323496455524659313115197526460314171035362510231
255120642613302053266486441787818289142646555466227786469549465753577142215522110616726724621755043
334560516360223658024601577515767963496326366868843234647892475283342192849565184146074327226212463
351153721766750360870230632513718533288747664849867792728752858296473818827894546842165222662660316
230546472451664022018817486253724286896847769324654739253839985376855756726394310051213741574334634
240604111313412778575138553583993533754688392955365776855668274427545426777852711683051850766130035
612053444440242110747524697575138856763564432993786937663252964632522297343191877616788702776256531
213210746050611853364362496895533938487867659678984548544999789999252968144975244772045683045163143
234313560047266766104657929337338747939999549989343339775674649843878538256756297465206356607215721
541330056702266326645419617828852697233569954595594373743435783473477458272526351331155042164020032
140412541255011411271525629485342852659763893333568788878686877387434739657433158924624635520312150
556450111785818650834747363432795446558935634334688647986889543767825728745991426532778554774250041
046374536364502613174368347367376484886386459583593967639436864647827484753857757357047128547756242
655764564731052057576529129964629339964949833467658766644456934553679432454423318918284774722205121
301454635173026337889714886368752544354576898644765747749593399993443244885693658957270520386432731
613651341801476361933539945247365669358764655966668996656667973574449468955773393241131553833236721
042712127874888396848539559356923856975699558476695477574879649457344544586753161376200083775010372
633571133050088089565169284347688865568347469855686456948898869676734992839954519559214335640327013
172043723757200297443165429577876637868564587665756749555668684974876324328894776283612126381240111
635125136468188597197264372853466657935845654969889595996546968735445775435645812218328362205464515
656713007810654782857485344549587333657698446778779649598947986469666454469269555718555500650676011
630073065257712132592797837839439883385447879768997677977956469988597434494722784121685628415221204
444604034821608779684622777623558743884886456886957579576977858998653784523662941495476424336113773
514217671037186833491983278925346394784797648797698665967689974439553895999834522263288078771344552
021015255420302927289942773454777353967589988997567586785896579989679678247998851883197521625052130
421020702178063299133439633496746947998454998766655968999899446783547887482855713278711117821233107
114364606446783776565749269624677945778789678679777777886755497459955637294537453616518784767252223
142046260522656474665234998643755538575585667687579557758887565777974637389892415231713727714020545
413262342277803134611736838553467587864496795555768658557598695666533579454964336395296454485042443
204517185630034591417397997875956734665779995669788556788867949657786895495638811945649547400371307
174033605718865969171853766365888998784497996577888589689477575486489599887526816741551681644861060
063224685827512324137576693964389734944878776689697878975777568576888374227623832471753857414056670
745313234117087656527378237327965487387495769997565976887546785886477554653439376446681216706565573
714221627364867314579127862985967974769475946858556695875745779584938862235922341138325687134671324
235137535058112125486715389748736438398876596577887698784464594585565475969977691455623226423203660
331457736838274583155152898236648886649484885689575478878859449534476546585873369917917603680222744
370056553104404574421729223659546734366977645685779476846478896477486329567528693841705350032460301
012046147400171288423168662683944356977758997457588769489878697875636833272395415686405718542670511
262552341358752126152124869842937539864957956664896875844667973579966523479295826721313375133257021
341335311104544323385654534727568873565755546974875679488749436576963238488492321632936002023135437
615306301262148803186235472539894694565945596584665544954959389566469239372486931536222011310441436
324234323647385703932647765832954885887394937486885966935453639473679586767584874836377576245127406
607164142714103623815198749329787575443985479863553945758558959498828382965456286964707151450421625
314465066533633057228986634877635684496949577394987736868947454473842782594226393615334352826715141
536475143305424208759752363667664867845838863986454395453978597925332488579511898801816403500125341
600436437024871886647399158842535329649445587579746788759559564329954295266229924951756877470326446
635061431072367818521728582256787599349759447773957754769437873366692627645595542612842717645730302
251607161407032570875153116448595364788888378855675796658956867972396653145239427853001770112657603
520241640710420727048842416277438383273627564337797943589249474727857339824479251678702445344250203
506023425206020443136017159716969548233444659552973699328436724666925167146818911207262175137364612
442525337116108025845215346249313587956988464638548455829596548637338122164362510653537202133162600
623261232770026480642481695826472689876524548894353286453262528934387623416282466608203617473042451
626053201167043156740764734514534985388485442264596935478566658482829581156117030012081322032200121
515113523713157076317332585859135277147225933537378925962628268962323487376155347083215167110255554
643536511610472445252441712381625244353195223785935227686229495474181892477324203217374633002550026
153316344605375470614626642719443813563119365997536454752526938116346697801468177321355021471120515
010334311035603565003056106843521955633914195866275698547136967639217264457708135633577350770316135
351656015235033300075252446207592216329119342698142528782475484976514664823836254046377242355203231
522341020414273625444887743684716565489521553184979199653378924268741480405417451447044277355321421
320440214437322574221247068377611333151334766751972378176217877564457826632646430162364212550024162
140006436600523345517508215782380433418514688293966641916347884224234845031257747444644402460030420
104146605633362747562251487583451148253612867252927843577181415070521748116343064574155031564324255
103130334346503557465533100482078578137542764112232739942722778250542504456660050343333220202316205
224104423522010530242024415522604324510310083645671747433145834566115676313351317733033620325342051
434330306111002653115073507708580057557878202203186883544117540038650412834072007217050442340043025
230451225551565213004055211423448362510382160274334687381264153611307161161541343174055136520415131
345102326410332306132112553766214623524786867854606163254728785833674760574565046554641232320425233
324453112442152321362461117074604608838002887441621782406511511711643754374647452022531051110420525
543002053003201421256545767762532417627081703274583184256503570111365335442301734221343521443001212
235415514510600046234062765244344640577612404816608483334516626661775011137245042203526504552113144
232104354241603004312140061650307762345454636588020108162255100572653572030455333104521444441001334
032504101332516043103535067326435732054073207541115761605146733506251652016161600036450050551314041
101112052131531010033161261171241410642510371771443174324170123145060261426566620551630411143502140
022233151424524336433611141606565135707143053177553172244617521250201055320411606530411451334123003
234144345551514036433010066345436637404726175521270115026425067373731004102313350660213212022501014
103403251030225452432315040644602502722124614674434524653306555370426625422245263065135410325331421

40
day08/part1.rs Normal file
View File

@ -0,0 +1,40 @@
// Copyright 2022 Christian Ulrich
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// usage: ./part1 < input
pub mod common;
use common::Forest;
fn main() -> Result<(), &'static str> {
let forest = Forest::from_stdin()?;
let (x_len, y_len) = forest.dimensions();
let mut result = 0;
for y in 0..y_len {
for x in 0..x_len {
let tree = forest.tree(x, y).unwrap();
let is_visible = forest.line(y).unwrap().take(x).all(|t| t < &tree)
|| forest.line(y).unwrap().skip(x + 1).all(|t| t < &tree)
|| forest.column(x).unwrap().take(y).all(|t| t < &tree)
|| forest.column(x).unwrap().skip(y + 1).all(|t| t < &tree);
if is_visible {
result += 1;
}
}
}
println!("{result}");
Ok(())
}

5
day08/testinput Normal file
View File

@ -0,0 +1,5 @@
30373
25512
65332
33549
35390