diff --git a/2021/ruby/day_03.rb b/2021/ruby/day_03.rb
new file mode 100644
index 0000000..317dbb4
--- /dev/null
+++ b/2021/ruby/day_03.rb
@@ -0,0 +1,23 @@
+bits = ARGF.read.split("\n").map(&:chars)
+
+gamma = bits.transpose.map {|a| a.tally.max_by(&:last).first }.join
+epsilon = bits.transpose.map {|a| a.tally.min_by(&:last).first }.join
+p gamma.to_i(2) * epsilon.to_i(2)
+
+oxy = bits.clone
+(0..oxy.first.length).each do |i|
+ b = oxy.transpose.map {|a| a.tally.sort.reverse.max_by(&:last).first }[i]
+ oxy.select! {|x| x[i] == b }
+ break if oxy.length == 1
+end
+oxy = oxy.join.to_i(2)
+
+co2 = bits.clone
+(0..co2.first.length).each do |i|
+ b = co2.transpose.map {|a| a.tally.sort.min_by(&:last).first }[i]
+ co2.select! {|x| x[i] == b }
+ break if co2.length == 1
+end
+co2 = co2.join.to_i(2)
+
+p oxy * co2