You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.3 KiB

#!/usr/bin/env julia
using Test
function priority(char)
v = Int(char)
if v <= Int('Z')
return v - Int('A') + 27
else
return v - Int('a') + 1
end
end
function rucksack_errors(infile)
psum = 0
open(infile, "r") do io
for line in eachline(io)
n = length(line)
a = Set{Int32}()
b = Set{Int32}()
for c in line[1:Int(n/2)]
push!(a, priority(c))
end
for c in line[Int(n/2)+1:n]
push!(b, priority(c))
end
psum += pop!(intersect(a, b))
end
end
return psum
end
function rucksack_badges(infile)
psum = 0
open(infile, "r") do io
for lines in Iterators.partition(eachline(io), 3)
all = intersect!(Set(lines[1]), Set(lines[2]), Set(lines[3]))
psum += priority(pop!(all))
end
end
return psum
end
function test()
@testset "elf rucksack errors" verbose=true begin
@test rucksack_errors("example.txt") == 157
@test rucksack_errors("input.txt") == 8394
end
@testset "elf rucksack badges" verbose=true begin
@test rucksack_badges("example.txt") == 70
@test rucksack_badges("input.txt") == 2413
end
end
function main()
if size(ARGS, 1) == 0
test()
else
infile = ARGS[1]
println("infile = ", infile)
println("error priority sum: ", rucksack_errors(infile))
end
end
main()