M = [ {dx: 2, dy: 1}, {dx: -2, dy: 1}, {dx: 2, dy: -1}, {dx: -2, dy: -1}, {dx: 1, dy: 2}, {dx: -1, dy: 2}, {dx: 1, dy: -2}, {dx: -1, dy: -2} ] available = [{x:0,y:0}] 3.times.inject([{x:0,y:0}]){ |s,i| next_positions = s.product(M).map { |pos, move| { x: pos[:x] + move[:dx], y: pos[:y] + move[:dy]} } available.push(next_positions) next_positions } x,y = gets.split.map(&:to_i) puts available.flatten.uniq.include?({x: x, y: y}) ? "YES" : "NO"