Change-Id: Id2bb764fcdcd4b345eed6a98e0d67fcb18fc1353 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7488 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
		
			
				
	
	
		
			483 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			BQN
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			483 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			BQN
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env BQN
 | ||
| 
 | ||
| #
 | ||
| # Utilities
 | ||
| #
 | ||
| 
 | ||
| ⟨IsAsciiNum,ReadInt,ReadDec,SplitOn,_fix⟩ ← •Import •path∾"/../lib.bqn"
 | ||
| 
 | ||
| ReadInput ← {•file.Lines ∾ •path‿"/input/day"‿(•Fmt 𝕩)}
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-01
 | ||
| #
 | ||
| 
 | ||
| # part 1
 | ||
| 
 | ||
| day1ExampleInput ← 199‿200‿208‿210‿200‿207‿240‿269‿260‿263
 | ||
| day1Input ← ReadDec¨ReadInput 1
 | ||
| 
 | ||
| # NB: Because distance from the ground is never smaller than zero, it's
 | ||
| # no problem that nudge inserts a zero at the end of the right list
 | ||
| PositiveDeltaCount ← +´∘(⊢<«)+˝˘∘↕
 | ||
| 
 | ||
| ! 7 = 1 PositiveDeltaCount day1ExampleInput
 | ||
| 
 | ||
| •Out "Day 1.1: "∾•Fmt 1 PositiveDeltaCount day1Input
 | ||
| 
 | ||
| # part 2
 | ||
| 
 | ||
| ! 5 = 3 PositiveDeltaCount day1ExampleInput
 | ||
| 
 | ||
| •Out "Day 1.2: "∾•Fmt 3 PositiveDeltaCount day1Input
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-02
 | ||
| #
 | ||
| 
 | ||
| # part 1
 | ||
| 
 | ||
| day2ExampleInput ← ⟨
 | ||
|   "forward 5",
 | ||
|   "down 5",
 | ||
|   "forward 8",
 | ||
|   "up 3",
 | ||
|   "down 8",
 | ||
|   "forward 2",
 | ||
| ⟩
 | ||
| 
 | ||
| day2Input ← ReadInput 2
 | ||
| 
 | ||
| ParseSubmarineCommand ← (((↕2)⊸((((-1)⊸⋆)∘(2⊸|))×(=⟜(⌊∘(÷⟜2))))∘("duf"⊸⊐)∘⊑)×ReadDec∘(IsAsciiNum/⊢))
 | ||
| 
 | ||
| SubmarineDestProduct ← {×´+´ParseSubmarineCommand¨𝕩}
 | ||
| 
 | ||
| ! 150 = SubmarineDestProduct day2ExampleInput
 | ||
| 
 | ||
| •Out "Day 2.1: "∾•Fmt SubmarineDestProduct day2Input
 | ||
| 
 | ||
| # part 2
 | ||
| 
 | ||
