diff --git a/2021/ruby/day_04.rb b/2021/ruby/day_04.rb new file mode 100644 index 0000000..2b0a6e0 --- /dev/null +++ b/2021/ruby/day_04.rb @@ -0,0 +1,29 @@ +input = ARGF.read +numbers, *cards = input.split("\n\n") +numbers = numbers.split(?,).map(&:to_i) +cards = cards.map {|c| c.split("\n").map {|r| r.split(/\s+/).reject(&:empty?).map(&:to_i) }} + +def win?(card, drawn) + return true if card.any? {|row| row.all? {|c| drawn.include?(c) }} + return true if card.transpose.any? {|col| col.all? {|c| drawn.include?(c) }} + # return true if (0..4).all? {|x| drawn.include?(card.fetch(x).fetch(x)) } + # return true if (0..4).all? {|x| drawn.include?(card.fetch(x).fetch(4-x)) } + return false +end + +(0..numbers.length).each do |i| + drawn = numbers[0..i] + + # winning_card = cards.find {|c| win?(c, drawn) } + # if winning_card + # p winning_card.flatten.reject {|x| drawn.include?(x) }.sum * drawn.last + # exit + # end + + if cards.length == 1 && winning_card = cards.find {|c| win?(c, drawn) } + p winning_card.flatten.reject {|x| drawn.include?(x) }.sum * drawn.last + exit + else + cards = cards.reject {|c| win?(c, drawn) } + end +end diff --git a/2021/ruby/day_05.rb b/2021/ruby/day_05.rb new file mode 100644 index 0000000..59a64a2 --- /dev/null +++ b/2021/ruby/day_05.rb @@ -0,0 +1,29 @@ +vents = ARGF.read.split("\n").map {|l| l.split(" -> ").map {|x| x.split(?,).map(&:to_i) }} + +straights = vents.select {|(x1,y1),(x2,y2)| x1 == x2 || y1 == y2 } + +points = Hash.new(0) +straights.each do |(x1,y1),(x2,y2)| + x = [x1, x2].minmax + y = [y1, y2].minmax + (x[0]..x[1]).each do |x| + (y[0]..y[1]).each do |y| + points[[x,y]] += 1 + end + end +end + +diagonals = vents - straights +diagonals.each do |(x1,y1),(x2,y2)| + if x1 > x2 + x1,x2 = x2,x1 + y1,y2 = y2,y1 + end + sign = (y1 < y2) ? 1 : -1 + (x1..x2).each.with_index do |x,i| + delta = i * sign + points[[x,y1+delta]] += 1 + end +end + +p points.count {|_,v| v > 1 }