main.jl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using BenchmarkTools
  2. using DataStructures
  3. selfdir = joinpath(splitdir(@__FILE__)[1], "input")
  4. data = parse.(Int, readlines(selfdir))
  5. inputs=sort(vcat(data, 0, maximum(data)+3))
  6. mini_test = parse.(Int, split("16\n10\n15\n5\n1\n11\n7\n19\n6\n12\n4\n"))
  7. 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"
  8. test_adapters = parse.(Int, split(test_adapters))
  9. #---------part1
  10. function diffs(adapters)
  11. diffs = diff(adapters)
  12. count_diff = counter(diffs)
  13. return count_diff, count_diff[1] * count_diff[3]
  14. end
  15. #--------part2
  16. function count_combinations(data)
  17. diffs = diff(data)
  18. cntr = 0
  19. groups = []
  20. for i in diffs
  21. if i == 1
  22. cntr += 1
  23. else
  24. if cntr < 2
  25. cntr = 0
  26. continue
  27. end
  28. push!(groups, cntr)
  29. cntr = 0
  30. end
  31. end
  32. cntr = 1
  33. for k in groups
  34. cntr *= binomial(k, 2) + 1
  35. end
  36. return cntr
  37. end
  38. function dynamic_tribonacci(data)
  39. ad = Dict()
  40. ad[0] = 1
  41. for i in data
  42. ad[i] = get(ad, i-1, 0) + get(ad, i-2, 0) + get(ad, i-3, 0)
  43. end
  44. return ad
  45. end
  46. memo = Dict()
  47. function recursion_way(n)
  48. n ∉ inputs ? 0 :
  49. n == inputs[begin] ? 1 :
  50. get!(() -> sum(recursion_way, n-3:n-1), memo, n)
  51. end
  52. #--------evaluation
  53. part1 = @time diffs(inputs)
  54. println(part1)
  55. part2 = @time count_combinations(inputs)
  56. println(part2)
  57. part2_another = @time dynamic_tribonacci(inputs[2:end])[inputs[end]]
  58. println(part2_another)
  59. @time recursion_way(last(inputs))