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)

Stop sifting through your feed.

Find the content you want to see.

Change your feed algorithm by adjusting your experience level and give weights to the tags you follow.