Zeckendorff表現のためのアルゴリズムの実用化

過去のように

Zeckendorff再帰アルゴリズムに関する記事を書きました:投稿





サンプルコード
def le_fib(limit, fib)
  theoretical = fib[fib.count - 1] + fib[fib.count - 2]
  return fib.last if theoretical > limit

  fib << theoretical
  le_fib(limit, fib)
end

def main(target,result)
  temporary = le_fib(target, [1,1])
  result << temporary
  return result if target - temporary <= 0

  main(target - temporary, result)
end
pp main(gets.to_i,[])

      
      



Le_fib 関数 -次の番号が入力されたターゲット番号より大きくならないように、制限のあるFibonacciシリーズを再帰的に検索します ここで重要なのは、Fibonacciシリーズ全体に関心があるのではなく、その終わりだけが重要なことです。





 主な 関数-番号がフィボナッチ番号であり、一緒に入力番号を与える配列を再帰的に検索します。





実際には、コメントはよりエレガントな解決策を示唆していました:





1つのサイクルとビジネス
n, F = 100, [1, 2]
while F[-1] < n do
  F << F[-2] + F[-1]
end
F.reverse.each do |f|
  if f <= n
    n -= f
    print f
    print '+' if n > 0
  end
end
      
      







実際には、2番目のアルゴリズムを使用します。これは、不要なアクションによる過負荷が少ないためです。





「このアルゴリズムをプッシュする」問題ステートメント

比較的言えば、特定の製品セットがあります。





[鶏肉、トマト、ラバッシュ、マッシュルーム]。





これらの製品には、コストとエンドユーザーの価値の両方があります。

たとえば、グラデーションは次のように実行できます。





[チキン>トマト>マッシュルーム>ラバッシュ]





, 1 "Low cost", 1 "High cost" .





().





( Ruby) , .





, .





x y .





  1. [1,100]
    [1,100]
    [1,1000]
    [1,1000]
  2. Y - .



    - , .



    . Y





    [1,143]
    [1,143]
  3. 1 89. , "Middle cost" .



    3 x = 1 y = 143.





, :





  • - ( )





  • Collector, Hash ( -> , -> )





, autoloader , .





, Telegram , .





, ,





@fib = [1,2,3,5,8,13,21,34,55,89]
    def collect_the_items
      food_hash = Hash.new
      (0..9).each do |iterator|
        food_hash[@fib[iterator]] = FOOD.first[iterator]
      end
      puts food_hash.map{|key,value| "#{key} - #{value}"}
    end
      
      







, :





def get_sequence(limit)  
  result = []  n, fib = limit, [1, 2]  
  while fib[-1] < n do
    fib << fib[-2] + fib[-1]  end
  fib.reverse.each do |f|    if f <= n
      n -= f
      result << f
    end
  end
  result
end
      
      







- .





def generate_food
          food_array = Collector.collect_the_items
          food = []
          rarity = rand(1..143)
          get_sequence(rarity).each do |key|
            food << food_array[key]
          end
          food
end
      
      







, 6 , .

. - .





:

Low cost : ?

Mid cost : ?

High cost : ?









Zeckendorff表現アルゴリズムを適用することは私を完全に満足させます。つまり、割り当てられたタスクを実行します。





この実用的なアプリケーションが基づいている記事の下の最初のコメントの1つは、私に質問をしました:「しかし、本当に、これはどこに適用できますか?」ご覧のとおり、このアルゴリズムはそのようなタスクに使用できます。





そして、これが私のボットの製品リストを編集するための唯一の正しいオプションであると言っているわけではありませんが、それは本当に非常に機能的で機能します。








All Articles