import Foundation

let input = """
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
"""


struct Chemical {
    let name: String
    let amount: Int
}

struct Reaction {
    let product: Chemical
    let educts: [Chemical]
}

var reactions: [String: Reaction] = [:]

let scanner = Scanner(string: input)

func parseChemical() -> Chemical? {
    guard let amount = scanner.scanInt(),
        let name = scanner.scanCharacters(from: .letters) else {
            return nil
    }
    return Chemical(name: name, amount: amount)
}

func parseReaction() -> Reaction? {
    var educts: [Chemical] = []
    repeat {
        guard let chemical = parseChemical() else {
            return nil
        }
        educts.append(chemical)
    } while scanner.scanString(",") != nil
    guard scanner.scanString("=>") != nil else {
        return nil
    }
    guard let product = parseChemical() else {
        return nil
    }

    return Reaction(product: product, educts: educts)
}

while !scanner.isAtEnd {
    guard let reaction = parseReaction() else {
        fatalError()
    }

    reactions[reaction.product.name] = reaction
}