[2016][ruby][19.1]
change rwpmxysxpyvzpqyvkwrrpukrkoyskqnz
commit 887bed6fb306ddaa648c10f5a328d4936dc4b9fe
author Alpha Chen <alpha.chen@gmail.com>
date
parent oxuytmxx
diff --git a/2016/ruby/day_19.rb b/2016/ruby/day_19.rb
index 6ec925f..c6a7ee1 100644
--- a/2016/ruby/day_19.rb
+++ b/2016/ruby/day_19.rb
@@ -1,16 +1,35 @@
-Elf = Struct.new(:id, :presents)
+def solve(n, debug: false)
+  elves = Array.new(n) {|i| i+1 }
 
-n = 3017957
-elves = Array.new(n) {|i| Elf.new(i+1, 1) }
+  until elves.size == 1
+    across = elves.size / 2
+    elves.delete_at(across)
+    elves.rotate!
+  end
 
-until elves.size == 1
-  elf = elves.shift
-  next if elf.presents.zero?
+  elves.first
+end
 
-  elf.presents += elves.first.presents
-  elves.first.presents = 0
+# This takes too long
+# n = 3017957
+# puts solve(n)
 
-  elves << elf
+# So instead use this to find the pattern!
+(1..100).each do |i|
+  puts "#{i}: #{solve(i)}"
 end
 
-p elves
+# At 3**n, the counter resets
+# At 2*3**n, the counter goes up by two instead of one
+include Math
+def formula(n)
+  x = log(n, 3).to_i
+  a = 3**x
+  b = 2*a
+
+  (n == a) ? a : n - a + [(n - b), 0].max
+end
+
+(1..100).each do |n|
+  puts "#{n}: #{solve(n)} #{formula(n)}"
+end