Today was fun.
I did not remembered the formula for the summatory of 1,2,3,4..., so I computed it in the slow way.
Then, I could use 42 caching to speed the whole thing up, and still obtain a reasonable time in the end.
Here is the code:
reuse [L42.is/AdamsTowel]
Fs = Load:{reuse[L42.is/FileSystem]}
Max ={class method Num (Num.List that)={
if that.size()==1I return that.left()
return that.left().max(Max(that.withoutLeft()))
}}
Min ={class method Num (Num.List that)={
if that.size()==1I return that.left()
return that.left().min(Min(that.withoutLeft()))
}}
Fuel=Data:{ Num dist,Num round
method Num res(Num dist,Num round)={
if dist==0Num return dist
if dist==1Num return round
return round+\res(dist=dist-1Num,round=round+1Num)
}
@Cache.Lazy method Num () =
\res(dist=this.dist(),round=this.round())
class method Num (Num dist) = This(dist=dist,round=1Num)<:This()
//class method Num(Num dist)=(dist*(dist+1Num))/2Num
//If I just remembered the formula commented above
//I could have avoided the caching stuff...
}
Cost ={class method Num(Num.List that, Num pos)=(
var tot = 0Num
for n in that (
var abs = n-pos
if abs<0Num ( abs:=abs*Num"-1" )
tot+=Fuel(dist=abs)
)
tot
)}
Main=(
fs = Fs.Real.#$of()
input = fs.read(\"input")
imm crabs = Num.List()(for s in input.split(S",")
\add(\(string=s.trim()))
)
min = Min(crabs)
max = Max(crabs)
imm costs=Num.List()(for i in Range(I(min) to=I(max))
\add(Cost(crabs,pos=Num(i)))
)
minC=Min(costs)
Debug(minC)
)
I'm also putting on my you tube channel a video discussing improved versions for the code I made this week.
(https://www.youtube.com/MarcoServetto)
Top comments (0)