25 lines
999 B
BQN
25 lines
999 B
BQN
|
lib ← •Import "../../lib.bqn"
|
|||
|
cmds ← 1↓ '$' ((+`= ⟜(⊑¨))⊔⊢) •FLines "input"
|
|||
|
paths ← (<⟨⟩) {
|
|||
|
𝕨 𝕊 "$ ls": 𝕨;
|
|||
|
𝕨 𝕊 "$ cd /": ⟨⟩;
|
|||
|
𝕨 𝕊 "$ cd ..": (-1)↓𝕨;
|
|||
|
𝕨 𝕊 𝕩: 𝕨∾<5↓𝕩 # "$ cd …"
|
|||
|
}` ⊑¨cmds
|
|||
|
ParseLs ← {
|
|||
|
dirs‿files ← 2↑((lib.IsAsciiNum∘⊑∘⊑)¨⊔⊢) ((<' ')⊸lib.SplitOn)¨ 1↓𝕩
|
|||
|
(1⊑¨dirs)⋈(lib.ReadDec 0⊸⊑)¨files
|
|||
|
}
|
|||
|
dirlists ← ParseLs⌾(1⊸⊑)¨⥊⋈˘(("$ cd"⊸≢⟜(4⊸↑)∘⊑¨)∘(1⊸⊏)˘/⊢) (⍒≠¨paths)⊏⍉paths≍cmds
|
|||
|
DirSize ← {⊑𝕨 (⊑∘(1⊸⊑¨∘⊣⊐⊢)⊑⊣) <𝕩}
|
|||
|
DirName ← ∾'/'⊸∾¨
|
|||
|
dirsizes ← ⊑¨ ⟨⟩ {
|
|||
|
szs 𝕊 ⟨dir, subdirs‿files⟩:
|
|||
|
Canon ← DirName dir⊸∾⟜⋈
|
|||
|
sz ← +´files∾szs⊸DirSize∘Canon¨ subdirs
|
|||
|
szs∾<sz⋈DirName dir
|
|||
|
}˜´ ⌽dirlists
|
|||
|
|
|||
|
•Out "day07.1: "∾•Fmt +´ 100000 (≥/⊢) dirsizes
|
|||
|
•Out "day07.2: "∾•Fmt (30000000-70000000-⌈´dirsizes) ⌊´∘(≤/⊢) dirsizes
|