this post was submitted on 05 Dec 2024
26 points (100.0% liked)

Advent Of Code

987 readers
14 users here now

An unofficial home for the advent of code community on programming.dev!

Advent of Code is an annual Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.

AoC 2024

Solution Threads

M T W T F S S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25

Rules/Guidelines

Relevant Communities

Relevant Links

Credits

Icon base by Lorc under CC BY 3.0 with modifications to add a gradient

console.log('Hello World')

founded 1 year ago
MODERATORS
 

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

you are viewing a single comment's thread
view the rest of the comments
[–] Karmmah@lemmy.world 1 points 3 weeks 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))")

:::