diff --git a/2016/ruby/day_16.rb b/2016/ruby/day_16.rb
new file mode 100644
index 0000000..0d87840
--- /dev/null
+++ b/2016/ruby/day_16.rb
@@ -0,0 +1,24 @@
+def step(a)
+ b = a.reverse.tr('10', '01')
+ "#{a}0#{b}"
+end
+
+def checksum(data)
+ checksum = data.chars
+ loop do
+ checksum = checksum.each_slice(2).map {|a,b| (a == b) ??1:?0 }
+ break if checksum.length.odd?
+ end
+ checksum.join
+end
+
+seed = '10001110011110000'
+target_length = 272
+
+state = seed
+while state.length < target_length
+ state = step(state)
+end
+
+data = state[0...target_length]
+puts checksum(data)