Add the first few solutions.
This commit is contained in:
commit
e62a0067e7
15
day1.hs
Normal file
15
day1.hs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
cost :: Int -> Int
|
||||||
|
cost x = (x `div` 3) - 2
|
||||||
|
|
||||||
|
fuel :: Int -> [Int]
|
||||||
|
fuel x
|
||||||
|
| cost x <= 0 = []
|
||||||
|
| otherwise = cost x : fuel (cost x)
|
||||||
|
|
||||||
|
totalCost :: Int -> Int
|
||||||
|
totalCost = sum . fuel
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
ls <- map read <$> lines <$> readFile "day1.txt"
|
||||||
|
print $ sum $ map totalCost ls
|
27
day2.cr
Normal file
27
day2.cr
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
lines = File.read("day2.txt").lines.map(&.split(",").map(&.to_i32)).flatten
|
||||||
|
def run(lines, noun, verb)
|
||||||
|
lines[1] = noun
|
||||||
|
lines[2] = verb
|
||||||
|
pos = 0
|
||||||
|
loop do
|
||||||
|
case lines[pos]
|
||||||
|
when 1
|
||||||
|
lines[lines[pos+3]] = lines[lines[pos+1]] + lines[lines[pos+2]]
|
||||||
|
pos += 4
|
||||||
|
when 2
|
||||||
|
lines[lines[pos+3]] = lines[lines[pos+1]] * lines[lines[pos+2]]
|
||||||
|
pos += 4
|
||||||
|
when 99
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
lines[0]
|
||||||
|
end
|
||||||
|
100.times do |noun|
|
||||||
|
100.times do |verb|
|
||||||
|
if run(lines.dup, noun, verb) == 19690720
|
||||||
|
puts 100*noun + verb
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
43
day3.cr
Normal file
43
day3.cr
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
def parse(s)
|
||||||
|
s.split(",").map { |ss| { ss[0], ss[1..].to_i32 } }
|
||||||
|
end
|
||||||
|
|
||||||
|
def run_line(l)
|
||||||
|
poses = Set({Int32,Int32}).new
|
||||||
|
step_map = {} of {Int32,Int32} => Int32
|
||||||
|
x, y, steps = 0, 0, 0
|
||||||
|
l.each do |cmd|
|
||||||
|
dir, len = cmd
|
||||||
|
dx, dy = 0, 0
|
||||||
|
case dir
|
||||||
|
when 'U'
|
||||||
|
dy = 1
|
||||||
|
when 'D'
|
||||||
|
dy = -1
|
||||||
|
when 'L'
|
||||||
|
dx = -1
|
||||||
|
when 'R'
|
||||||
|
dx = 1
|
||||||
|
end
|
||||||
|
len.times do |i|
|
||||||
|
x += dx
|
||||||
|
y += dy
|
||||||
|
steps += 1
|
||||||
|
poses << {x,y}
|
||||||
|
step_map[{x,y}] ||= steps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return {poses, step_map}
|
||||||
|
end
|
||||||
|
|
||||||
|
lines = File.read("day3.txt").lines.map(&.chomp)
|
||||||
|
# wire1 = parse("R8,U5,L5,D3")
|
||||||
|
# wire2 = parse("U7,R6,D4,L4")
|
||||||
|
# puts run_line(wire1)
|
||||||
|
# puts run_line(wire2)
|
||||||
|
wire1 = parse(lines[0])
|
||||||
|
wire2 = parse(lines[1])
|
||||||
|
poses1, steps1 = run_line(wire1)
|
||||||
|
poses2, steps2 = run_line(wire2)
|
||||||
|
puts (poses1 & poses2).min_of { |p| p[0] + p[1] }
|
||||||
|
puts (poses1 & poses2).min_of { |p| steps1[p] + steps2[p] }
|
29
day4.cr
Normal file
29
day4.cr
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
input = File.read("day4.txt").chomp.split("-").map(&.to_i32)
|
||||||
|
total = 0
|
||||||
|
(input[1] - input[0]).times do |i|
|
||||||
|
invalid = false
|
||||||
|
i = (input[0] + i).to_s
|
||||||
|
i.chars.each_cons_pair do |c1,c2|
|
||||||
|
invalid = c2 < c1
|
||||||
|
break if invalid
|
||||||
|
end
|
||||||
|
next if invalid
|
||||||
|
|
||||||
|
# next unless i =~ /.*(.)\1.*/
|
||||||
|
past_char = nil
|
||||||
|
past_count = 0
|
||||||
|
pasts = [] of Int32
|
||||||
|
i.each_char do |c|
|
||||||
|
if c == past_char
|
||||||
|
past_count += 1
|
||||||
|
else
|
||||||
|
pasts << past_count
|
||||||
|
past_count = 0
|
||||||
|
end
|
||||||
|
past_char = c
|
||||||
|
end
|
||||||
|
pasts << past_count
|
||||||
|
|
||||||
|
total += 1 if pasts.any? &.==(1)
|
||||||
|
end
|
||||||
|
puts total
|
49
day5.cr
Normal file
49
day5.cr
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
lines = File.read("day5.txt").chomp.split(",").map(&.to_i32)
|
||||||
|
def run(lines, input)
|
||||||
|
output = [] of Int32
|
||||||
|
pos = 0
|
||||||
|
get = ->(x : Char, p : Int32) {
|
||||||
|
x == '0' ? lines[lines[pos+p]] : lines[pos+p]
|
||||||
|
}
|
||||||
|
loop do
|
||||||
|
str = "000" + lines[pos].to_s
|
||||||
|
case str
|
||||||
|
when .ends_with?("1")
|
||||||
|
lines[lines[pos+3]] = get.call(str[-3], 1) + get.call(str[-4], 2)
|
||||||
|
pos += 4
|
||||||
|
when .ends_with?("2")
|
||||||
|
lines[lines[pos+3]] = get.call(str[-3], 1) * get.call(str[-4], 2)
|
||||||
|
pos += 4
|
||||||
|
when .ends_with?("3")
|
||||||
|
lines[lines[pos+1]] = input.pop
|
||||||
|
pos += 2
|
||||||
|
when .ends_with?("4")
|
||||||
|
output << get.call(str[-3], 1)
|
||||||
|
pos += 2
|
||||||
|
when .ends_with?("5")
|
||||||
|
if get.call(str[-3], 1) != 0
|
||||||
|
pos = get.call(str[-4], 2)
|
||||||
|
else
|
||||||
|
pos += 3
|
||||||
|
end
|
||||||
|
when .ends_with?("6")
|
||||||
|
if get.call(str[-3], 1) == 0
|
||||||
|
pos = get.call(str[-4], 2)
|
||||||
|
else
|
||||||
|
pos += 3
|
||||||
|
end
|
||||||
|
when .ends_with?("7")
|
||||||
|
lines[lines[pos+3]] = (get.call(str[-3], 1) < get.call(str[-4], 2)) ? 1 : 0
|
||||||
|
pos += 4
|
||||||
|
when .ends_with?("8")
|
||||||
|
lines[lines[pos+3]] = (get.call(str[-3], 1) == get.call(str[-4], 2)) ? 1 : 0
|
||||||
|
pos += 4
|
||||||
|
when .ends_with?("99")
|
||||||
|
break
|
||||||
|
else
|
||||||
|
raise "aahhh #{str}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
{output, lines}
|
||||||
|
end
|
||||||
|
puts run(lines, [5])
|
49
day6.cr
Normal file
49
day6.cr
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
orbits = File.read("day6.txt").lines.map(&.chomp)
|
||||||
|
indirect = {} of String => Set(String)
|
||||||
|
direct = {} of String => Set(String)
|
||||||
|
edges_from = {} of String => Set(String)
|
||||||
|
orbits.each do |orbit|
|
||||||
|
big, small = orbit.split(")")
|
||||||
|
direct[big] ||= Set(String).new
|
||||||
|
direct[big] << small
|
||||||
|
(edges_from[big] ||= Set(String).new) << small
|
||||||
|
(edges_from[small] ||= Set(String).new) << big
|
||||||
|
end
|
||||||
|
|
||||||
|
def compute_indirect(direct, indirect, for, current)
|
||||||
|
indirect[for] ||= Set(String).new
|
||||||
|
indirect[for] << current unless current == for
|
||||||
|
return unless direct.has_key? current
|
||||||
|
direct[current].each do |n|
|
||||||
|
compute_indirect(direct, indirect, for, n)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
direct.each_key do |k|
|
||||||
|
compute_indirect(direct, indirect, k, k)
|
||||||
|
end
|
||||||
|
|
||||||
|
total_direct = direct.values.map(&.size).sum
|
||||||
|
total_indirect = indirect.values.map(&.size).sum
|
||||||
|
puts total_indirect
|
||||||
|
|
||||||
|
start = "YOU"
|
||||||
|
dest = "SAN"
|
||||||
|
visited = Set(String).new
|
||||||
|
distances = { start => 0 }
|
||||||
|
queue = Set { start }
|
||||||
|
length = 0
|
||||||
|
loop do
|
||||||
|
next_node = queue.min_by { |e| distances.fetch(e, 1000000) }
|
||||||
|
queue.delete next_node
|
||||||
|
|
||||||
|
break if next_node == dest
|
||||||
|
next if visited.includes? next_node
|
||||||
|
visited << next_node
|
||||||
|
|
||||||
|
edges_from[next_node].each do |neighbor|
|
||||||
|
distances[neighbor] ||= distances[next_node] + 1
|
||||||
|
queue << neighbor
|
||||||
|
end
|
||||||
|
end
|
||||||
|
puts distances[dest]-2
|
Loading…
Reference in New Issue
Block a user