Сегодняшняя головоломка довольно сбивает с толку, как ее решить. Если мы посмотрим на образцы данных:

light red bags contain 1 bright white bag, 2 muted yellow bags.
dark orange bags contain 3 bright white bags, 4 muted yellow bags.
bright white bags contain 1 shiny gold bag.
muted yellow bags contain 2 shiny gold bags, 9 faded blue bags.
shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags.
dark olive bags contain 3 faded blue bags, 4 dotted black bags.
vibrant plum bags contain 5 faded blue bags, 6 dotted black bags.
faded blue bags contain no other bags.
dotted black bags contain no other bags.

Учитывая все сумки разного цвета, найдите, какие сумки могут вместить блестящую золотую сумку. Это количество включает мешки любой глубины, поэтому мы не можем просто искать блестящие золотые мешочки во второй части каждой строки. Например:

bright white bags contain 1 shiny gold bag.
muted yellow bags contain 2 shiny gold bags, 9 faded blue bags.

В этих двух строках мы видим, что ярко-белые сумки и приглушенно-желтые сумки могут содержать блестящие золотые сумки. Однако если мы пойдем на один уровень глубже:

bright white bags contain 1 shiny gold bag.
muted yellow bags contain 2 shiny gold bags, 9 faded blue bags.
dark orange bags contain 3 bright white bags, 4 muted yellow bags.
light red bags contain 1 bright white bag, 2 muted yellow bags.
dark orange bags
    -> bright white bags
        -> shiny gold bags
    -> muted yellow bags
        -> shiny gold bags
little red bags
    -> bright white bags
        -> shiny gold bags
    -> muted yellow bags
        -> shiny gold bags

Итак, всего существует четыре возможных цвета пакетов, которые содержат блестящие золотые пакеты.

function day7(input){
    let arr = input.split('\n')
}

Первое, что нам нужно сделать, это разделить каждую строку на сумку, которая содержит этот пакет.

function day7(input){
    let arr = input.split('\n')
    for(let str of arr){
        const [bag, bags] = str.split(' bags contain ')
    }
}
//arr[0] or str = "light red bags contain 1 bright white bag, 2 muted yellow bags."
//bag = light red
//bags = 1 bright white bag, 2 muted yellow bags

По сути, то, что мы хотим сделать с данными, - это создать структуру, которая выглядит примерно так:

dark orange bags
    bright white bags
    shiny gold bags
    muted yellow bags
little red bags
    bright white bags
    shiny gold bags
    muted yellow bags
bright white bags
    shiny gold bags
muted yellow bags
    shiny gold bags

С помощью карты мы можем создать структуру, в которой уникальный ключ, содержащий мешок, будет указывать на все цвета, которые он может содержать. В конце концов, мы сможем перебрать все ключи и найти все возможные цвета, которые содержат блестящие золотые мешочки.

function day7(input){
    let arr = input.split('\n')
    const map = new Map()
    for(let str of arr){
        const [bag, bags] = str.split(' bags contain ')
        if(!map.has(bag)){
            map.set(bag, [])
        }
    }
}

Это будет создавать ключ для каждого цвета, который содержит другой пакет, указывающий на массив цветов, который он может удерживать внутри него.

function day7(input){
    let arr = input.split('\n')
    const map = new Map()
    for(let str of arr){
        const [bag, bags] = str.split(' bags contain ')
        if(!map.has(bag)){
            map.set(bag, [])
        }
    }
}
const colors = map.keys()
let total = 0
for(const color of colors){
    if(hasGold(color) && color != 'shiny gold bags')
        total++
}
function hasGold(color){
    if(color === 'shiny gold bags') return true
    if(!map.has(color)) return false
    const bagsWithin = map.get(color)
    for(const {color: bag} of bagsWithin){
        if(hasGold(bag)
            return true
    }
    return false
}
return total