add day3
This commit is contained in:
70
day3/day3.jl
Normal file
70
day3/day3.jl
Normal file
@@ -0,0 +1,70 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user