diff --git a/2023/ruby/day_09.rb b/2023/ruby/day_09.rb
new file mode 100644
index 0000000..3461a7b
--- /dev/null
+++ b/2023/ruby/day_09.rb
@@ -0,0 +1,26 @@
+histories = ARGF.readlines.map { _1.scan(/-?\d+/).map(&:to_i) }
+
+# part one
+p histories
+ .map {|history|
+ diffs = [history]
+ until diffs.last.all?(&:zero?)
+ diffs << diffs.last.each_cons(2).map { _2 - _1 }
+ end
+
+ diffs.sum(&:last)
+ }
+ .sum
+
+# part two
+p histories
+ .map {|history|
+ diffs = [history]
+ until diffs.last.all?(&:zero?)
+ diffs << diffs.last.each_cons(2).map { _2 - _1 }
+ end
+
+ diffs.map(&:first).reverse.inject { _2 - _1 }
+ }
+ .sum
+