42 lines
1.1 KiB
Julia
42 lines
1.1 KiB
Julia
using BenchmarkTools
|
|
using StatsBase
|
|
|
|
function Day_01()
|
|
# Robust file reading and parsing
|
|
list_nums = Vector{Int}()
|
|
open("files/P1.txt", "r") do file
|
|
for line in eachline(file)
|
|
# Split the line and parse the first two numbers
|
|
nums = split(strip(line))
|
|
if length(nums) >= 2
|
|
push!(list_nums, parse(Int, nums[1]))
|
|
push!(list_nums, parse(Int, nums[2]))
|
|
end
|
|
end
|
|
end
|
|
|
|
# Preallocate arrays and use views to avoid unnecessary allocations
|
|
l1 = view(list_nums, 1:2:length(list_nums))
|
|
l2 = view(list_nums, 2:2:length(list_nums))
|
|
|
|
# Sort in-place to reduce memory allocations
|
|
sort!(l1)
|
|
sort!(l2)
|
|
|
|
# Optimized part 1: Use broadcast with a temporary array to avoid repeated allocations
|
|
p1 = sum(abs, l1 .- l2)
|
|
|
|
# Optimized part 2: Use dictionary for efficient counting and avoid multiple passes
|
|
freq = Dict{Int, Int}()
|
|
for x in l2
|
|
freq[x] = get(freq, x, 0) + 1
|
|
end
|
|
|
|
p2 = sum(x -> x * get(freq, x, 0), l1)
|
|
|
|
return p1, p2
|
|
end
|
|
|
|
println(Day_01())
|
|
@btime Day_01()
|