DEV Community

Marco Servetto
Marco Servetto

Posted on

First week of advent of code.

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)
  )
Enter fullscreen mode Exit fullscreen mode

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)