Nushell
As I'm still on holiday and normal languages are a PITA to type on a phone, I though I'd try a compiled scripting language. I'm not very familiar with it so it took longer to code and also it's been running the first reduce step for 35 minutes so I've missed the 24h cutoff π
use std repeat
use std/iter
let memory = open input.txt | str trim
| split chars | chunks 2
| enumerate | each {|pair| [
...($pair.index | repeat ($pair.item.0 | into int))
...("." | repeat (if ($pair.item|length) < 2 {0} else {$pair.item.1 | into int}))
]}
| flatten
let defragged = (($memory | length) - 1)..(($memory | filter {$in != .} | length))
| reduce --fold $memory {|i, acc|
let space = $acc | iter find-index {|$i| $i == .}
$acc | update $space ($acc | get $i)
| update $i .
}
$defragged | enumerate
| reduce --fold 0 {|i,acc| $acc + ($i.index * if $i.item == "." {0} else {$i.item | into int})}