Skip to content

Instantly share code, notes, and snippets.

@bgayman
Created December 11, 2022 19:54
Show Gist options
  • Save bgayman/8d2ca6cf240ea328b346f2b622d82907 to your computer and use it in GitHub Desktop.
Save bgayman/8d2ca6cf240ea328b346f2b622d82907 to your computer and use it in GitHub Desktop.
$ cd /
$ ls
dir cmwrq
dir ftrccld
dir jjlbmtw
dir jpncfpb
dir mddr
dir mthvntdd
55644 pjts.dzh
dir ptzsl
dir wmqc
$ cd cmwrq
$ ls
dir dtbzzl
dir pjnghbm
16144 rvs
50956 swngfrsj.pcj
dir vhvn
dir vrt
dir zgrjmtcq
$ cd dtbzzl
$ ls
42503 ljhpmvd.zqf
dir wwpnn
$ cd wwpnn
$ ls
58541 jjdgzwnq
dir lwqgsbg
dir nztw
dir rdtjztmt
101609 sqqpcvq.llm
dir ssdlqcrw
$ cd lwqgsbg
$ ls
207528 cpqhb.jsf
38543 cqjgspw
dir dtbzzl
106337 dtbzzl.njz
302201 pdv.ppg
dir pjts
175215 pvczm.cfw
dir sbvljdh
$ cd dtbzzl
$ ls
252091 vhvn.zqv
$ cd ..
$ cd pjts
$ ls
155681 bdbfjbgt.rwg
219192 dtcz.gqt
$ cd ..
$ cd sbvljdh
$ ls
dir rdrqc
dir rtfpcswj
$ cd rdrqc
$ ls
242263 pjts.mbt
$ cd ..
$ cd rtfpcswj
$ ls
228044 ssgcjt.twr
$ cd ..
$ cd ..
$ cd ..
$ cd nztw
$ ls
30777 vqfsh.smp
$ cd ..
$ cd rdtjztmt
$ ls
276602 pvczm.cfw
dir rzbb
305089 ssdlqcrw.dgb
$ cd rzbb
$ ls
155253 pvczm.cfw
$ cd ..
$ cd ..
$ cd ssdlqcrw
$ ls
22423 vqfsh.smp
$ cd ..
$ cd ..
$ cd ..
$ cd pjnghbm
$ ls
189296 ctqfg.ljd
dir dtbzzl
dir pjts
205394 ssdlqcrw.lgv
$ cd dtbzzl
$ ls
239152 fbb.gtn
dir hlw
39308 hsnbffzf.qvc
211316 nhm.zhz
dir nztw
dir pvsjpn
230237 twjq
$ cd hlw
$ ls
dir lfqqrp
dir nztw
$ cd lfqqrp
$ ls
dir mbmfpz
dir mdhfdlw
dir pjts
dir qzs
dir ssdlqcrw
$ cd mbmfpz
$ ls
dir fsrbwl
dir lsmpw
$ cd fsrbwl
$ ls
154657 ftlc.zbr
dir ltsj
228929 pvczm.cfw
dir ssdlqcrw
234216 tdl
$ cd ltsj
$ ls
51204 vmq.sjg
$ cd ..
$ cd ssdlqcrw
$ ls
64928 nztw.gpn
$ cd ..
$ cd ..
$ cd lsmpw
$ ls
61867 dtbzzl.dgj
$ cd ..
$ cd ..
$ cd mdhfdlw
$ ls
92462 dtbzzl.jmq
239442 tczcgf.zwj
$ cd ..
$ cd pjts
$ ls
144464 dtbzzl.lnz
dir pjts
118500 swgt.smz
$ cd pjts
$ ls
173783 dvztnn
103088 jlv.pgh
39332 nhm.zhz
266947 pppfcg
$ cd ..
$ cd ..
$ cd qzs
$ ls
11155 cpqhb.jsf
$ cd ..
$ cd ssdlqcrw
$ ls
192414 gcwqcwrf.vmb
$ cd ..
$ cd ..
$ cd nztw
$ ls
313009 nwt
$ cd ..
$ cd ..
$ cd nztw
$ ls
280535 dtbzzl.grj
269725 ssdlqcrw.tqs
$ cd ..
$ cd pvsjpn
$ ls
105150 jvjb.mdd
142501 nztw.cvp
$ cd ..
$ cd ..
$ cd pjts
$ ls
dir btc
dir tpwcmvch
259357 vqfsh.smp
$ cd btc
$ ls
5264 gdjpql.wqr
$ cd ..
$ cd tpwcmvch
$ ls
141657 jjdgzwnq
15650 nhm.zhz
dir nlrq
182100 qgf.qgj
302332 qshf
244799 vhvn
dir wvnqzjf
$ cd nlrq
$ ls
dir dtbzzl
207207 gnd.vmb
$ cd dtbzzl
$ ls
271143 wjbzmc
$ cd ..
$ cd ..
$ cd wvnqzjf
$ ls
64128 mtzc.rqb
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd vhvn
$ ls
187526 vqfsh.smp
$ cd ..
$ cd vrt
$ ls
dir drrnm
dir fqr
270995 nztw.mfg
137476 vqfsh.smp
$ cd drrnm
$ ls
250912 pvczm.cfw
$ cd ..
$ cd fqr
$ ls
229272 nszfcq
dir nztw
170643 phh.pdl
$ cd nztw
$ ls
dir bqf
$ cd bqf
$ ls
9998 vqfsh.smp
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd zgrjmtcq
$ ls
109025 vhvn
$ cd ..
$ cd ..
$ cd ftrccld
$ ls
dir dtbzzl
dir fvmh
dir fwztt
22306 jngjc.mpd
190320 lnr.jhn
dir lsvvn
295676 nztw
135025 nztw.ssc
dir pjts
dir qglhlggq
dir rslphgp
247764 ssdlqcrw.jnm
dir vhvn
$ cd dtbzzl
$ ls
dir fgwh
$ cd fgwh
$ ls
dir dpdvswq
$ cd dpdvswq
$ ls
dir jsstq
248465 vhvn
$ cd jsstq
$ ls
252517 nztw
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd fvmh
$ ls
dir djcn
dir dtbzzl
303052 fbnnfsbp.zzg
77238 mdpcghq.nls
dir mvppnhr
238683 ptw
dir zdqlwnc
$ cd djcn
$ ls
8600 jjdgzwnq
$ cd ..
$ cd dtbzzl
$ ls
dir sppdjcm
dir vtnzqtvj
$ cd sppdjcm
$ ls
237925 dvfctpg.zbn
dir fghb
dir pfjdsm
dir pjts
314661 zfchfq
$ cd fghb
$ ls
280081 cpqhb.jsf
88448 wbcpnnvs.sjc
$ cd ..
$ cd pfjdsm
$ ls
256877 bssmgf
127978 drwttw
103674 hznr.hjg
$ cd ..
$ cd pjts
$ ls
191709 qhwwpzn.dsc
$ cd ..
$ cd ..
$ cd vtnzqtvj
$ ls
dir rrl
$ cd rrl
$ ls
281036 jjdgzwnq
dir lzlswv
dir sjsqnvq
245082 ssdlqcrw.smq
$ cd lzlswv
$ ls
dir dmh
$ cd dmh
$ ls
41234 hlhgn.mvr
233542 tgv.csn
$ cd ..
$ cd ..
$ cd sjsqnvq
$ ls
221327 qjncmbn
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd mvppnhr
$ ls
dir ldwv
176153 nztw
dir rmdjdqvl
dir tmj
dir vhvn
$ cd ldwv
$ ls
161179 mjsm
$ cd ..
$ cd rmdjdqvl
$ ls
dir gnztqmhv
dir lpmhfr
dir tphjm
$ cd gnztqmhv
$ ls
176043 qlds.mpq
$ cd ..
$ cd lpmhfr
$ ls
dir jrrdsd
$ cd jrrdsd
$ ls
114477 vqfsh.smp
$ cd ..
$ cd ..
$ cd tphjm
$ ls
74809 dcfmjn
$ cd ..
$ cd ..
$ cd tmj
$ ls
252001 cpqhb.jsf
49666 pqpq
139885 qpj.wpb
116339 vqfsh.smp
$ cd ..
$ cd vhvn
$ ls
89397 dtbzzl.hvp
105454 pvczm.cfw
280352 zdzm
$ cd ..
$ cd ..
$ cd zdqlwnc
$ ls
dir fbhcv
8676 jjdgzwnq
99885 nhm.zhz
234563 pjts.gdj
dir rsdltnvc
$ cd fbhcv
$ ls
71695 hrzzgwqt
296401 vqfsh.smp
$ cd ..
$ cd rsdltnvc
$ ls
41623 gcvtqf
233747 wdcssvgh.vfs
$ cd ..
$ cd ..
$ cd ..
$ cd fwztt
$ ls
96594 jjdgzwnq
245415 mtp.szl
129782 pjts.jjr
308104 pvczm.cfw
dir ssdlqcrw
155109 vhvn.smj
dir vvzsr
$ cd ssdlqcrw
$ ls
dir bzd
292228 dtbzzl.tdb
107505 ssdlqcrw
181384 tfnrpsd
$ cd bzd
$ ls
84648 brdc
171457 vhvn
$ cd ..
$ cd ..
$ cd vvzsr
$ ls
dir bcdqrs
147437 jjdgzwnq
dir ssdlqcrw
197054 ssdlqcrw.dpz
dir vhvn
dir wthshgg
$ cd bcdqrs
$ ls
297401 pspd.dlq
136072 pvczm.cfw
$ cd ..
$ cd ssdlqcrw
$ ls
293104 dtbzzl.pdh
$ cd ..
$ cd vhvn
$ ls
178932 gvrht.cbm
$ cd ..
$ cd wthshgg
$ ls
dir dppwvtmp
dir ljgszd
88822 pcmw.bbq
255776 pvczm.cfw
163501 ssdlqcrw
dir vbjsmgp
dir vzqc
dir zmpdrpd
$ cd dppwvtmp
$ ls
45608 dtbzzl.lfq
164648 gdch.bzp
65225 nhm.zhz
$ cd ..
$ cd ljgszd
$ ls
125627 vqfsh.smp
$ cd ..
$ cd vbjsmgp
$ ls
236951 zpbgb.zmv
$ cd ..
$ cd vzqc
$ ls
234565 fjfpbjjp
254986 jjdgzwnq
164495 nztw.qhz
dir vhvn
$ cd vhvn
$ ls
199196 nztw
$ cd ..
$ cd ..
$ cd zmpdrpd
$ ls
123210 bznqq.dbv
141163 jjdgzwnq
302352 wjf.tdv
92016 wljnwsh
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd lsvvn
$ ls
282867 phv.ncc
$ cd ..
$ cd pjts
$ ls
40866 jjdgzwnq
$ cd ..
$ cd qglhlggq
$ ls
19577 dtbzzl.ngb
21171 jjdgzwnq
136074 pvczm.cfw
212428 rlpjjf.lvh
dir vhvn
274669 wcqlws.ndv
dir wpvq
$ cd vhvn
$ ls
183301 cbppfp.vbc
84069 cqnz
dir dtbzzl
dir mdng
126627 pjts.pvp
dir ptqq
47594 pvczm.cfw
154978 qlnnfbvd
$ cd dtbzzl
$ ls
50385 ccgbrdmb.hrr
22427 rzlwl.jbt
$ cd ..
$ cd mdng
$ ls
dir gdqqtvnp
224013 gtv.tbz
121884 jjdgzwnq
dir nrmhpblm
142950 nztw
9710 pvczm.cfw
dir vhvn
$ cd gdqqtvnp
$ ls
292349 vhvn.nfr
$ cd ..
$ cd nrmhpblm
$ ls
52703 jbvd.mlc
78268 pfns.lpr
$ cd ..
$ cd vhvn
$ ls
274549 pjts
$ cd ..
$ cd ..
$ cd ptqq
$ ls
257967 jqppq.lgb
166450 nhm.zhz
$ cd ..
$ cd ..
$ cd wpvq
$ ls
173437 vqfsh.smp
$ cd ..
$ cd ..
$ cd rslphgp
$ ls
29192 pvczm.cfw
18984 ttpfnqvn.cdr
302301 vqfsh.smp
291211 vsvtc.wwf
$ cd ..
$ cd vhvn
$ ls
dir ssdlqcrw
$ cd ssdlqcrw
$ ls
76864 jpwvws.fwv
26365 nztw.css
185966 vqfsh.smp
$ cd ..
$ cd ..
$ cd ..
$ cd jjlbmtw
$ ls
211239 ctfhmm.ssv
230020 nztw
109641 sqtjn
$ cd ..
$ cd jpncfpb
$ ls
dir hjgwcmh
286054 pcffhsw.bdm
260831 pvczm.cfw
dir vhvn
$ cd hjgwcmh
$ ls
92277 bbjhc
dir fmst
dir gzjq
$ cd fmst
$ ls
105833 cpqhb.jsf
315858 nhm.zhz
233459 nztw
$ cd ..
$ cd gzjq
$ ls
dir prjqfwf
dir ssdlqcrw
$ cd prjqfwf
$ ls
151003 jnmgdb.rhn
$ cd ..
$ cd ssdlqcrw
$ ls
103688 cpqhb.jsf
$ cd ..
$ cd ..
$ cd ..
$ cd vhvn
$ ls
14901 cpqhb.jsf
98212 tztzq
$ cd ..
$ cd ..
$ cd mddr
$ ls
dir qpfjp
$ cd qpfjp
$ ls
dir cfhv
$ cd cfhv
$ ls
dir ssdlqcrw
$ cd ssdlqcrw
$ ls
134280 vvnpvrqb.hdv
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd mthvntdd
$ ls
dir bcdcz
dir cngbf
62389 cwtvl
dir mqjjbq
dir nhblb
6743 pvczm.cfw
dir ssdlqcrw
dir ttvgr
dir vdmm
dir wnhnwjm
dir zdvbsb
$ cd bcdcz
$ ls
213688 dtbzzl.hsv
dir lbvbc
100222 nndbhrf
115627 rqnsfbz.rmf
dir tvgclpsc
258672 vqfsh.smp
163927 whgmd
$ cd lbvbc
$ ls
224836 fpfpwtf.zfz
103806 nztw
$ cd ..
$ cd tvgclpsc
$ ls
76900 cpqhb.jsf
282820 qtffdmsg
$ cd ..
$ cd ..
$ cd cngbf
$ ls
dir hstph
12089 jqvnttq.dsh
38052 nztw.sqj
dir qrnpjz
$ cd hstph
$ ls
172788 pjts.qmt
$ cd ..
$ cd qrnpjz
$ ls
dir blzc
dir rvl
dir zvhtzqqc
$ cd blzc
$ ls
108342 nhm.zhz
$ cd ..
$ cd rvl
$ ls
dir bcrf
dir sjbr
$ cd bcrf
$ ls
182498 cpqhb.jsf
dir dcb
14228 ggsq
dir gnhvtgm
$ cd dcb
$ ls
dir zlgjzcjv
$ cd zlgjzcjv
$ ls
18316 cpqhb.jsf
$ cd ..
$ cd ..
$ cd gnhvtgm
$ ls
110236 nhm.zhz
$ cd ..
$ cd ..
$ cd sjbr
$ ls
133009 cscbp
315907 vtpmnwt
$ cd ..
$ cd ..
$ cd zvhtzqqc
$ ls
dir fglfpn
dir gtzrq
dir hfgdcf
274977 ltbzhjn
dir msc
dir ssdlqcrw
$ cd fglfpn
$ ls
39153 dvhjpfc
$ cd ..
$ cd gtzrq
$ ls
60625 sqljdlpz.wpw
$ cd ..
$ cd hfgdcf
$ ls
36016 qdvnn.pbt
$ cd ..
$ cd msc
$ ls
56601 cpqhb.jsf
dir hrz
dir vlhllqz
$ cd hrz
$ ls
241511 fhngt.mlb
286505 nhm.zhz
$ cd ..
$ cd vlhllqz
$ ls
157880 nhm.zhz
$ cd ..
$ cd ..
$ cd ssdlqcrw
$ ls
121507 dssrvr
295897 lvtwlb.whn
12047 pjts.gqc
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd mqjjbq
$ ls
157818 blbmb.fcv
119103 ccppbmqb.pbt
141463 cpqhb.jsf
197900 drhmws.fdd
dir fmvp
dir rhldnjlt
175029 vqfsh.smp
$ cd fmvp
$ ls
dir dhnn
dir dlcvwqw
131432 hnv.tlr
dir jzqt
98127 nhm.zhz
dir nvsdbjj
dir pjts
9179 pvczm.cfw
121310 vqfsh.smp
$ cd dhnn
$ ls
173921 qcjsdg.zfg
58654 vhvn.csb
$ cd ..
$ cd dlcvwqw
$ ls
285116 zjb
$ cd ..
$ cd jzqt
$ ls
104478 clmzwnf
299622 cpqhb.jsf
301236 jjdgzwnq
dir nsvlqq
136737 vhvn
dir vmp
12932 wrd.jsz
$ cd nsvlqq
$ ls
111712 dtbzzl.htn
213593 hvzlmtj.ztr
$ cd ..
$ cd vmp
$ ls
104275 jjdgzwnq
$ cd ..
$ cd ..
$ cd nvsdbjj
$ ls
180999 jjdgzwnq
219819 vhvn
$ cd ..
$ cd pjts
$ ls
111715 npzn
$ cd ..
$ cd ..
$ cd rhldnjlt
$ ls
dir ffhcbvmf
dir vprlq
$ cd ffhcbvmf
$ ls
247668 cpqhb.jsf
$ cd ..
$ cd vprlq
$ ls
168090 jmmtz.fzt
68360 nhm.zhz
304580 vqfsh.smp
$ cd ..
$ cd ..
$ cd ..
$ cd nhblb
$ ls
154794 hrgsrbnj.tch
dir nfwl
dir ptc
dir rng
50110 swtt.tct
dir vhvn
dir vlj
$ cd nfwl
$ ls
dir lqs
dir mlvnlz
$ cd lqs
$ ls
dir mbcft
dir ntmvt
dir nztw
$ cd mbcft
$ ls
78188 bdnr
194668 pjts
$ cd ..
$ cd ntmvt
$ ls
75647 nhm.zhz
186651 scsvrqpf.jhb
$ cd ..
$ cd nztw
$ ls
164920 vqfsh.smp
$ cd ..
$ cd ..
$ cd mlvnlz
$ ls
289891 wjf
$ cd ..
$ cd ..
$ cd ptc
$ ls
190002 pjts.vmh
$ cd ..
$ cd rng
$ ls
39093 nhm.zhz
$ cd ..
$ cd vhvn
$ ls
275854 hbv
$ cd ..
$ cd vlj
$ ls
dir qqqrm
203390 ssdlqcrw
$ cd qqqrm
$ ls
dir wcpllh
$ cd wcpllh
$ ls
dir pwg
$ cd pwg
$ ls
19102 dtbzzl.qvp
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ssdlqcrw
$ ls
181610 vqfsh.smp
$ cd ..
$ cd ttvgr
$ ls
dir vpcpd
$ cd vpcpd
$ ls
28102 mbb.szv
304017 rshrzjhn
$ cd ..
$ cd ..
$ cd vdmm
$ ls
95079 tssjcd.lfg
$ cd ..
$ cd wnhnwjm
$ ls
67931 mmhcgsc.zjf
22062 nqpzsf.ccc
219285 trr.vcn
$ cd ..
$ cd zdvbsb
$ ls
293736 dtbzzl.ftj
$ cd ..
$ cd ..
$ cd ptzsl
$ ls
26404 jnsdzmbd
$ cd ..
$ cd wmqc
$ ls
dir dtbzzl
dir hdzmzc
dir nmmpwqvz
dir qjnm
$ cd dtbzzl
$ ls
dir hpzgnb
$ cd hpzgnb
$ ls
189696 sbmdrbm
$ cd ..
$ cd ..
$ cd hdzmzc
$ ls
143510 dtbzzl.dmp
$ cd ..
$ cd nmmpwqvz
$ ls
276725 nhm.zhz
$ cd ..
$ cd qjnm
$ ls
202264 cpqhb.jsf
import UIKit
class DirectoryNode: CustomStringConvertible {
var parent: DirectoryNode? = nil
var subDirectories = [DirectoryNode]()
var subFiles = [FileNode]()
var name: String = ""
init(name: String, parent: DirectoryNode? = nil) {
self.name = name
self.parent = parent
}
var description: String {
"\(name)\n\(subDirectories.count)\n\(subFiles.map { $0.description })"
}
}
class FileNode: CustomStringConvertible {
var name: String = ""
var size: Int = 0
init(name: String, size: Int) {
self.name = name
self.size = size
}
var description: String {
"\(name) \(size)"
}
}
enum Command {
case cd(directory: String)
case ls
init?(substring: Substring) {
if substring.hasPrefix("cd") {
let name = String(substring.dropFirst(3))
self = .cd(directory: name)
} else if substring.hasPrefix("ls") {
self = .ls
} else {
return nil
}
}
}
enum ListItem {
case directory(name: String)
case file(fileSize: Int, name: String)
init?(listString: String) {
let components = listString.components(separatedBy: " ")
if components.first == "dir" {
self = .directory(name: components.last ?? "")
} else if let size = Int(components.first ?? "") {
self = .file(fileSize: size, name: components.last ?? "")
} else {
return nil
}
}
}
let url = Bundle.main.url(forResource: "Data", withExtension: "txt")!
let string = try! String.init(contentsOf: url)
let components = string.components(separatedBy: "\n")
let rootDirectory = DirectoryNode(name: "/")
var currentDirectory = rootDirectory
var directories = [DirectoryNode]()
for component in components {
if component.hasPrefix("$") {
let sub = component.dropFirst(2)
guard let command = Command(substring: sub) else {
continue
}
switch command {
case .cd(directory: let directory):
if directory == "..", let parent = currentDirectory.parent {
currentDirectory = parent
} else if directory == "/" {
currentDirectory = rootDirectory
} else if currentDirectory.name != directory, let dir = currentDirectory.subDirectories.first(where: { $0.name == directory }) {
currentDirectory = dir
}
case .ls:
continue
}
} else if let listItem = ListItem(listString: component) {
switch listItem {
case .directory(name: let name):
let newDir = DirectoryNode(name: name, parent: currentDirectory)
currentDirectory.subDirectories.append(newDir)
directories.append(newDir)
case .file(fileSize: let fileSize, name: let name):
currentDirectory.subFiles.append(FileNode(name: name, size: fileSize))
}
}
}
func directorySize(directoryNode: DirectoryNode, sum: Int) -> Int {
var sum = directoryNode.subFiles.reduce(into: sum) { partialResult, fileNode in
return partialResult += fileNode.size
}
guard !directoryNode.subDirectories.isEmpty else {
return sum
}
for sub in directoryNode.subDirectories {
sum += directorySize(directoryNode: sub, sum: 0)
}
return sum
}
var directorySums = directories.map {
let sum = directorySize(directoryNode: $0, sum: 0)
return sum
}
let filter = directorySums.filter {
$0 < 100_000
}
let answer = filter.reduce(into: 0) { partialResult, num in
partialResult += num
}
print("ANSWER", answer)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment