From fdbc03caf01271b299f57105e6fd29b620d2bdb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C8=98tefan-Iulian=20Alecu?= <165364995+pascalecu@users.noreply.github.com> Date: Wed, 13 May 2026 22:38:34 +0300 Subject: [PATCH] Add Zeckendorf in Ruby --- archive/r/ruby/zeckendorf.rb | 52 ++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 archive/r/ruby/zeckendorf.rb diff --git a/archive/r/ruby/zeckendorf.rb b/archive/r/ruby/zeckendorf.rb new file mode 100644 index 000000000..d6dce06c8 --- /dev/null +++ b/archive/r/ruby/zeckendorf.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +USAGE = "Usage: please input a non-negative integer" + +def usage! + warn USAGE + exit 1 +end + +def parse_input(str) + usage! if str.nil? || str.strip.empty? + + n = Integer(str) + usage! if n < 0 + + n +rescue ArgumentError, NoMethodError + usage! +end + +def fibs_upto(n) + fibs = [1, 2] + fibs << fibs[-1] + fibs[-2] while fibs[-1] <= n + fibs.pop if fibs[-1] > n + fibs +end + +def zeckendorf(n) + return [] if n == 0 + + fibs = fibs_upto(n) + result = [] + + i = fibs.length - 1 + + while n > 0 + if fibs[i] <= n + result << fibs[i] + n -= fibs[i] + i -= 2 + else + i -= 1 + end + end + + result +end + +input = ARGV.first +n = parse_input(input) + +puts zeckendorf(n).join(", ")