diff --git a/2024/ruby/day_14.rb b/2024/ruby/day_14.rb
new file mode 100644
index 0000000..1f0e79f
--- /dev/null
+++ b/2024/ruby/day_14.rb
@@ -0,0 +1,44 @@
+robots = DATA.read.scan(/-?\d+/).map(&:to_i).each_slice(4).to_a
+
+MAX_X = 101
+MAX_Y = 103
+# MAX_X = 11
+# MAX_Y = 7
+
+QUADRANTS = [
+ [(0...MAX_X/2), (0...MAX_Y/2)],
+ [(MAX_X/2+1..), (0...MAX_Y/2)],
+ [(0...MAX_X/2), (MAX_Y/2+1..)],
+ [(MAX_X/2+1..), (MAX_Y/2+1..)],
+]
+
+robots_s = -> {
+ (0..MAX_Y).map {|y|
+ (0..MAX_X).map {|x|
+ robots.any? {|r_x,r_y,_,_| r_x == x && r_y == y } ? ?# : ?.
+ }.join
+ }.join("\n")
+}
+
+(0..).each do |i|
+ robots.each do |robot|
+ p_x, p_y, v_x, v_y = robot
+ robot[0] = (p_x + v_x) % MAX_X
+ robot[1] = (p_y + v_y) % MAX_Y
+ end
+
+ if (i - 46) % 103 == 0
+ puts i
+ puts robots_s[]
+ end
+end
+
+pp [
+ [(0...MAX_X/2), (0...MAX_Y/2)],
+ [(MAX_X/2+1..), (0...MAX_Y/2)],
+ [(0...MAX_X/2), (MAX_Y/2+1..)],
+ [(MAX_X/2+1..), (MAX_Y/2+1..)],
+].map {|xx,yy| robots.count {|x,y,_,_| xx.cover?(x) && yy.cover?(y) }}
+ .inject(&:*)
+
+__END__