## DEV Community 👩‍💻👨‍💻 is a community of 967,611 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Marco Servetto

Posted on

# 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 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 = (
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 = (
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
)
``````

``````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?