Home » Check ingredient availability for dishes

Check ingredient availability for dishes

Problem Table1 contains the list of ingredients which can be used to prepare a dish. Problem Table2 contains the inventory of ingredients. List the ingredients against the dishes which are available to prepare the dishes on the basis of inventory going sequentially from A to D. Ingredients in result should be sorted. Ex. B contains p3 & p4 but p3 inventory is 1 and is already used by A. Hence, for B, only p4 is available.

📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 274
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Check ingredient availability for dishes with Power Query

Power Query solution 1 for Check ingredient availability for dishes, proposed by Kris Jaganah:
let
  A = (x) => Excel.CurrentWorkbook(){[Name = "Table" & x]}[Content], 
  B = Table.ExpandListColumn(
    Table.TransformColumns(A("2"), {"Inventory", each {1 .. _}}), 
    "Inventory"
  ), 
  C = Table.AddIndexColumn(A("1"), "Id"), 
  D = Table.AddColumn(
    C, 
    "Count", 
    each Table.RowCount(Table.SelectRows(C, (w) => w[Ingredient] = [Ingredient] and w[Id] <= [Id]))
  ), 
  E = Table.AddColumn(
    D, 
    "Avail", 
    each Table.SelectRows(B, (z) => z[Ingredient] = [Ingredient] and z[Inventory] = [Count])[
      Ingredient
    ]{0}?
  ), 
  F = Table.Group(E, "Dish", {"Ingedient", each Text.Combine(List.Sort([Avail]), ", ")})
in
  F
Power Query solution 2 for Check ingredient availability for dishes, proposed by Luan Rodrigues:
let
  Fonte = Table.ExpandListColumn(
    Table.TransformColumns(Tabela2, {"Inventory", each {1 .. _}}), 
    "Inventory"
  ), 
  grp = Table.Group(Tabela1, {"Ingredient"}, {{"Tab", each Table.AddIndexColumn(_, "Ind", 1)}}), 
  exp = Table.ExpandTableColumn(grp, "Tab", {"Dish", "Ind"}), 
  mesc = Table.Join(exp, {"Ingredient", "Ind"}, Fonte, {"Ingredient", "Inventory"}), 
  res = Table.Group(mesc, {"Dish"}, {{"Ingredient", each Text.Combine(_[Ingredient], ", ")}}), 
  srt = Table.Sort(res, {{"Dish", Order.Ascending}})
in
  srt
Power Query solution 3 for Check ingredient availability for dishes, proposed by Hussein SATOUR:
let
  Source1 = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  AddIndex = Table.AddIndexColumn(Source1, "Index", 1, 1, Int64.Type), 
  AddCustom = Table.AddColumn(
    AddIndex, 
    "Custom", 
    each 
      let
        a = [Ingredient], 
        b = [Index], 
        c = Table.RowCount(Table.SelectRows(Table.FirstN(AddIndex, b), each [Ingredient] = a)), 
        d = List.Max(
          Table.SelectRows(
            Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], 
            each [Ingredient] = a
          )[Inventory]
        )
      in
        if d >= c then "Y" else "N"
  ), 
  FilterRows = Table.SelectRows(AddCustom, each ([Custom] = "Y")), 
  GroupRows = Table.Group(FilterRows, {"Dish"}, {{"Ingredient", each List.Sort(_[Ingredient])}}), 
  ExtractVals = Table.TransformColumns(GroupRows, {"Ingredient", each Text.Combine(_, ",")})
in
  ExtractVals
Power Query solution 4 for Check ingredient availability for dishes, proposed by Ramiro Ayala Chávez:
let
  t1 = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  t2 = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], 
  a = Table.AddColumn(t1, "Q", each t2[Inventory]{List.PositionOf(t2[Ingredient], [Ingredient])}), 
  b = Table.Group(a, "Ingredient", {"G", each _})[G], 
  c = Table.Combine(List.Transform(b, each Table.AddIndexColumn(_, "I", 1))), 
  d = Table.SelectRows(Table.AddColumn(c, "D", each [Q] - [I]), each [D] >= 0)[[Dish], [Ingredient]], 
  Sol = Table.Sort(
    Table.Group(d, "Dish", {"Ingredient", each Text.Combine(List.Sort([Ingredient]), ", ")}), 
    {"Dish", 0}
  )
