#!/usr/bin/env ruby problem = 4 @input = File.readlines("#{problem}.input").map { _1.chomp.chars }.reject { _1.empty? } #@input = DATA.read.split("\n").map(&:chars) def diagnal?(x, y, dx, dy) if dx == -1 && dy == -1 return false unless x >= 3 && y >= 3 return @input[y][x] + @input[y-1][x-1] + @input[y-2][x-2] + @input[y-3][x-3] == "XMAS" elsif dx == -1 && dy == 1 return false unless x >= 3 && y <= @input.size - 4 return @input[y][x] + @input[y+1][x-1] + @input[y+2][x-2] + @input[y+3][x-3] == "XMAS" elsif dx = 1 && dy == -1 return false unless x <= @input.first.size - 4 && y >= 3 return @input[y][x] + @input[y-1][x+1] + @input[y-2][x+2] + @input[y-3][x+3] == "XMAS" #elsif dx == 1 && dy == 1 -- SHRUG else return false unless x <= @input.first.size - 4 && y <= @input.size - 4 return @input[y][x] + @input[y+1][x+1] + @input[y+2][x+2] + @input[y+3][x+3] == "XMAS" end end def horizontal?(x, y, dx) row = @input[y] if dx == -1 return false unless x >= 3 return row[x] + row[x-1] + row[x-2] + row[x-3] == "XMAS" end if dx == 1 return false unless x <= @input.first.size - 4 return row[x] + row[x+1] + row[x+2] + row[x+3] == "XMAS" end end def vertical?(x, y, dy) col = @input.transpose[x] if dy == -1 return false unless y >= 3 return col[y] + col[y-1] + col[y-2] + col[y-3] == "XMAS" end if dy == 1 return false unless y <= @input.size - 4 return col[y] + col[y+1] + col[y+2] + col[y+3] == "XMAS" end end xmas = 0 h = 0 d = 0 v = 0 puts "Scanning" puts " - x: #{@input.first.size}" puts " - y: #{@input.size}" (0...@input.size).each do |y| (0...@input.first.size) .each do |x| next unless @input[y][x] == "X" if diagnal?(x, y, -1, -1) xmas += 1 d += 1 puts "Diag LU at #{x}, #{y}" end if diagnal?(x, y, 1, -1) xmas += 1 d += 1 puts "Diag RU at #{x}, #{y}" end if diagnal?(x, y, -1, 1) xmas += 1 d += 1 puts "Diag LD at #{x}, #{y}" end if diagnal?(x, y, 1, 1) xmas += 1 d += 1 puts "Diag RD at #{x}, #{y}" end if horizontal?(x, y, -1) xmas += 1 h += 1 end if horizontal?(x, y, 1) xmas += 1 h += 1 end if vertical?(x, y, -1) xmas += 1 v += 1 end if vertical?(x, y, 1) xmas += 1 v += 1 end end end puts "Diag: #{d}" puts "Hor: #{h}" puts "Vert: #{v}" p xmas __END__ MMMSXXMASM MSAMXMSMSA AMXSXMAAMM MSAMASMSMX XMASAMXAMM XXAMMXXAMA SMSMSASXSS SAXAMASAAA MAMMMXMMMM MXMXAXMASX