main.jl 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using BenchmarkTools
  2. selfdir = joinpath(splitdir(@__FILE__)[1], "input")
  3. data = (readlines(selfdir) .|> x -> split(x, " ") |> x -> [x[1], parse(Int, x[2])]) |> enumerate |> collect
  4. #--------part1
  5. function check_boot(data=data)
  6. ind = 1
  7. spent_ind = []
  8. accumulator = 0
  9. while !(ind in spent_ind) & (ind <= length(data))
  10. ind, (instruction, number) = data[ind]
  11. push!(spent_ind, ind)
  12. if instruction == "acc"
  13. accumulator += number
  14. ind += 1
  15. elseif instruction == "jmp"
  16. ind += number
  17. else
  18. ind += 1
  19. end
  20. end
  21. if ind == length(data) + 1
  22. return accumulator, true
  23. else
  24. return accumulator, false
  25. end
  26. end
  27. #--------part2
  28. function fix(data=data)
  29. c_data = deepcopy(data)
  30. ind = 1
  31. while ind <= length(c_data)
  32. ind, (instr, number) = c_data[ind]
  33. if instr == "acc"
  34. ind += 1
  35. continue
  36. end
  37. c_data[ind][2][1] = instr == "jmp" ? "nop" : "jmp"
  38. accumulator, check = check_boot(c_data)
  39. if check
  40. return accumulator, ind
  41. else
  42. c_data[ind][2][1] = instr
  43. ind += 1
  44. end
  45. end
  46. end
  47. #---------evaluation
  48. part1 = @btime check_boot()
  49. part2 = @btime fix()