d09
This commit is contained in:
1 parent
b023d0ea19
commit
18533b6ab4
5 files changed
+126
No files matched your search
@@ -0,0 +1,67 @@
|
||||
import Foundation
|
||||
|
||||
func readInput(_ filePath: String) throws -> Disk {
|
||||
let content = try String(contentsOfFile: filePath, encoding: .ascii)
|
||||
.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
.map { Int(String([$0]))! }
|
||||
var pos = 0
|
||||
var data: [(Int, Int)] = []
|
||||
var free: [(Int, Int)] = []
|
||||
for (i, x) in content.enumerated() {
|
||||
if i.isMultiple(of: 2) {
|
||||
data.append((pos, x))
|
||||
} else if x > 0 {
|
||||
free.append((pos, x))
|
||||
}
|
||||
pos += x
|
||||
}
|
||||
return Disk(data: data, free: free)
|
||||
}
|
||||
|
||||
func sumRange(start: Int, len: Int) -> Int {
|
||||
return len * (start + start + len - 1) / 2
|
||||
}
|
||||
|
||||
struct Disk {
|
||||
var data: [(Int, Int)]
|
||||
var free: [(Int, Int)]
|
||||
var csum: Int = 0
|
||||
var firstFree: Int = 0 // emulate a Deque, avoid O(n) removal from front
|
||||
var compact = false
|
||||
|
||||
mutating func evolve() {
|
||||
var (iFree, freeBlock) = free[firstFree]
|
||||
var (iData, dataBlock) = data.last!
|
||||
let fileNo = data.count - 1
|
||||
while (dataBlock >= freeBlock) {
|
||||
if iFree > iData {
|
||||
if dataBlock == 0 {
|
||||
data.removeLast()
|
||||
}
|
||||
data.enumerated().forEach { fileNo, d in
|
||||
let (i, len) = d
|
||||
csum += fileNo * sumRange(start: i, len: len)
|
||||
}
|
||||
compact = true
|
||||
return
|
||||
}
|
||||
csum += fileNo * sumRange(start: iFree, len: freeBlock)
|
||||
dataBlock -= freeBlock
|
||||
data[fileNo] = (iData, dataBlock)
|
||||
firstFree += 1
|
||||
(iFree, freeBlock) = free[firstFree]
|
||||
}
|
||||
if dataBlock > 0 { // not needed; only for sanity
|
||||
csum += fileNo * sumRange(start: iFree, len: dataBlock)
|
||||
free[firstFree] = (iFree + dataBlock, freeBlock - dataBlock)
|
||||
}
|
||||
data.removeLast()
|
||||
}
|
||||
}
|
||||
|
||||
var disk = try readInput(CommandLine.arguments[1])
|
||||
while !disk.compact {
|
||||
disk.evolve()
|
||||
//print(disk)
|
||||
}
|
||||
print(disk.csum)
|
||||
@@ -0,0 +1,56 @@
|
||||
import Foundation
|
||||
|
||||
func readInput(_ filePath: String) throws -> Disk {
|
||||
let content = try String(contentsOfFile: filePath, encoding: .ascii)
|
||||
.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
.map { Int(String([$0]))! }
|
||||
var pos = 0
|
||||
var data: [(Int, Int)] = []
|
||||
var free: [(Int, Int)] = []
|
||||
for (i, x) in content.enumerated() {
|
||||
if i.isMultiple(of: 2) {
|
||||
data.append((pos, x))
|
||||
} else {
|
||||
free.append((pos, x))
|
||||
}
|
||||
pos += x
|
||||
}
|
||||
return Disk(data: data, free: free)
|
||||
}
|
||||
|
||||
func sumRange(start: Int, len: Int) -> Int {
|
||||
return len * (start + start + len - 1) / 2
|
||||
}
|
||||
|
||||
struct Disk {
|
||||
var data: [(Int, Int)]
|
||||
var free: [(Int, Int)]
|
||||
var csum: Int = 0
|
||||
|
||||
mutating func compact() {
|
||||
for fileNo in (0..<data.count).reversed() {
|
||||
var moved = false
|
||||
let (iData, dataBlock) = data[fileNo]
|
||||
for freeNo in 0..<free.count {
|
||||
let (iFree, freeBlock) = free[freeNo]
|
||||
if iFree > iData {
|
||||
break
|
||||
}
|
||||
if freeBlock >= dataBlock {
|
||||
csum += fileNo * sumRange(start: iFree, len: dataBlock)
|
||||
free[freeNo] = (iFree + dataBlock, freeBlock - dataBlock)
|
||||
data[fileNo] = (iData, 0)
|
||||
moved = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !moved {
|
||||
csum += fileNo * sumRange(start: iData, len:dataBlock)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var disk = try readInput(CommandLine.arguments[1])
|
||||
disk.compact()
|
||||
print(disk.csum)
|
||||
@@ -0,0 +1 @@
|
||||
1012178791354059884227414319879232325738461439901378387779851518437752468679529168936396621359308269232626508136869324122534475550605864418071101975413156653674439631435948436127194792499553826016238021438471529762338860374729836038996516165317721740664923791198807457192377238450164333113686357276704297236565705645615080554045299918767178949820248292555882574664284312843376235942728171155576629425863732174463601675829051378148121684953384752359431698988158234839652248144654314125763227815886261478734234933563319814792032725829441393522976229528666192415493263040848176129387339170406293868830668819227815199582476114285799405652631824658614545377313359974426487537177689158636705232517193111920352543468325463854598447539447481479706442788223704054433729148410637336509829744876609486565713488449799962235739193395141169826460662355159069931178593629159493428240696877442494247340222346636915957512819085132038865890591520437411805674475048252095458164726845427474985624247426365990661456672865942747143619206275323981696484961020823897718416469375775384994523398184865027477246157333426021861785648282673891625125377992589056365324539151977282611958725614617965662248229985806687266982881938855093459298693359424431857248656550244156401478589414828244517935483120607035901516603162461216637567269266326948112521137058751620813171831720544032648948896322379053615550505442629690247015489773339414904312941752308287643155469873101513845285357095997311638458175581758535292737863818917424112051521831987981498941909015734571491824755063474286323846361752392060675480505457602369548028649460897380839862416192521859717010959755485565526622409663198063624726493926718485616087555436131353603420794337238283622513423915284280402127293290175623389888698836349936139794715370784725421858286368847059354646822953721912659063847587304136684820452991359020723560444387712712837034736328171777309356868236279435698478384183974994158164398314788831525065492912747143403866598429791939862691934143269799765146827089624533339748495016834349963164714810563840904081576718224639371837356930717961133956156028775265561240142791743729982780682871433059721069608415473172763754698599193947145949901829199642819660732560243045866467905276939467124754294517538360291185864498522487976077355395672556101217701536845418371811759298522349378950389040407884374533264450454925993091876816749974306054747639573078377429162240464324968868453238508351898673672017303984352876556076993895962226573760371525258584809333778693278046168846505963278322313680406828578775699765745571646280369514548128304783436625529222174918233654139188437264293542657731941367539533775476849094593269526774682522214775671898248440797374617988165961907389985693298138756842545710865534246672817233295998145665611031631343236492341035106679514844267730568469895372103761784388841435864648685636682615999362623630542175951722446744535289269028728023582543609575735150293946137455754987685426649249132081535327432353214036688876185537669596502565251842864619856898679864102712645534317625917829749052637926982747271656349998322282258260252877286259215115231072171495792456116577622180332124475375736587992234834195805868435877801035146112401440412777477711509289972151484420981189249752835541365117151270472773816899327075539292711050597897278566366298406421999447429569444764511997472954457873683012928620781415672959662242163970497642207252286237759346431915848770412491628598751610594745105175823294747975686415631294919145479464995828944360321141156144252760574220518892544477522644365529712578499217107175592750473911704370683399472559744984956169881215711896576825169784197190437992339517302624589076251365464739495944195537247630484499588676215276215278902142981043159643896545386996945453293870647132898227611268865420774636887696411263469982608234873595607472291885516996791244651442228165831446251120442418205916627354103812687834647329601730985718309429259961447390904766102653111940765695427698997269322872919848387855503550969025722335353262878854976219737226918599757280497198627064188730941791903684481411566412425358881473701434937999704897252365416996374386625386784672691457148588735190953142236775887544466431686364796423171336327349159046225796761433775193849375893950123457718288173745135876649355578634728658625231417740422597837541581768932184325499612146899820963857489322333652307664937433378511207181339544192589393572648680389629643180667475136831594134926434953066901335418865851844315121429386488317764426221553669810108513584843842346994232782214373421617699165466695684785219897940995754288579231337591548605172449514774760201791839281585222835035314026302584318471967110885112533134912522704732369059321398385631464481887214974095841731139671459838347580626740171356243247873092922386859642991346194181749373212447298251981843349347928937451612821416132324577277379425461956249596402366475223629520617844924344318022794715861766989315436110954115187550971647704165163051652248283074958132628121944352414023351866533Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
2333133121414131402
|
||||
@@ -0,0 +1 @@
|
||||
2333133020404131402
|
||||
Reference in new issue
Block a user