in
  Sol
Power Query solution 5 for Check ingredient availability for dishes, proposed by Eric Laforce:
let
  fxSource = (n) => Excel.CurrentWorkbook(){[Name = n]}[Content], 
  tInv = Table.Buffer(fxSource("tData273_2")), 
  Source = fxSource("tData273_1"), 
  li = List.Buffer(Source[Ingredient]), 
  AddCpt = Table.AddColumn(
    Table.AddIndexColumn(Source, "Idx"), 
    "Cpt", 
    (r) =>
      [
        i   = r[Ingredient], 
        n   = List.Count(List.Select(List.FirstN(li, r[Idx] + 1), each _ = i)), 
        inv = Table.SelectRows(tInv, each [Ingredient] = i)[Inventory]{0}, 
        ok  = (n <= inv)
      ][ok]
  ), 
  Filter = Table.SelectRows(AddCpt, each ([Cpt] = true))[[Dish], [Ingredient]], 
  Group = Table.Group(Filter, "Dish", {"Ingredient", each Text.Combine([Ingredient], ", ")})
in
  Group
Power Query solution 6 for Check ingredient availability for dishes, proposed by Seokho MOON:
let
  Tbl1 = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Tbl2 = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content], 
  Group = Table.Group(Tbl1, "Ingredient", {"Dish", each [Dish]}), 
  Join = Table.Join(Group, "Ingredient", Tbl2, "Ingredient"), 
  TblRepl = Table.ReplaceValue(
    Join, 
    each [Dish], 
    each List.FirstN([Dish], [Inventory]), 
    Replacer.ReplaceValue, 
    {"Dish"}
  )[[Dish], [Ingredient]], 
  Expand = Table.Sort(Table.ExpandListColumn(TblRepl, "Dish"), "Dish"), 
  Res = Table.Group(
    Expand, 
    "Dish", 
    {"Ingredient", each Text.Combine(List.Sort([Ingredient]), ", ")}, 
    0
  )
in
  Res
Power Query solution 7 for Check ingredient availability for dishes, proposed by Antriksh Sharma:
let
  Dishes = Table.Sort(
    Table1, 
    {{"Dish", Order.Ascending}, {each Text.End([Ingredient], 1), Order.Ascending}}
  ), 
  Inventory = Table.PrefixColumns(Table2, "T2"), 
  Acc = List.Accumulate(
    List.Distinct(Dishes[Dish]), 
    [T1 = {Dishes}, T2 = {Inventory}, S = {}], 
    (state, current) => [
      a = Table.SelectRows(List.First(state[T1]), (x) => x[Dish] = current), 
      b = Table.Join(a, "Ingredient", List.Last(state[T2]), "T2.Ingredient", JoinKind.RightOuter), 
      c = Table.FromRows(
        Table.ToList(
          b, 
          each List.FirstN(_, 3)
            & {if List.First(_) = current then List.Last(_) - 1 else List.Last(_)}
        ), 
        Table.ColumnNames(b)
      ), 
      d = Text.Combine(List.RemoveNulls(c[Ingredient]), ", "), 
      e = Table.SelectRows(c[[T2.Ingredient], [T2.Inventory]], each [T2.Inventory] > 0), 
      T1 = state[T1] & {a}, 
      T2 = state[T2] & {e}, 
      S = state[S] & {d}
    ]
  ), 
  Result = Table.FromColumns(
    {List.Distinct(Dishes[Dish])} & {Acc[S]}, 
    type table [Dish = text, Ingredients = text]
  )
in
  Result
