| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- using BenchmarkTools
- using DataStructures
- selfdir = joinpath(splitdir(@__FILE__)[1], "input")
- data = parse.(Int, readlines(selfdir))
- inputs=sort(vcat(data, 0, maximum(data)+3))
- mini_test = parse.(Int, split("16\n10\n15\n5\n1\n11\n7\n19\n6\n12\n4\n"))
- test_adapters = "28\n33\n18\n42\n31\n14\n46\n20\n48\n47\n24\n23\n49\n45\n19\n38\n39\n11\n1\n32\n25\n35\n8\n17\n7\n9\n4\n2\n34\n10\n3\n"
- test_adapters = parse.(Int, split(test_adapters))
- #---------part1
- function diffs(adapters)
- diffs = diff(adapters)
- count_diff = counter(diffs)
- return count_diff, count_diff[1] * count_diff[3]
- end
- #--------part2
- function count_combinations(data)
- diffs = diff(data)
- cntr = 0
- groups = []
- for i in diffs
- if i == 1
- cntr += 1
- else
- if cntr < 2
- cntr = 0
- continue
- end
- push!(groups, cntr)
- cntr = 0
- end
- end
- cntr = 1
- for k in groups
- cntr *= binomial(k, 2) + 1
- end
- return cntr
- end
- function dynamic_tribonacci(data)
- ad = Dict()
- ad[0] = 1
- for i in data
- ad[i] = get(ad, i-1, 0) + get(ad, i-2, 0) + get(ad, i-3, 0)
- end
- return ad
- end
- memo = Dict()
- function recursion_way(n)
- n ∉ inputs ? 0 :
- n == inputs[begin] ? 1 :
- get!(() -> sum(recursion_way, n-3:n-1), memo, n)
- end
- #--------evaluation
- part1 = @time diffs(inputs)
- println(part1)
- part2 = @time count_combinations(inputs)
- println(part2)
- part2_another = @time dynamic_tribonacci(inputs[2:end])[inputs[end]]
- println(part2_another)
- @time recursion_way(last(inputs))
|