| SubmarineAimedDestProduct ← {
 | ||
|   ×´+´((×´)∘(1⊸↓)≍(1⊸⊑))¨ (<0‿0‿0) (⊢∾((⊑∘⌽⊣)+(⊑⊢)))` ParseSubmarineCommand¨𝕩
 | ||
| }
 | ||
| 
 | ||
| ! 900 = SubmarineAimedDestProduct day2ExampleInput
 | ||
| 
 | ||
| •Out "Day 2.2: "∾•Fmt SubmarineAimedDestProduct day2Input
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-03
 | ||
| #
 | ||
| 
 | ||
| BinTable ← '0'-˜>
 | ||
| 
 | ||
| day3ExampleInput ← BinTable ⟨
 | ||
|   "00100",
 | ||
|   "11110",
 | ||
|   "10110",
 | ||
|   "10111",
 | ||
|   "10101",
 | ||
|   "01111",
 | ||
|   "00111",
 | ||
|   "11100",
 | ||
|   "10000",
 | ||
|   "11001",
 | ||
|   "00010",
 | ||
|   "01010",
 | ||
| ⟩
 | ||
| 
 | ||
| day3Input ← BinTable ReadInput 3
 | ||
| 
 | ||
| DeBinList ← ((2⊸×)+⊣)´⌽
 | ||
| _tableAggr ← {((÷⟜2)∘(/⟜⥊)´∘⌽∘≢𝔽(+˝))𝕩}
 | ||
| GammaRate ← < _tableAggr
 | ||
| 
 | ||
| ! 22 = DeBinList GammaRate day3ExampleInput
 | ||
| ! 9  = DeBinList ¬GammaRate day3ExampleInput
 | ||
| 
 | ||
| •Out "Day 3.1: "∾•Fmt (¬×○DeBinList⊢) GammaRate day3Input
 | ||
| 
 | ||
| _lifeSupportRating ← {
 | ||
|   # Need to rename the arguments, otherwise the ternary expr becomes a function
 | ||
|   bitPos ← 𝕨
 | ||
|   Cmp ← 𝔽
 | ||
| 
 | ||
|   crit ← Cmp _tableAggr 𝕩
 | ||
|   matchPos ← bitPos ⊑˘ crit ((⥊˜⟜≢)=⊢) 𝕩
 | ||
|   match ← matchPos/𝕩
 | ||
|   {1=≠match?⊏match;(bitPos+1) Cmp _lifeSupportRating match}
 | ||
| }
 | ||
| 
 | ||
| OxygenGeneratorRating ← DeBinList 0 ≤_lifeSupportRating ⊢
 | ||
| CO2ScrubberRating ← DebinList 0 >_lifeSupportRating ⊢
 | ||
| 
 | ||
| ! 23 = OxygenGeneratorRating day3ExampleInput
 | ||
| ! 10 = CO2ScrubberRating day3ExampleInput
 | ||
| 
 | ||
| •Out "Day 3.2: "∾•Fmt (OxygenGeneratorRating×CO2ScrubberRating) day3Input
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-04
 | ||
| #
 | ||
| 
 | ||
| day4Numbers ← ReadDec¨ ',' SplitOn ⊑ReadInput 4
 | ||
| day4Boards ← ReadDec¨>˘(' '⊸SplitOn¨)> (<⟨⟩) SplitOn 2↓ReadInput 4
 | ||
| 
 | ||
| BoardWins ← {C ← ∨´∘(∧´˘) ⋄ (C∨C∘⍉)𝕩}
 | ||
| 
 | ||
| _CallNumber ← {(𝕗∊⥊𝕩) (∨⍟(¬∘BoardWins∘⊢))˘ 𝕨}
 | ||
| 
 | ||
| BoardWinScores ← {
 | ||
|   𝕩 (0⊸</×) (⊢-») (+´)∘(BoardWins˘/(+´⥊)˘∘(𝕨⊸×⟜¬))¨ (<0⥊˜≢𝕨) (𝕨 _CallNumber)`𝕩
 | ||
| }
 | ||
| 
 | ||
| day4WinScores ← day4Boards BoardWinScores day4Numbers
 | ||
| 
 | ||
| •Out "Day 4.1: "∾•Fmt ⊑day4WinScores
 | ||
| •Out "Day 4.2: "∾•Fmt ⊑⌽day4WinScores
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-06
 | ||
| #
 | ||
| 
 | ||
| day6ExampleInput ← ⟨3,4,3,1,2⟩
 | ||
| day6Input ← ReadDec¨ ',' SplitOn ⊑ReadInput 6
 | ||
| 
 | ||
| LanternfishPopulation ← {+´ (1⊸⌽+(⊑×((6⊸=)∘↕∘≠)))⍟𝕨 9↑≠¨⊔ 𝕩}
 | ||
| 
 | ||
| ! 26 = 18 LanternfishPopulation day6ExampleInput
 | ||
| ! 5934 = 80 LanternfishPopulation day6ExampleInput
 | ||
| 
 | ||
| •Out "Day 6.1: "∾•Fmt 80 LanternfishPopulation day6Input
 | ||
