#!/usr/bin/env python3 import satisfactory import fractions import collections if __name__ == '__main__': recipes = satisfactory.Cookbook('data/recipes') required = collections.defaultdict(fractions.Fraction) remain = [] target_name = 'supercomputer' target = recipes[target_name] target_recipe = target['recipes'][0] remain.append({ target_name: fractions.Fraction( target_recipe['output'][target_name], target_recipe['crafting_time'] ) }) while remain: for dst_name, dst_rate in remain.pop().items(): required[dst_name] += dst_rate dst = recipes[dst_name] if recipes.is_resource(dst_name): continue dst_recipe = recipes[dst_name]['recipes'][0] src_recipe = recipes[dst_name]['recipes'][0] normal_rate = fractions.Fraction( dst_recipe['output'][dst_name], dst_recipe['crafting_time'] ) scale = dst_rate / normal_rate for src_name, src_count in src_recipe['input'].items(): src_rate = fractions.Fraction( src_count, dst_recipe['crafting_time'] ) * scale remain.append({src_name: src_rate}) print(required) for name, rate in required.items(): machine = recipes[name]['machine']