This commit is contained in:
dory committed 2024-12-14 00:23:28 -08:00
1 parent b023d0ea19
commit 18533b6ab4
5 files changed
+126

No files matched your search

+67
View File
@@ -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)
+56
View File
@@ -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)
+1
View File
@@ -0,0 +1 @@
1012178791354059884227414319879232325738461439901378387779851518437752468679529168936396621359308269232626508136869324122534475550605864418071101975413156653674439631435948436127194792499553826016238021438471529762338860374729836038996516165317721740664923791198807457192377238450164333113686357276704297236565705645615080554045299918767178949820248292555882574664284312843376235942728171155576629425863732174463601675829051378148121684953384752359431698988158234839652248144654314125763227815886261478734234933563319814792032725829441393522976229528666192415493263040848176129387339170406293868830668819227815199582476114285799405652631824658614545377313359974426487537177689158636705232517193111920352543468325463854598447539447481479706442788223704054433729148410637336509829744876609486565713488449799962235739193395141169826460662355159069931178593629159493428240696877442494247340222346636915957512819085132038865890591520437411805674475048252095458164726845427474985624247426365990661456672865942747143619206275323981696484961020823897718416469375775384994523398184865027477246157333426021861785648282673891625125377992589056365324539151977282611958725614617965662248229985806687266982881938855093459298693359424431857248656550244156401478589414828244517935483120607035901516603162461216637567269266326948112521137058751620813171831720544032648948896322379053615550505442629690247015489773339414904312941752308287643155469873101513845285357095997311638458175581758535292737863818917424112051521831987981498941909015734571491824755063474286323846361752392060675480505457602369548028649460897380839862416192521859717010959755485565526622409663198063624726493926718485616087555436131353603420794337238283622513423915284280402127293290175623389888698836349936139794715370784725421858286368847059354646822953721912659063847587304136684820452991359020723560444387712712837034736328171777309356868236279435698478384183974994158164398314788831525065492912747143403866598429791939862691934143269799765146827089624533339748495016834349963164714810563840904081576718224639371837356930717961133956156028775265561240142791743729982780682871433059721069608415473172763754698599193947145949901829199642819660732560243045866467905276939467124754294517538360291185864498522487976077355395672556101217701536845418371811759298522349378950389040407884374533264450454925993091876816749974306054747639573078377429162240464324968868453238508351898673672017303984352876556076993895962226573760371525258584809333778693278046168846505963278322313680406828578775699765745571646280369514548128304783436625529222174918233654139188437264293542657731941367539533775476849094593269526774682522214775671898248440797374617988165961907389985693298138756842545710865534246672817233295998145665611031631343236492341035106679514844267730568469895372103761784388841435864648685636682615999362623630542175951722446744535289269028728023582543609575735150293946137455754987685426649249132081535327432353214036688876185537669596502565251842864619856898679864102712645534317625917829749052637926982747271656349998322282258260252877286259215115231072171495792456116577622180332124475375736587992234834195805868435877801035146112401440412777477711509289972151484420981189249752835541365117151270472773816899327075539292711050597897278566366298406421999447429569444764511997472954457873683012928620781415672959662242163970497642207252286237759346431915848770412491628598751610594745105175823294747975686415631294919145479464995828944360321141156144252760574220518892544477522644365529712578499217107175592750473911704370683399472559744984956169881215711896576825169784197190437992339517302624589076251365464739495944195537247630484499588676215276215278902142981043159643896545386996945453293870647132898227611268865420774636887696411263469982608234873595607472291885516996791244651442228165831446251120442418205916627354103812687834647329601730985718309429259961447390904766102653111940765695427698997269322872919848387855503550969025722335353262878854976219737226918599757280497198627064188730941791903684481411566412425358881473701434937999704897252365416996374386625386784672691457148588735190953142236775887544466431686364796423171336327349159046225796761433775193849375893950123457718288173745135876649355578634728658625231417740422597837541581768932184325499612146899820963857489322333652307664937433378511207181339544192589393572648680389629643180667475136831594134926434953066901335418865851844315121429386488317764426221553669810108513584843842346994232782214373421617699165466695684785219897940995754288579231337591548605172449514774760201791839281585222835035314026302584318471967110885112533134912522704732369059321398385631464481887214974095841731139671459838347580626740171356243247873092922386859642991346194181749373212447298251981843349347928937451612821416132324577277379425461956249596402366475223629520617844924344318022794715861766989315436110954115187550971647704165163051652248283074958132628121944352414023351866533Line truncated
+1
View File
@@ -0,0 +1 @@
2333133121414131402
+1
View File
@@ -0,0 +1 @@
2333133020404131402