Power Query solution 8 for Check ingredient availability for dishes, proposed by Peter Krkos:
let
 Table1 = Expression.Evaluate("Table.FromRows(List.Transform(Text.Split(""A;p1|A;p3|A;p2|B;p4|B;p3|C;p1|C;p2|D;p1|D;p5|D;p4|D;p2"",""|""), each Text.Split(_, "";"")), {""Dish"",""Ingredient""})", hashtag#shared),
 Table2 = Table.TransformColumnTypes(Expression.Evaluate("Table.FromRows(List.Transform(Text.Split(""p1;1|p2;2|p3;1|p4;2|p5;4"",""|""), each Text.Split(_, "";"")), {""Ingredient"",""Inventory""})", hashtag#shared), {{"Inventory", Int64.Type}}),
 T2R = Function.Invoke(Record.FromList, List.Reverse(Table.ToColumns(Table2))),
 Values = List.Accumulate(Table1[Ingredient], {{}, T2R}, (s,c)=>
 let curValue = Record.Field(s{1}, c) in { s{0} & {if curValue > 0 then c else null}, s{1} & Record.AddField([], c, curValue-1) }),
 Merged = Table.FromColumns({Table1[Dish]} & {Values{0}}, type table[Dish=text, Ingredient=text]),
 GroupedRows = Table.Group(Merged, {"Dish"}, {{"Ingredient", each Text.Combine(List.Sort([Ingredient]), ", "), type text}})
in
 GroupedRows


                    
                  
          
Power Query solution 9 for Check ingredient availability for dishes, proposed by Alexandre Garcia:
let
  A = each Excel.CurrentWorkbook(){[Name = "Table" & _]}[Content], 
  B = (
    (v) =>
      List.Generate(
        () => 0, 
        each _ < List.Count(v), 
        each _ + 1, 
        each 
          if List.Select(Table.ToRows(A("2")), (x) => x{0} = v{_}{1}){0}{1}
            < List.Count(List.Select(List.Range(v, 0, _ + 1), (x) => x{1} = v{_}{1}))
          then
            {v{_}{0}, null}
          else
            v{_}
      )
  )(Table.ToRows(A("1"))), 
  C = Table.FromList(
    List.Distinct(A("1")[Dish]), 
    (x) => {x, Text.Combine(List.Sort(List.Zip(List.Select(B, each _{0} = x)){1}), ", ")}, 
    Value.Type(A("1"))
  )
in
  C
Power Query solution 10 for Check ingredient availability for dishes, proposed by Maciej Kopczyński:
let
  source = Excel.CurrentWorkbook(){[Name = "tblStart1"]}[Content], 
  firstGrouping = Table.TransformColumns(
    Table.Group(source, {"Ingredient"}, {{"Rows", each _, type table}}), 
    {{"Rows", each Table.AddIndexColumn(_, "ID", 1, 1)}}
  )[[Rows]], 
  expandRows = Table.ExpandTableColumn(firstGrouping, "Rows", {"Dish", "Ingredient", "ID"}), 
  mergeWStock = Table.NestedJoin(
    expandRows, 
    {"Ingredient"}, 
    tblStock, 
    {"Ingredient"}, 
    "tblStock", 
    JoinKind.LeftOuter
  ), 
  expandStock = Table.ExpandTableColumn(mergeWStock, "tblStock", {"Inventory"}, {"Inventory"}), 
  selectRows = Table.SelectRows(expandStock, each [ID] <= [Inventory]), 
  secondGrouping = Table.Sort(
    Table.Group(
      selectRows, 
      {"Dish"}, 
      {{"Ingredient", each Text.Combine([Ingredient], ", "), type text}}
    ), 
    {"Dish", Order.Ascending}
  )
in
  secondGrouping
Power Query solution 11 for Check ingredient availability for dishes, proposed by Fredson Alves Pinho:
let
  Fonte = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  join = Table.ExpandTableColumn(
    Table.NestedJoin(Fonte, {"Ingredient"}, Table2, {"Ingredient"}, "Table2"), 
    "Table2", 
    {"Inventory"}
  ), 
  Index = Table.AddIndexColumn(
    Table.Sort(join, {{"Dish", Order.Ascending}, {"Ingredient", Order.Ascending}}), 
    "Index"
  ), 
  fn = (i, p) => Table.RowCount(Table.SelectRows(Index, each [Index] < i and [Ingredient] = p)), 
  filter = Table.SelectRows(Index, each [Inventory] - fn([Index], [Ingredient]) > 0)[
    [Dish], 
    [Ingredient]
  ], 
  group = Table.Group(
    filter, 
    {"Dish"}, 
    {{"Ingredient", each Text.Combine(_[Ingredient], ", "), type text}}
  )
in
  group
Power Query solution 12 for Check ingredient availability for dishes, proposed by Aleksandar Kovacevic:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Fx = each [
    a = Table.SelectRows(Table2, (x) => List.Max(_[Ingredient]) = x[Ingredient])[Inventory]{0}, 
    b = List.Count(_[Dish]), 
    c = List.FirstN(_[Dish], if a < b then a else b)
  ][c], 
  Grp = Table.ExpandListColumn(Table.Group(Source, {"Ingredient"}, {{"Dish", Fx}}), "Dish"), 
  Res = Table.Sort(
    Table.Group(Grp, {"Dish"}, {{"Ingedient", each Text.Combine(_[Ingredient], ", ")}}), 
    "Dish"
  )
in
  Res

Solving the challenge of Check ingredient availability for dishes with Excel

Excel solution 1 for Check ingredient availability for dishes, proposed by Bo Rydobon 🇹🇭:
=LET(d,
    A2:A12,
    i,
    B2:B12,
    j,
    D2:D6,
    u,
    UNIQUE(
        d
    ),
    
HSTACK(VSTACK(
    A1,
    u
),
    REDUCE(B1,
    u,
    LAMBDA(a,
    v,
    VSTACK(a,
    TEXTJOIN(", ",
    ,
    SORT(FILTER(i,
    (d=v)*(XLOOKUP(
        i,
        j,
        E2:E6-BYROW(
            N(
                j=TEXTSPLIT(
                    ARRAYTOTEXT(
                        a
                    ),
                    ", "
                )
            ),
            SUM
        )
    ))))))))))

=GROUPBY(
    A1:A12,
    B1:B12,
    LAMBDA(
        x,
        ARRAYTOTEXT(
            SORT(
                x
            )
        )
    ),
    3,
    0,
    ,
    MAP(
        B2:B12,
        LAMBDA(
            x,
            LOOKUP(
                x,
                D2:E6
            )>=COUNTIF(
                B2:x,
                x
            )
        )
    )
)
Excel solution 2 for Check ingredient availability for dishes, proposed by 🇰🇷 Taeyong Shin:
=LET(d,
    A2:A12,
    r,
    D2:D6,
    DROP(REDUCE(HSTACK(
        0,
        LAMBDA(
            E2:E6
        )
    ),
    UNIQUE(
        d
    ),
    LAMBDA(a,
    v,
    LET(i,
    (@TAKE(
        a,
        -1,
        -1
    ))(),
    p,
    FILTER(
        r,
        i
    ),
    x,
    XLOOKUP(
        FILTER(
            B2:B12,
            d=v
        ),
        p,
        p,
        ""
    ),
    VSTACK(
        a,
        HSTACK(
            v,
            TEXTJOIN(
                ", ",
                ,
                SORT(
                    x
                )
            ),
            LAMBDA(
                i-ISNUMBER(
                    XMATCH(
                        r,
                        x
                    )
                )
            )
        )
    )))),
    1,
    -1))
Excel solution 3 for Check ingredient availability for dishes, proposed by Kris Jaganah:
=LET(
    a,
    SORT(
        TEXTSPLIT(
            CONCAT(
                REPT(
                    D2:D6&",",
                    E2:E6
                )
            ),
            ,
            ",",
            1
        )
    ),
    b,
    a&"-"&SEQUENCE(
        ROWS(
            a
        )
    )-XMATCH(
        a,
        a
    )+1,
    c,
    B2:B12,
    d,
    c&"-"&MAP(
        c,
        LAMBDA(
            x,
            SUM(
                N(
                    B2:x=x
                )
            )
        )
    ),
    e,
    XLOOKUP(
        d,
        b,
        a,
        ""
    ),
    VSTACK(
        A1:B1,
        GROUPBY(
            A2:A12,
            e,
            LAMBDA(
                x,
                TEXTJOIN(
                    ", ",
                    ,
                    SORT(
                        x
                    )
                )
            ),
            ,
            0
        )
    )
)
Excel solution 4 for Check ingredient availability for dishes, proposed by Oscar Mendez Roca Farell:
=LET(
    s,
     SEQUENCE(
         ,
         MAX(
             E2:E6
         )
     ),
     m,
     MAP(
         B2:B12,
          LAMBDA(
              b,
               b&-COUNTIF(
                   B2:b,
                   b
               )
          )
     ),
    t,
    TOCOL(
        IFS(
            E2:E6>=s,
            D2:D6&-s
        ),
        2
    ),
     DROP(
         GROUPBY(
             XLOOKUP(
                 t,
                 m,
                 A2:A12
             ),
             MID(
                 t,
                 1,
                 2
             ),
             ARRAYTOTEXT,
             ,
             0
         ),
         -1
     )
)
Excel solution 5 for Check ingredient availability for dishes, proposed by Duy Tùng:
=GROUPBY(
    A1:A12,
    B1:B12,
    LAMBDA(
        x,
        ARRAYTOTEXT(
            SORT(
                x
            )
        )
    ),
    3,
    0,
    ,
    LOOKUP(
        B2:B12,
        D2:E6
    )-MAP(
        B2:B12,
        LAMBDA(
            v,
            SUM(
                N(
                    B2:v=v
                )
            )
        )
    )>=0
)

_x000D_

Excel solution 6 for Check ingredient availability for dishes, proposed by LEONARD OCHEA 🇷🇴:
=LET(i,
    B2:B12,
    GROUPBY(A2:A12,
    REDUCE("",
    UNIQUE(
        i
    ),
    LAMBDA(a,
    h,
    a&MAP(i,
    LAMBDA(v,
    IF((COUNTIF(
        B2:v,
        h
    )<=XLOOKUP(
        h,
        D2:D6,
        E2:E6
    ))*(v=h),
    h,
    ""))))),
    LAMBDA(
        x,
        TEXTJOIN(
            ", ",
            ,
            SORT(
                x
            )
        )
    ),
    ,
    0))

_x000D_

_x000D_

Excel solution 7 for Check ingredient availability for dishes, proposed by Md. Zohurul Islam:

=LET(
    u,
    A2:A12,
    v,
    B2:B12,
    p,
    D2:D6,
    q,
    E2:E6,
    hdr,
    A1:B1,
    
    a,
    XLOOKUP(
        v,
        p,
        q
    ),
    
    b,
    MAP(
        v,
        SEQUENCE(
            ROWS(
                v
            )
        ),
        LAMBDA(
            x,
            y,
            SUM(
                ABS(
                    TAKE(
                        v,
                        y
                    )=x
                )
            )
        )
    ),
    
    c,
    FILTER(
        HSTACK(
            u,
            v
        ),
        a>=b
    ),
    
    d,
    SORT(
        c,
        {1,
        2},
        {1,
        1}
    ),
    
    e,
    GROUPBY(
        TAKE(
            d,
            ,
            1
        ),
        DROP(
            d,
            ,
            1
        ),
        ARRAYTOTEXT,
        0,
        0
    ),
    
    VSTACK(
        hdr,
        e
    )
)


_x000D_

_x000D_

Excel solution 8 for Check ingredient availability for dishes, proposed by Pieter de B.:

=GROUPBY(
    A2:A12,
    MAP(
        B2:B12,
        LAMBDA(
            b,
            LET(
                c,
                SUM(
                    N(
                        B2:b=b
                    )
                ),
                IF(
                    c<=LOOKUP(
                        b,
                        D2:E6
                    ),
                    b,
                    ""
                )
            )
        )
    ),
    LAMBDA(
        x,
        TEXTJOIN(
            ", ",
            ,
            SORT(
                x
            )
        )
    ),
    ,
    0
)


_x000D_

_x000D_

Excel solution 9 for Check ingredient availability for dishes, proposed by Hamidi Hamid:

=LET(
    aa,
    A2:A12,
    bb,
    B2:B12,
    f,
    LAMBDA(
        k,
        DROP(
            REDUCE(
                0,
                k,
                LAMBDA(
                    a,
                    b,
                    IFNA(
                        VSTACK(
                            a,
                            TEXTSPLIT(
                                b,
                                ", ",
                                
                            )
                        ),
                        ""
                    )
                )
            ),
            1
        )
    ),
    x,
    GROUPBY(
        aa,
        bb,
        COUNTA,
        ,
        0
    ),
    y,
    DROP(
        GROUPBY(
            aa,
            bb,
            ARRAYTOTEXT,
            ,
            0
        ),
        ,
        1
    ),
    b,
    MAP(
        bb,
        LAMBDA(
            a,
            COUNTIF(
                B2:a,
                a
            )
        )
    ),
    g,
    DROP(
        GROUPBY(
            aa,
            b,
            ARRAYTOTEXT,
            ,
            0
        ),
        ,
        1
    ),
    rg,
    f(
        g
    ),
    ry,
    f(
        y
    ),
    h,
    IFERROR(
        IF(
            XLOOKUP(
                ry,
                D2:D6,
                E2:E6,
                0
            )-rg<0,
            "",
            ry
        ),
        ""
    ),
    HSTACK(
        UNIQUE(
            A2:A12
        ),
        BYROW(
            h,
            LAMBDA(
                a,
                TEXTJOIN(
                    ", ",
                    1,
                    SORT(
                        a,
                        1,
                        1,
                        1
                    )
                )
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 10 for Check ingredient availability for dishes, proposed by Asheesh Pahwa:

=LET(
    m,
    MAP(
        D2:D6,
        E2:E6,
        LAMBDA(
            x,
            y,
            LET(
                f,
                FILTER(
                    A2:A12,
                    B2:B12=x
                ),
                ARRAYTOTEXT(
                    TAKE(
                        f,
                        y
                    )
                )
            )
        )
    ),
    u,
    UNIQUE(
        A2:A12
    ),
    HSTACK(
        u,
        MAP(
            u,
            LAMBDA(
                x,
                ARRAYTOTEXT(
                    FILTER(
                        D2:D6,
                        ISNUMBER(
                            SEARCH(
                                x,
                                m
                            )
                        )
                    )
                )
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 11 for Check ingredient availability for dishes, proposed by ferhat CK:

=LET(a,
    REDUCE({"Ingredient",
    "Inventory"},
    D2:D6,
    LAMBDA(x,
    y,
    VSTACK(x,
    LET(f,
    FILTER(
        A2:B12,
        B2:B12=y
    ),
    HSTACK(f,
    SCAN(XLOOKUP(
        y,
        D2:D6,
        E2:E6
    ),
    (-1)*SEQUENCE(
        ROWS(
            f
        )
    )^0,
    SUM)))))),
    GROUPBY(
        TAKE(
            a,
            ,
            1
        ),
        CHOOSECOLS(
            a,
            2
        ),
        ARRAYTOTEXT,
        3,
        0,
        ,
        TAKE(
            a,
            ,
            -1
        )>-1
    ))


_x000D_

_x000D_

Excel solution 12 for Check ingredient availability for dishes, proposed by Jaroslaw Kujawa:

=LET(
    b;
    A2:B12;
    c;
    DROP(
        REDUCE(
            "";
            B2:B12;
            LAMBDA(
                a;
                x;
                VSTACK(
                    a;
                    XLOOKUP(
                        x;
                        $D$2:$D$6;
                        $E$2:$E$6
                    )-COUNTIF(
                        $B$2:x;
                        x
                    )
                )
            )
        );
        1
    );
    d;
    HSTACK(
        b;
        c
    );
    e;
    DROP(
        FILTER(
            d;
            TAKE(
                d;
                ;
                -1
            )>=0
        );
        ;
        -1
    );
    GROUPBY(
        TAKE(
            e;
            ;
            1
        );
        TAKE(
            e;
            ;
            -1
        );
        ARRAYTOTEXT;
        ;
        0
    )
)


_x000D_

_x000D_

Excel solution 13 for Check ingredient availability for dishes, proposed by Gerson Pineda:

=LET(
    i,
    B2:B12,
    GROUPBY(
        A2:A12,
        i,
        LAMBDA(
            x,
            ARRAYTOTEXT(
                SORT(
                    x
                )
            )
        ),
        ,
        0,
        ,
        XLOOKUP(
            i,
            D2:D6,
            E2:E6
        )>=MAP(
            i,
            LAMBDA(
                x,
                COUNTIF(
                    B2:x,
                    x
                )
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 14 for Check ingredient availability for dishes, proposed by LUIS FLORENTINO COUTO CORTEGOSO:

=LET(
    m,
    B1:B12,
    GROUPBY(
        A1:A12,
        m,
        LAMBDA(
            x,
            ARRAYTOTEXT(
                SORT(
                    x
                )
            )
        ),
        3,
        0,
        ,
        MAP(
            m,
            LAMBDA(
                x,
                COUNTIF(
                    B2:x,
                    x
                )
            )
        )<=LOOKUP(
            m,
            D2:E6
        )
    )
)


_x000D_

_x000D_

Excel solution 15 for Check ingredient availability for dishes, proposed by Ricardo Romero Garcia:

=LET(
    e;
    ELEGIRCOLS;
    f;
    FILTRAR;
    m;
    D2:D6;
    x;
    REDUCE(
        A1:C1;
        m;
        LAMBDA(
            aa;
            vv;
            APILARV(
                LET(
                    b;
                    f(
                        A2:B12;
                        B2:B12=vv
                    );
                    d;
                    f(
                        E2:E6;
                        m=vv
                    );
                    c;
                    SCAN(
                        0;
                        SECUENCIA(
                            FILAS(
                                b
                            )
                        );
                        LAMBDA(
                            a;
                            v;
                            SI(
                                v<=d;
                                1
                            )
                        )
                    );
                    f(
                        APILARH(
                            b;
                            c
                        );
                        c
                    )
                );
                aa
            )
        )
    );
    y;
    ORDENARPOR(
        x;
        e(
            --x;
            3
        );
        ;
        e(
            x;
            1
        );
        ;
        e(
            x;
            2
        );
        
    );
    AGRUPARPOR(
        e(
            y;
            1
        );
        e(
            y;
            2
        );
        MATRIZATEXTO;
        3;
        0
    )
)


_x000D_


Solving the challenge of Check ingredient availability for dishes with Python


_x000D_

Python solution 1 for Check ingredient availability for dishes, proposed by Luan Rodrigues:

import pandas as pd
file = r"PQ_Challenge_274.xlsx"
df1 = pd.read_excel(file,usecols="A:B").dropna()
df2 = pd.read_excel(file,usecols="D:E", nrows=5)
df2 =  (df2.assign(Inventory=df2['Inventory'].apply(lambda x: list(range(1,x+1))))
 .explode('Inventory'))
df1['Ind'] = df1.groupby(['Ingredient']).cumcount()+1
mrg = df1.merge(
 df2,
 left_on=["Ingredient", "Ind"],
 right_on=["Ingredient.1", "Inventory"],
 how="inner"
)
rst = mrg.groupby('Dish')['Ingredient'].agg(','.join).reset_index()
 
print(rst)
                    
                  


_x000D_


Solving the challenge of Check ingredient availability for dishes with Python in Excel


_x000D_

Python in Excel solution 1 for Check ingredient availability for dishes, proposed by Alejandro Campos:

df1, df2 = xl("A1:B12", headers=True), xl("D1:E6", headers=True)
inventory = {k: v for k, v in zip(df2["Ingredient"], df2["Inventory"])}
result = [{"Dish": d, "Ingredients": ", ".join(i for i in sorted(df1[df1["Dish"] == d]["Ingredient"]) 
 if inventory.get(i, 0) and not (inventory.update({i: inventory[i] - 1}) or 0))} for d in df1["Dish"].unique()]
result_df = pd.DataFrame(result)
                    
                  


_x000D_

_x000D_

Python in Excel solution 2 for Check ingredient availability for dishes, proposed by Francesco Bianchi 🇮🇹:

Hello, my Python in Excel solution:
df1 = xl("Sheet1!$A$1:$B$12", headers=True)
df2 =xl("Sheet1!$D$1:$E$6", headers=True)
df = pd.merge(df1, df2, left_on='Ingredient', right_on='Ingredient')
df = df[df['Inventory'] >= df.groupby('Ingredient')['Ingredient'].cumcount()+1]
df.groupby('Dish')['Ingredient'].apply(lambda x: ', '.join(sorted(', '.join(x).split(', ')))).reset_index()
                    
                  


_x000D_
&&

Leave a Reply