#!/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()