AOC day 7
This commit is contained in:
60
projects/aoc/src/year2022/Day7.kiss
Normal file
60
projects/aoc/src/year2022/Day7.kiss
Normal file
@@ -0,0 +1,60 @@
|
||||
(import year2022.FileSystem)
|
||||
|
||||
(function :FileSystem reconstructFileSystem [file]
|
||||
(let [:FileSystem rootFs (Folder [=>"/" (Folder (new Map))])
|
||||
&mut :FileSystem currFs rootFs
|
||||
terminalLines (Util.readLines file)]
|
||||
(doFor line terminalLines
|
||||
(case (line.split " ")
|
||||
(["\$" "ls"] null)
|
||||
(["dir" dir] null)
|
||||
(["\$" "cd" dir]
|
||||
(case currFs
|
||||
((Folder contents)
|
||||
(if (contents.exists dir)
|
||||
(set currFs (dictGet contents dir))
|
||||
(let [newFolder (Folder [=>".." currFs])]
|
||||
(dictSet contents dir newFolder)
|
||||
(set currFs newFolder))))
|
||||
(never otherwise)))
|
||||
([size file]
|
||||
(case currFs
|
||||
((Folder contents)
|
||||
(dictSet contents file (File (Std.parseInt size))))
|
||||
(never otherwise)))
|
||||
(never otherwise)))
|
||||
rootFs))
|
||||
|
||||
(var &mut :Float sumUnder100000)
|
||||
(function :SizeStats sizeStats [:FileSystem fs &opt :Array<String> path :SizeStats stats]
|
||||
(unless path
|
||||
(set path [])
|
||||
(set sumUnder100000 0))
|
||||
(unless stats (set stats (new Map)))
|
||||
(when !(stats.exists (path.join "/"))
|
||||
(dictSet stats (path.join "/")
|
||||
(case fs
|
||||
((Folder contents)
|
||||
(let [size
|
||||
(apply +
|
||||
(for =>innerPath innerFs contents
|
||||
(ifLet [".." innerPath]
|
||||
0
|
||||
(let [fullPath (path.concat [innerPath])]
|
||||
(sizeStats innerFs fullPath stats)
|
||||
(dictGet stats (fullPath.join "/"))))))]
|
||||
(when (>= 100000 size) (+= sumUnder100000 size))
|
||||
size))
|
||||
((File size)
|
||||
size)
|
||||
(never otherwise))))
|
||||
stats)
|
||||
(let [fs (reconstructFileSystem (input 7))
|
||||
stats (sizeStats fs)
|
||||
sizeAvailable (- 70000000 (dictGet stats "/"))
|
||||
minSizeToDelete (- 30000000 sizeAvailable)]
|
||||
(assert (= 1449447 sumUnder100000))
|
||||
(assert (= 8679207 (apply min (for =>path size stats
|
||||
(if (>= size minSizeToDelete)
|
||||
size
|
||||
(continue)))))))
|
||||
8
projects/aoc/src/year2022/FileSystem.hx
Normal file
8
projects/aoc/src/year2022/FileSystem.hx
Normal file
@@ -0,0 +1,8 @@
|
||||
package year2022;
|
||||
|
||||
typedef SizeStats = Map<String,Int>;
|
||||
|
||||
enum FileSystem {
|
||||
File(size:Int);
|
||||
Folder(contents:Map<String,FileSystem>);
|
||||
}
|
||||
@@ -9,7 +9,7 @@
|
||||
(day 4 (load "Day4.kiss"))
|
||||
(day 5 (load "Day5.kiss"))
|
||||
(day 6 (load "Day6.kiss"))
|
||||
(dayTodo 7)//(day 7 (load "Day7.kiss"))
|
||||
(day 7 (load "Day7.kiss"))
|
||||
(dayTodo 8)//(day 8 (load "Day8.kiss"))
|
||||
(dayTodo 9)//(day 9 (load "Day9.kiss"))
|
||||
(dayTodo 10)//(day 10 (load "Day10.kiss"))
|
||||
|
||||
1031
projects/aoc/src/year2022/inputs/day7.txt
Normal file
1031
projects/aoc/src/year2022/inputs/day7.txt
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user