DEV Community

Marco Servetto
Marco Servetto

Posted on

Advent of code Day 13

Code of today.

I'm getting to use the ultimate power of the '\' more and more.
It really look and feels like java streams, but no lambdas to be seen!
A side effect seams to be that I tend to close a lot of lines with a pile of parenthesis, since there is only one natural indentation level.
Look for example to the Folds function!

Point = Data.AddList:Data:{I x, I y}
Folds = {class method Point.List (S that)=\()((
  ss=that.split(S.nl()++S.nl()) 
  _=ss()
  for line in ss().split(S.nl()) (
    isY = line.startsWith(S"fold along y=")
    if  isY \add(\(x=0I,y=ReadFold(line)))
    else    \add(\(x=ReadFold(line),y=0I))
  )))}
Max={class method Point (Point.List that)=(
  var maxX = 0I
  var maxY = 0I
  for (x,y) in that (
    if x>maxX (maxX:=x)
    if y>maxY (maxY:=y)
    )
  Point(x=(maxX*2I)+1I,y=(maxY*2I)+1I)
  )}
ReadFold ={class method I(S that)=(
  (size) = S"fold along y="
  I(string=that.subString(size to=\size))
  )}
Matrix = (
  input = Fs.Real.#$of().read(\"input")
  ps = Folds(input)
  (x,y) = Max(ps)
  Collection.matrix(I.List,row=y, col=x)
  )
Fold={
  class method Void (mut Matrix m, Point range, Point fold)=(
    (x,y) = fold
    if x==0I \y(m=m,range=range,fold=y)
    else     \x(m=m,range=range,fold=x)
    )
  class method Void x(mut Matrix m, Point range, I fold)=(
    for xi in Range(fold),
        xj in Range(fold+1I,to=(fold*2I)+1I).reverse() (
      for y in Range(range.y()) (
        new = m.val(row=y col=xi)+m.val(row=y col=xj)
        m.set(row=y col=xi val=new)
        m.set(row=y col=xj val=0I)
        )
      )
    )
  class method Void y(mut Matrix m, Point range, I fold)=(
    for yi in Range(fold),
        yj in Range(fold+1I,to=(fold*2I)+1I).reverse() (
      for x in Range(range.x()) (
        new = m.val(row=yi col=x)+m.val(row=yj col=x)
        m.set(row=yi col=x val=new)
        m.set(row=yj col=x val=0I)
        )
      )
    )
  }
Main=(
  input = Fs.Real.#$of().read(\"input")
  ps = Folds(input)
  range = Max(ps)
  (x,y) = range
  m = Matrix(\()(
    for xi in Range(x), for yi in Range(y) \add(0I)
    ))
  ss = input.split(S.nl()++S.nl())
  for line in ss().split(S.nl()) (
    s=line.split(S",")
    xi = I(string=s())
    yi = I(string=s())
    m.set(row=yi col=xi val=1I)
    )
  folds = Point.List()(for line in ss().split(S.nl()) (
    isY = line.startsWith(S"fold along y=")
    if  isY \add(\(x=0I,y=ReadFold(line)))
    else    \add(\(x=ReadFold(line),y=0I))
    ))
  for f in folds i in Range(folds.size())(
    Fold(m=m,range=range,fold=f)
    )
  for yi in Range(7I)(//7 and 41 are just reasonable sizes :-/
    Debug(S"".builder()(for xi in Range(41I) \add(
      if m.val(row=yi,col=xi)==0I S" " else S"#"
      )))//CEJKLUGJ
    )
  )
Enter fullscreen mode Exit fullscreen mode

What have I learnt?
-Matrix need to have class methods giving you the max range!
-Matrix need to have a functionality to be initialized with a single value in all cells.
-There is no easy way to print a char without going new line, so in the solution I had to accumulate on a full line string before printing... is this ok? should I have Debug.print(..) to not go new line?

You can find the 42 tutorial in video form at
(https://www.youtube.com/watch?v=Xsz5yxNR_Vo&list=PLWsQqjANQic8c5wG3LfSe-mMiBKfOtBFJ)

Oldest comments (0)