Day 5: Print Queue

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

  • Karmmah@lemmy.world
    link
    fedilink
    arrow-up
    1
    ·
    7 days ago

    Julia

    No really proud of todays solution. Probably because I started too late today.

    I used a dictionary with the numbers that should be in front of any given number. Then I checked if they appear after that number. Part1 check. For part 2 I just hoped for the best that ordering it would work by switching each two problematic entries and it worked.

    ::: spoiler

    function readInput(inputFile::String)
    	f = open(inputFile,"r"); lines::Vector{String} = readlines(f); close(f)
    	updates::Vector{Vector{Int}} = []
    	pageOrderingRules = Dict{Int,Vector{Int}}()
    	readRules::Bool = true #switch off after rules are read, then read updates
    	for (i,line) in enumerate(lines)
    		line=="" ? (readRules=false;continue) : nothing
    		if readRules
    			values::Vector{Int} = map(x->parse(Int,x),split(line,"|"))
    			!haskey(pageOrderingRules,values[2]) ? pageOrderingRules[values[2]]=Vector{Int}() : nothing
    			push!(pageOrderingRules[values[2]],values[1])
    		else #read updates
    			push!(updates,map(x->parse(Int,x),split(line,",")))
    		end
    	end
    	return updates, pageOrderingRules
    end
    
    function checkUpdateInOrder(update::Vector{Int},pageOrderingRules::Dict{Int,Vector{Int}})::Bool
    	inCorrectOrder::Bool = true
    	for i=1 : length(update)-1
    		for j=i+1 : length(update)
    			!haskey(pageOrderingRules,update[i]) ? continue : nothing
    			update[j] in pageOrderingRules[update[i]] ? inCorrectOrder=false : nothing
    		end
    		!inCorrectOrder ? break : nothing
    	end
    	return inCorrectOrder
    end
    
    function calcMidNumSum(updates::Vector{Vector{Int}},pageOrderingRules::Dict{Int,Vector{Int}})::Int
    	midNumSum::Int = 0
    	for update in updates
    		checkUpdateInOrder(update,pageOrderingRules) ? midNumSum+=update[Int(ceil(length(update)/2))] : nothing
    	end
    	return midNumSum
    end
    
    function calcMidNumSumForCorrected(updates::Vector{Vector{Int}},pageOrderingRules::Dict{Int,Vector{Int}})::Int
    	midNumSum::Int = 0
    	for update in updates
    		inCorrectOrder::Bool = checkUpdateInOrder(update,pageOrderingRules)
    		inCorrectOrder ? continue : nothing #skip already correct updates
    		while !inCorrectOrder
    			for i=1 : length(update)-1
    				for j=i+1 : length(update)
    					!haskey(pageOrderingRules,update[i]) ? continue : nothing
    					if update[j] in pageOrderingRules[update[i]]
    						mem::Int = update[i]; update[i] = update[j]; update[j]=mem #switch entries
    					end
    				end
    			end
    			inCorrectOrder = checkUpdateInOrder(update,pageOrderingRules)
    		end
    		midNumSum += update[Int(ceil(length(update)/2))]
    	end
    	return midNumSum
    end
    
    updates, pageOrderingRules = readInput("day05Input")
    println("part 1 sum: $(calcMidNumSum(updates,pageOrderingRules))")
    println("part 2 sum: $(calcMidNumSumForCorrected(updates,pageOrderingRules))")
    

    :::