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