| •Out "Day 6.2: "∾•Fmt 256 LanternfishPopulation day6Input
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-07
 | ||
| #
 | ||
| 
 | ||
| # part 1
 | ||
| 
 | ||
| day7ExampleInput ← ⟨16,1,2,0,4,2,7,1,2,14⟩
 | ||
| day7Input ← ReadDec¨ ','  SplitOn ⊑ReadInput 7
 | ||
| 
 | ||
| PossiblePositions ← (⌊´+⟜(↕1⊸+)⌈´)
 | ||
| FuelConsumption ← +˝∘|∘(-⌜)
 | ||
| _lowestFuelPossible ← {⌊´∘(𝔽⟜PossiblePositions)˜ 𝕩}
 | ||
| 
 | ||
| ! 37 = FuelConsumption _lowestFuelPossible day7ExampleInput
 | ||
| 
 | ||
| •Out "Day 7.1: "∾•Fmt FuelConsumption _lowestFuelPossible day7Input
 | ||
| 
 | ||
| # part 2
 | ||
| 
 | ||
| TriNum ← 1⊸+×÷⟜2
 | ||
| 
 | ||
| FuelConsumption2 ← +˝∘(TriNum¨)∘|∘(-⌜)
 | ||
| 
 | ||
| ! 168 = FuelConsumption2 _lowestFuelPossible day7ExampleInput
 | ||
| 
 | ||
| •Out "Day 7.2: "∾•Fmt FuelConsumption2 _lowestFuelPossible day7Input
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-09
 | ||
| #
 | ||
| 
 | ||
| # part 1
 | ||
| 
 | ||
| ParseHeightMap ← ((≠≍(≠⊑))⥊∾)∘-⟜'0'
 | ||
| 
 | ||
| day9ExampleInput ← ParseHeightMap ⟨
 | ||
|   "2199943210",
 | ||
|   "3987894921",
 | ||
|   "9856789892",
 | ||
|   "8767896789",
 | ||
|   "9899965678"
 | ||
| ⟩
 | ||
| day9Input ← ParseHeightMap ReadInput 9
 | ||
| 
 | ||
| Rotate ← (⍉⌽)∘⊢⍟⊣ # counter clockwise
 | ||
| LowPoints ← {∧´𝕩⊸(⊣<((-⊢) Rotate ∞⊸»˘∘Rotate˜))¨ ↕4}
 | ||
| 
 | ||
| RiskLevelSum ← (+´⥊)∘(1⊸+×LowPoints)
 | ||
| 
 | ||
| ! 15 = RiskLevelSum day9ExampleInput
 | ||
| 
 | ||
| •Out "Day 9.1: "∾•Fmt RiskLevelSum day9Input
 | ||
| 
 | ||
| # part 2
 | ||
| 
 | ||
| NumberBasins ← ((1⊸+⊒⌾⥊)×⊢)∘LowPoints
 | ||
| Basins ← {𝕩⊸((<⟜9⊣)∧(«⌈»⌈«˘⌈»˘⌈⊢)∘⊢) _fix NumberBasins 𝕩}
 | ||
| LargestBasinsProduct ← {×´ 3↑ ∨ 1↓ ≠¨ ⊔⥊Basins 𝕩}
 | ||
| 
 | ||
| ! 1134 = LargestBasinsProduct day9ExampleInput
 | ||
| 
 | ||
| •Out "Day 9.2: "∾•Fmt LargestBasinsProduct day9Input
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-10
 | ||
| #
 | ||
| 
 | ||
| day10ExampleInput ← ⟨
 | ||
|   "[({(<(())[]>[[{[]{<()<>>",
 | ||
|   "[(()[<>])]({[<{<<[]>>(",
 | ||
|   "{([(<{}[<>[]}>{[]{[(<()>",
 | ||
|   "(((({<>}<{<{<>}{[]{[]{}",
 | ||
|   "[[<[([]))<([[{}[[()]]]",
 | ||
