advent-of-code

Perserverance, or the lack thereof

git clone git://git.shimmy1996.com/advent-of-code.git

day-16.jl (1151B)

    1 function fft!(signal)
    2     pattern = [0, 1, 0, -1]
    3     for i in 1:length(signal)
    4         curr_signal = 0
    5         for j in i:length(signal)
    6             curr_signal += pattern[j ÷ i % length(pattern) + 1] * signal[j]
    7         end
    8         signal[i] = abs(curr_signal) % 10
    9     end
   10 end
   11 
   12 function digits_to_num(digits)
   13     num = 0
   14     for i in 1:length(digits)
   15         num = num * 10 + digits[i]
   16     end
   17     num
   18 end
   19 
   20 function part_1(input)
   21     signal = copy(input)
   22     for _ in 1:100
   23         fft!(signal)
   24     end
   25     digits_to_num(signal[1:8])
   26 end
   27 
   28 function part_2(input)
   29     offset = digits_to_num(input[1:7])
   30     # We only care about signal beyond the offset.
   31     signal = repeat(input, 10000)[offset:end]
   32     # Since this will be in latter half of the signal, the only pattern we see
   33     # is i 0s and (n - i) 1s.
   34     for _ in 1:100
   35         reverse!(signal)
   36         cumsum!(signal, signal, dims = 1)
   37         reverse!(signal)
   38         signal .%= 10
   39     end
   40     digits_to_num(signal[2:9])
   41 end
   42 
   43 input = map(x -> parse(Int, x), collect(readlines(open("input.txt"))[1]))
   44 
   45 println("Julia:")
   46 println("Part 1: ", part_1(input))
   47 println("Part 2: ", part_2(input))