Skip Navigation

Is it possible to not brute force day 7?

I thought about it for 15 mins, but couldn't think of any mathematical tricks. I thought of lots of minor tricks, like comparing the number to the result and not adding any more multiplications if it's over, things that would cut 10%-20% here and there, but nothing which fundamentally changes big O running time.

For reference, here's my solution for part 2 in smalltalk. I just generated every possible permutation and tested it. Part 1 is similar, mainly I just used bit magic to avoid generating permutations.

(even if you haven't used it, smalltalk is fairly readable, everything is left to right, except in parens)

 smalltalk
    
day7p2: in
    | input | 
    
    input := in lines collect: [ :l | (l splitOn: '\:|\s' asRegex) reject: #isEmpty thenCollect: #asInteger ].
    
    ^ (input select: [ :line |
        (#(1 2 3) permutationsWithRepetitionsOfSize: line size - 2) 
            anySatisfy: [ :num | (self d7addmulcat: line ops: num) = (line at: 1)]
    ]) sum: #first.


  
 smalltalk
    
d7addmulcat: nums ops: ops
    | final |
    
    final := nums at: 2.
    ops withIndexDo: [ :op :i |
        op = 1 ifTrue: [ final := final * (nums at: i + 2) ].
        op = 2 ifTrue: [ final := final + (nums at: i + 2) ].
        op = 3 ifTrue: [ final := (final asString, (nums at: i+2) asString) asInteger ]
    ].

    ^ final


  

You're viewing a single thread.

11 comments
11 comments