|   "[{[{({}]{}}([{[{{{}}([]",
 | ||
|   "{<[[]]>}<{[{[{[]{()[[[]",
 | ||
|   "[<(<(<(<{}))><([]([]()",
 | ||
|   "<{([([[(<>()){}]>(<<{{",
 | ||
|   "<{([{{}}[<[[[<>{}]]]>[]]",
 | ||
| ⟩
 | ||
| day10Input ← ReadInput 10
 | ||
| 
 | ||
| # part 1
 | ||
| 
 | ||
| opp ← "([{<"
 | ||
| clp ← ")]}>"
 | ||
| SwapParen ← (opp∾⌽clp)⊸((⊑⊐)⊑(⌽⊣))
 | ||
| 
 | ||
| ParenStacks ← ((<⟨⟩)⊸(((⊑∊)⟜clp⊢)◶(∾˜⟜SwapParen)‿(1⊸↓⊣)`))
 | ||
| LegalParens ← ((1⊸↑)¨∘»∘ParenStacks ((∊⟜opp⊢)∨(≡⟜⋈)¨) ⊢)
 | ||
| 
 | ||
| _ScoreFor_ ← {𝕗⊸(𝕘⊸⊐⊏⊣) 𝕩}
 | ||
| 
 | ||
| SyntaxScore ← +´∘(0‿3‿57‿1197‿25137 _ScoreFor_ (" "∾clp))∘∾∘(1⊸↑∘(¬∘LegalParens/⊢)¨)
 | ||
| 
 | ||
| ! 26397 = SyntaxScore day10ExampleInput
 | ||
| •Out "Day 10.1: "∾•Fmt SyntaxScore day10Input
 | ||
| 
 | ||
| # part 2
 | ||
| 
 | ||
| AutocompleteScore ← {
 | ||
|   Score ← (5⊸×⊸+)˜´∘⌽∘((1+↕4) _ScoreFor_ clp)
 | ||
|   # TODO(sterni): we compute ParenStacks twice here
 | ||
|   ((⌊÷⟜2)∘≠⊑⊢) ∧ Score∘(⊑⌽)∘ParenStacks¨ (∧´∘LegalParens¨/⊢) 𝕩
 | ||
| }
 | ||
| 
 | ||
| ! 288957 = AutocompleteScore day10ExampleInput
 | ||
| •Out "Day 10.2: "∾•Fmt AutocompleteScore day10Input
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-11
 | ||
| #
 | ||
| 
 | ||
| day11Input ← '0'-˜> ReadInput 11
 | ||
| day11ExampleInput ← >⟨
 | ||
|   ⟨5,4,8,3,1,4,3,2,2,3,⟩,
 | ||
|   ⟨2,7,4,5,8,5,4,7,1,1,⟩,
 | ||
|   ⟨5,2,6,4,5,5,6,1,7,3,⟩,
 | ||
|   ⟨6,1,4,1,3,3,6,1,4,6,⟩,
 | ||
|   ⟨6,3,5,7,3,8,5,4,7,8,⟩,
 | ||
|   ⟨4,1,6,7,5,2,4,6,4,5,⟩,
 | ||
|   ⟨2,1,7,6,8,4,1,7,2,1,⟩,
 | ||
|   ⟨6,8,8,2,8,8,1,1,3,4,⟩,
 | ||
|   ⟨4,8,4,6,8,4,8,5,5,4,⟩,
 | ||
|   ⟨5,2,8,3,7,5,1,5,2,6,⟩,
 | ||
| ⟩
 | ||
| 
 | ||
| # part 1
 | ||
| 
 | ||
| OctopusFlash ← {
 | ||
|   ((⥊⟜0)∘≢𝕊⊢) 𝕩;
 | ||
|   flashing ← (¬𝕨)∧9<𝕩
 | ||
|   energy ← ((«˘»)+(»˘«)+(»˘»)+(«˘«)+(»˘)+(«˘)+«+») flashing
 | ||
|   ((𝕨∨flashing)⊸𝕊)⍟(0<+´⥊flashing) energy+𝕩
 | ||
| }
 | ||
| 
 | ||
| OctopusStep ← ((9⊸≥)×⊢)∘OctopusFlash∘(1⊸+)
 | ||
| OctopusFlashCount ← {+´⥊0=>(OctopusStep⊣)`(1+𝕨)⥊<𝕩}
 | ||
| 
 | ||
| ! 1656 = 100 OctopusFlashCount day11ExampleInput
 | ||
| •Out "Day 11.1: "∾•Fmt 100 OctopusFlashCount day11Input
 | ||
| 
 | ||
| # part 2
 | ||
| 
 | ||
| _iterCountUntil_ ← {
 | ||
|   0 𝕊 𝕩;
 | ||
|   𝔾◶⟨((𝕨+1)⊸𝕊)∘𝔽, 𝕨˙⟩ 𝕩
 | ||
| }
 | ||
| 
 | ||
| OctopusAllFlashing ← OctopusStep _iterCountUntil_ (∧´∘⥊∘(0⊸=))
 | ||
| 
 | ||
| ! 195 = OctopusAllFlashing day11ExampleInput
 | ||
| 
 | ||
| •Out "Day 11.2: "∾•Fmt OctopusAllFlashing day11Input
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-13
 | ||
| #
 | ||
| 
 | ||
| SplitFoldingInstructions ← ("fold along"⊸(⊣≡≠⊸↑)¨⊔⊢)∘(0⊸(≠⟜≠¨/⊢))
 | ||
| day13ExampleInput ← SplitFoldingInstructions ⟨
 | ||
|   "6,10",
 | ||
|   "0,14",
 | ||
|   "9,10",
 | ||
|   "0,3",
 | ||
|   "10,4",
 | ||
|   "4,11",
 | ||
|   "6,0",
 | ||
|   "6,12",
 | ||
|   "4,1",
 | ||
|   "0,13",
 | ||
|   "10,12",
 | ||
|   "3,4",
 | ||
|   "3,0",
 | ||
|   "8,4",
 | ||
|   "1,10",
 | ||
|   "2,14",
 | ||
|   "8,10",
 | ||
|   "9,0",
 | ||
|   "",
 | ||
|   "fold along y=7",
 | ||
|   "fold along x=5",
 | ||
| ⟩
 | ||
| day13Input ← SplitFoldingInstructions ReadInput 13
 | ||
| 
 | ||
| ParseDots ← ReadDec¨∘(','⊸SplitOn)¨
 | ||
| ParseFolds ← (⊑∘'y'⊸∊≍ReadDec∘(IsAsciiNum/⊢))¨
 | ||
| day13ExampleDots ← ParseDots ⊑ day13ExampleInput
 | ||
| 
 | ||
| # part 1
 | ||
| 
 | ||
| # 𝕨=0 => x, 𝕨=1 => y
 | ||
| # 𝕩 is coordinate to fold around
 | ||
| # 𝕗 is input dot list (see ParseDots)
 | ||
| _Fold ← {⍷∘((𝕩⊸(((2⊸×⊣)-⊢)⌊⊢)∘⊑≍1⊸⊑)¨⌾(⌽¨⍟𝕨)) 𝕗}
 | ||
| 
 | ||
| ! 17 = ≠ 1 day13ExampleDots _Fold 7
 | ||
| 
 | ||
| day13Dots ← ParseDots ⊑ day13Input
 | ||
| day13Folds ← ParseFolds 1 ⊑ day13Input
 | ||
| 
 | ||
| •Out "Day 13.1: "∾•Fmt ≠ (day13Dots _Fold)´ ⊑day13Folds
 | ||
| 
 | ||
| # part 2
 | ||
| 
 | ||
| PerformAllFolds ← {𝕩 {(𝕨 _Fold)´𝕩}˜´ ⌽𝕨}
 | ||
| DotMatrix ← {
 | ||
|   ⟨width, height⟩ ← 1+⌈˝∘‿2⥊∾𝕩
 | ||
|   {𝕩? '█';' '}¨ height‿width⥊≠¨⊔((⊣+(width⊸×)∘⊢)´)¨ 𝕩
 | ||
| }
 | ||
| 
 | ||
| •Out "Day 13.2:"
 | ||
| •Out •Fmt DotMatrix day13Folds PerformAllFolds day13Dots
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-14
 | ||
| #
 | ||
| 
 | ||
| day14Polymer ← ⊑ReadInput 14
 | ||
| day14Mapping ← 2↓ReadInput 14
 | ||
| 
 | ||
| lp ← (2⊸↑)¨ day14Mapping
 | ||
| le ← ⍷∾lp
 | ||
| 
 | ||
| # returns array as long as 𝕨 detailing how many times the element
 | ||
| # at any given index occurs in 𝕩.
 | ||
| Counts ← ((≠⊣)↑(/⁼)∘⊐)
 | ||
| 
 | ||
| deltaPairs ← {
 | ||
|   addedPairs ← ((-1)⊸⊑¨day14Mapping) (⌽⌾(0⊸⊑))∘(∾¨)¨ lp
 | ||
|   removedPairs ← ⋈¨ (2⊸↑)¨ lp
 | ||
|   addedPairs (-○(lp⊸Counts))¨ removedPairs
 | ||
| }
 | ||
| 
 | ||
| pairCount ← lp Counts ⥊∘(⋈˘) 2↕day14Polymer
 | ||
| 
 | ||
| PairInsert ← {𝕩 +´ 𝕩רdeltaPairs}
 | ||
| 
 | ||
| pairElementCount ← (le⊸Counts)¨lp
 | ||
| 
 | ||
| ElementRarityDiff ← {
 | ||
|  ((-1)⊸⊑-⊑)∧ ⌈2÷˜ +´ pairElementCount×PairInsert⍟𝕩 pairCount
 | ||
| }
 | ||
| 
 | ||
| •Out "Day 14.1: "∾•Fmt ElementRarityDiff 10
 | ||
| •Out "Day 14.2: "∾•Fmt ElementRarityDiff 40
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-15
 | ||
| #
 | ||
| 
 | ||
| day15ExampleInput ← >⟨
 | ||
|   1‿1‿6‿3‿7‿5‿1‿7‿4‿2
 | ||
|   1‿3‿8‿1‿3‿7‿3‿6‿7‿2
 | ||
|   2‿1‿3‿6‿5‿1‿1‿3‿2‿8
 | ||
|   3‿6‿9‿4‿9‿3‿1‿5‿6‿9
 | ||
|   7‿4‿6‿3‿4‿1‿7‿1‿1‿1
 | ||
|   1‿3‿1‿9‿1‿2‿8‿1‿3‿7
 | ||
|   1‿3‿5‿9‿9‿1‿2‿4‿2‿1
 | ||
|   3‿1‿2‿5‿4‿2‿1‿6‿3‿9
 | ||
|   1‿2‿9‿3‿1‿3‿8‿5‿2‿1
 | ||
|   2‿3‿1‿1‿9‿4‿4‿5‿8‿1
 | ||
| ⟩
 | ||
| day15Input ← '0'-˜ ((≠⋈≠∘⊑)⥊∾)ReadInput 15
 | ||
| 
 | ||
| LowestRiskLevel ← {
 | ||
|   start ← 0˙⌾⊑ (⥊⟜∞) ≢𝕩
 | ||
|   ir ← (1⊑≢𝕩)⥊∞
 | ||
|   Step ← {𝕩 ⌊ 𝕨 + (ir⊸«⌊ir⊸»⌊∞⊸«˘⌊∞⊸»˘) 𝕩}
 | ||
|   ⊑⌽⥊ 𝕩⊸Step _fix start
 | ||
| }
 | ||
| 
 | ||
| ! 40 = LowestRiskLevel day15ExampleInput
 | ||
| 
 | ||
| •Out "Day 15.1: "∾•Fmt LowestRiskLevel day15Input
 | ||
| 
 | ||
| FiveByFiveMap ← {(9⊸|)⌾(-⟜1) ∾(<𝕩)+ +⌜˜↕5}
 | ||
| 
 | ||
| ! 315 = LowestRiskLevel FiveByFiveMap day15ExampleInput
 | ||
| 
 | ||
| •Out "Day 15.2: "∾•Fmt LowestRiskLevel FiveByFiveMap day15Input
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-20
 | ||
| #
 | ||
| 
 | ||
| ParsePic ← (⋈⟜0)∘('#'⊸=)∘>
 | ||
| 
 | ||
| day20ExampleAlgo ← '#'="..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..###..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#..#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#......#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#.....####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.......##..####..#...#.#.#...##..#.#..###..#####........#..####......#..#"
 | ||
| day20ExamplePic ← ParsePic ⟨"#..#.", "#....", "##..#", "..#..", "..###"⟩
 | ||
| day20Input ← ReadInput 20
 | ||
| day20Algo ← '#'=⊑day20Input
 | ||
| day20Pic ← ParsePic 2↓day20Input
 | ||
| 
 | ||
| GrowAxis ← {(⊢ (-1)⊸⌽∘∾ (⥊⟜𝕨)∘(2˙⌾⊑)∘≢) 𝕩}
 | ||
| Grow ← {𝕨 GrowAxis 𝕨 GrowAxis˘ 𝕩}
 | ||
| 
 | ||
| Enhance ← {
 | ||
|   inf ← 1⊑𝕩
 | ||
|   npic ← ((⊑⟜𝕨)∘DebinList∘⥊)˘˘ 3‿3↕ (inf⊸Grow)⍟2 ⊑𝕩
 | ||
|   ninf ← 𝕨⊑˜511×inf
 | ||
|   npic⋈ninf
 | ||
| }
 | ||
| _EnhancedPixelCount ← {+´⥊⊑ (𝕨⊸Enhance)⍟𝕗 𝕩}
 | ||
| 
 | ||
| ! 35 = day20ExampleAlgo 2 _EnhancedPixelCount day20ExamplePic
 | ||
| ! 3351 = day20ExampleAlgo 50 _EnhancedPixelCount day20ExamplePic
 | ||
| 
 | ||
| •Out "Day 20.1: "∾•Fmt day20Algo 2 _EnhancedPixelCount day20Pic
 | ||
| •Out "Day 20.2: "∾•Fmt day20algo 50 _EnhancedPixelCount day20Pic
 | ||
| 
 | ||
| #
 | ||
| # 2021-12-25
 | ||
| #
 | ||
| 
 | ||
| day25Input ← ".>v" ⊐ > ReadInput 25
 | ||
| day25ExampleInput ← ".>v"⊐∘‿10⥊"v...>>.vv>.vv>>.vv..>>.>v>...v>>v>>.>.v.v>v.vv.v..>.>>..v....vv..>.>v.v.v..>>v.v....v..v.>"
 | ||
| 
 | ||
| Xor ← (¬⊸∧∨∧⟜¬)
 | ||
| MoveHerd ← {(𝕩∧𝕩≠𝕨)+𝕨× (𝕨=𝕩) (Xor⟜(1⊸⌽)∨⊢) (0=𝕩)∧(-1)⌽𝕨=𝕩}
 | ||
| 
 | ||
| _fixCount ← {
 | ||
|   1 𝕊 𝕩;
 | ||
|   𝕩 ≡◶⟨(𝕨+1)⊸𝕊, 𝕨˙⟩ 𝔽 𝕩
 | ||
| }
 | ||
| 
 | ||
| MoveAllHerds ← (2⊸MoveHerd)∘(1⊸MoveHerd˘)
 | ||
| 
 | ||
| ! 58 = MoveAllHerds _fixCount day25ExampleInput
 | ||
| •Out "Day 25.1: "∾•Fmt MoveAllHerds _fixCount day25Input
 |