diff --git a/2025/ruby/day_07.rb b/2025/ruby/day_07.rb
new file mode 100644
index 0000000..bb2d2b5
--- /dev/null
+++ b/2025/ruby/day_07.rb
@@ -0,0 +1,43 @@
+beam = nil
+SPLITTERS = Hash.new {|h,k| h[k] = Set.new }
+
+DATA.read.lines(chomp: true).each.with_index do |line, y|
+ line.chars.each.with_index do |value, x|
+ case value
+ when ?S
+ beam = x
+ when ?^
+ SPLITTERS[y] << x
+ when ?.
+ # no-op
+ else
+ fail value
+ end
+ end
+end
+
+# beams = Set[beam]
+# pp (0..splitters.keys.max).inject(0) {|splits, y|
+# split_beams = beams & splitters[y]
+# beams -= split_beams
+# beams |= split_beams.flat_map { [it - 1, it + 1] }
+# splits + split_beams.size
+# }
+
+timelines = Hash.new {|timelines, (beam, level)|
+ timelines[[beam, level]] = if level > SPLITTERS.keys.max
+ 1
+ else
+ if SPLITTERS[level].include?(beam)
+ [-1, 1].sum {|d|
+ timelines[[beam + d, level + 1]]
+ }
+ else
+ timelines[[beam, level + 1]]
+ end
+ end
+}
+
+pp timelines[[beam, 0]]
+
+__END__