Advent of code, day 3

Ok, day 3 part one was nice and simple. FIrst I defined a couple of utility static methods, then just rolled over the data.
In this code I managed to showcase a unique feature of 42 ‘for-in’:
you can update the element under iteration!

Pow2 = {class…


This content originally appeared on DEV Community and was authored by Marco Servetto

Ok, day 3 part one was nice and simple. FIrst I defined a couple of utility static methods, then just rolled over the data.
In this code I managed to showcase a unique feature of 42 'for-in':
you can update the element under iteration!

Pow2 = {class method I (I that) =
  if that==0I 1I else 2I*This(that-1I) }
Is1 = {class method Bool(S that, I i) =
  that.startsWith(S"1" leftOffSet=i)}
MainPart1 = (
  input = Fs.Real.#$of().read(\"input")
  tot = I.List[0I;0I;0I;0I;0I;0I;0I;0I;0I;0I;0I;0I]
  var size = 0I
  for s in input.split(S.nl()) (
    size+=1I
    for var e in tot, i in Range(tot.size()) (
      if Is1(s i=i) e:=e+1I //update the value inside of 'tot'
      )
    )
  var gamma = 0I
  var epsilon = 0I
  for e in tot, i in Range(tot.size()).reverse() (
    if e+e>size gamma+=Pow2(i) 
    else      epsilon+=Pow2(i)
    )
  Debug(gamma*epsilon)
  )

The second part, I found it involved in a boring way. I think there must have been a smarted way to solve it, but I could not find it. I had to read the description a couple of time to understand that I had to look for the most common bit in the REMAINING elements...

Part2 = {class method I (S that, Bool geq) = (
  res = S.List()(for s in that.split(S.nl()) \add(s))
  size = res.left().size()
  var remaining = res.size()
  for  i in Range(size) (
    if remaining==1I ( Break() )
    e = Match.Count()(for s in res if s!=S"" \add(Is1(s,i=i)))
    seek1 = ( if geq e+e>=remaining else e+e<remaining )
    for var s in res if s!=S"" && seek1!=Is1(s,i=i) (
      s:=S"" remaining-=1I 
      )
    )
  var resI = 0I
  for s in res if s!=S"" (
    for j in Range(size), i in Range(size).reverse() (
      if Is1(s,i=j) resI+=Pow2(i)
      )
    )
  resI
  )}
MainPart2 = (
  input = Fs.Real.#$of().read(\"input")
  ogr = Part2(input,geq=\.true())
  co2sr = Part2(input,geq=\.false())
  Debug(ogr*co2sr)
  )

As you can see, I just end up calling the same function twice.
You can notice that I'm still unsure how to format my code:
for example I wrote

for var s in res if s!=S"" && seek1!=Is1(s,i=i) (
  s:=S"" remaining-=1I 
  )

instead of the more conventional

for var s in res (
  if s!=S"" && seek1!=Is1(s,i=i) s:=S"" remaining-=1I 
  )

or the even longer version with also the 'if' indented.
What would be more readable? and why?


This content originally appeared on DEV Community and was authored by Marco Servetto


Print Share Comment Cite Upload Translate Updates
APA

Marco Servetto | Sciencx (2021-12-03T23:28:47+00:00) Advent of code, day 3. Retrieved from https://www.scien.cx/2021/12/03/advent-of-code-day-3/

MLA
" » Advent of code, day 3." Marco Servetto | Sciencx - Friday December 3, 2021, https://www.scien.cx/2021/12/03/advent-of-code-day-3/
HARVARD
Marco Servetto | Sciencx Friday December 3, 2021 » Advent of code, day 3., viewed ,<https://www.scien.cx/2021/12/03/advent-of-code-day-3/>
VANCOUVER
Marco Servetto | Sciencx - » Advent of code, day 3. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2021/12/03/advent-of-code-day-3/
CHICAGO
" » Advent of code, day 3." Marco Servetto | Sciencx - Accessed . https://www.scien.cx/2021/12/03/advent-of-code-day-3/
IEEE
" » Advent of code, day 3." Marco Servetto | Sciencx [Online]. Available: https://www.scien.cx/2021/12/03/advent-of-code-day-3/. [Accessed: ]
rf:citation
» Advent of code, day 3 | Marco Servetto | Sciencx | https://www.scien.cx/2021/12/03/advent-of-code-day-3/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.