def test_example_02():
    lines = [
        '9 ORE => 2 A', '8 ORE => 3 B', '7 ORE => 5 C', '3 A, 4 B => 1 AB',
        '5 B, 7 C => 1 BC', '4 C, 1 A => 1 CA', '2 AB, 3 BC, 4 CA => 1 FUEL'
    ]
    rxns = [Reaction.from_string(line) for line in lines]
    rxn_map = {r.prd[0]: r for r in rxns}
    simplified = mx.simplify_reaction_set(rxn_map)
    assert simplified.rcts['A'] == 10
    assert simplified.rcts['B'] == 23
    assert simplified.rcts['C'] == 37
    assert mx.max_fuel(simplified, rxn_map, 1000) == 6
def test_example_01():
    lines = [
        '10 ORE => 10 A', '1 ORE => 1 B', '7 A, 1 B => 1 C', '7 A, 1 C => 1 D',
        '7 A, 1 D => 1 E', '7 A, 1 E => 1 FUEL'
    ]
    rxns = [Reaction.from_string(line) for line in lines]
    rxn_map = {r.prd[0]: r for r in rxns}
    simplified = mx.simplify_reaction_set(rxn_map)
    assert simplified.rcts['A'] == 28
    assert simplified.rcts['B'] == 1
    assert simplified.prd[1] == 1
    assert mx.max_fuel(simplified, rxn_map, 100) == 3
def test_example_03():
    lines = [
        '157 ORE => 5 NZVS', '165 ORE => 6 DCFZ',
        '44 XJWVT, 5 KHKGT, 1 QDVJ, 29 NZVS, 9 GPVTF, 48 HKGWZ => 1 FUEL',
        '12 HKGWZ, 1 GPVTF, 8 PSHF => 9 QDVJ', '179 ORE => 7 PSHF',
        '177 ORE => 5 HKGWZ', '7 DCFZ, 7 PSHF => 2 XJWVT',
        '165 ORE => 2 GPVTF', '3 DCFZ, 7 NZVS, 5 HKGWZ, 10 PSHF => 8 KHKGT'
    ]
    rxns = [Reaction.from_string(line) for line in lines]
    rxn_map = {r.prd[0]: r for r in rxns}
    simplified = mx.simplify_reaction_set(rxn_map)
    assert simplified.rcts['DCFZ'] == Fraction(1247, 8)
    assert simplified.rcts['GPVTF'] == Fraction(82, 9)
    assert simplified.rcts['HKGWZ'] == Fraction(1259, 24)
    assert simplified.rcts['NZVS'] == Fraction(267, 8)
    assert simplified.rcts['PSHF'] == Fraction(5801, 36)
    assert mx.max_fuel(simplified, rxn_map, 1_000_000_000_000) == 82892753
def test_example_04():
    lines = [
        '2 VPVL, 7 FWMGM, 2 CXFTF, 11 MNCFX => 1 STKFG',
        '17 NVRVD, 3 JNWZP => 8 VPVL',
        '53 STKFG, 6 MNCFX, 46 VJHF, 81 HVMC, 68 CXFTF, 25 GNMV => 1 FUEL',
        '22 VJHF, 37 MNCFX => 5 FWMGM', '139 ORE => 4 NVRVD',
        '144 ORE => 7 JNWZP',
        '5 MNCFX, 7 RFSQX, 2 FWMGM, 2 VPVL, 19 CXFTF => 3 HVMC',
        '5 VJHF, 7 MNCFX, 9 VPVL, 37 CXFTF => 6 GNMV', '145 ORE => 6 MNCFX',
        '1 NVRVD => 8 CXFTF', '1 VJHF, 6 MNCFX => 4 RFSQX', '176 ORE => 6 VJHF'
    ]
    rxns = [Reaction.from_string(line) for line in lines]
    rxn_map = {r.prd[0]: r for r in rxns}
    simplified = mx.simplify_reaction_set(rxn_map)
    assert simplified.rcts['JNWZP'] == Fraction(1185, 16)
    assert simplified.rcts['MNCFX'] == Fraction(12545, 3)
    assert simplified.rcts['NVRVD'] == Fraction(3149, 6)
    assert simplified.rcts['VJHF'] == Fraction(23809, 12)
    assert mx.max_fuel(simplified, rxn_map, 1_000_000_000_000) == 5586022
def test_example_05():
    lines = [
        '171 ORE => 8 CNZTR',
        '7 ZLQW, 3 BMBT, 9 XCVML, 26 XMNCP, 1 WPTQ, 2 MZWV, 1 RJRHP => 4 PLWSL',
        '114 ORE => 4 BHXH', '14 VRPVC => 6 BMBT',
        '6 BHXH, 18 KTJDG, 12 WPTQ, 7 PLWSL, 31 FHTLT, 37 ZDVW => 1 FUEL',
        '6 WPTQ, 2 BMBT, 8 ZLQW, 18 KTJDG, 1 XMNCP, 6 MZWV, 1 RJRHP => 6 FHTLT',
        '15 XDBXC, 2 LTCX, 1 VRPVC => 6 ZLQW',
        '13 WPTQ, 10 LTCX, 3 RJRHP, 14 XMNCP, 2 MZWV, 1 ZLQW => 1 ZDVW',
        '5 BMBT => 4 WPTQ', '189 ORE => 9 KTJDG',
        '1 MZWV, 17 XDBXC, 3 XCVML => 2 XMNCP',
        '12 VRPVC, 27 CNZTR => 2 XDBXC', '15 KTJDG, 12 BHXH => 5 XCVML',
        '3 BHXH, 2 VRPVC => 7 MZWV', '121 ORE => 7 VRPVC',
        '7 XCVML => 6 RJRHP', '5 BHXH, 4 VRPVC => 5 LTCX'
    ]
    rxns = [Reaction.from_string(line) for line in lines]
    rxn_map = {r.prd[0]: r for r in rxns}
    simplified = mx.simplify_reaction_set(rxn_map)
    assert simplified.rcts['BHXH'] == Fraction(753409, 252)
    assert simplified.rcts['CNZTR'] == Fraction(1092987, 16)
    assert simplified.rcts['KTJDG'] == Fraction(75119, 24)
    assert simplified.rcts['VRPVC'] == Fraction(163185319, 5040)
    assert mx.max_fuel(simplified, rxn_map, 1_000_000_000_000) == 460664