Day 7: Bridge Repair
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
You are viewing a single thread.
View all comments 1 point
Julia
Took quite some time to debug but in the end I think it’s a nice solution using base 2 and 3 numbers counting up to check all operator combinations.
Code
function readInput(inputFile::String)::Vector{Vector{Int}}
f = open(inputFile,"r")
lines::Vector{String} = readlines(f)
close(f)
equations::Vector{Vector{Int}} = []
function getValues(line::String)
return map(sp->parse(Int,sp),(sp=split(line," ");sp[1]=sp[1][1:end-1];sp))
end
map(l->push!(equations,getValues(l)),lines)
return equations
end
function checkEq(eq::Vector{Int},withConCat::Bool)::Bool
function calcEq(eq::Vector{Int},operators::Vector{Int},withConCat::Bool)::Int
res::Int = eq[2]
for (i,op) in enumerate(operators)
if op == 0 #+
res += eq[i+2]
elseif op ==1 #*
res *= eq[i+2]
else #op==2 ||
res = parse(Int,string(res)*string(eq[i+2]))
end
end
return res
end
opInt::Int = 0
operators = Vector{Int}(undef,length(eq)-2)
while opInt < (withConCat ? 3^(length(eq)-2) : 2^(length(eq)-2))
withConCat==true ? operators=digits(opInt,base=3,pad=length(eq)-2) : operators=digits(opInt,base=2,pad=length(eq)-2)
#calcEq(eq,operators,withConCat)==eq[1] ? (return true) : opInt -= 1
calcEq(eq,operators,withConCat)==eq[1] ? (return true) : opInt += 1
end
return false
end
function calcTotCalRes(equations::Vector{Vector{Int}},withConCat::Bool)::Int
totCalRes::Int = 0
for e in equations
checkEq(e,withConCat) ? totCalRes+=e[1] : nothing
end
return totCalRes
end
@info "Part 1"
println("result: $(calcTotCalRes(readInput("day07Input"),false))")
@info "Part 2"
println("result: $(calcTotCalRes(readInput("day07Input"),true))")