Files
wehub-resource-sync dde272c4b8
i18n - Build Validation / Validate i18n Builds (24) (push) Has been cancelled
CI - Node.js / Lint (24) (push) Has been cancelled
CI - Node.js / Build (24) (push) Has been cancelled
CI - Node.js / Test (24) (push) Has been cancelled
CI - Node.js / Test - Upcoming Changes (24) (push) Has been cancelled
CI - Node.js / Test - i18n (italian, 24) (push) Has been cancelled
CI - Node.js / Test - i18n (portuguese, 24) (push) Has been cancelled
CD - Docker - GHCR Images / Build and Push Images (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:55:53 +08:00

2.0 KiB

id, title, challengeType, dashedName
id title challengeType dashedName
6a26df3e2988bcdded204893 Challenge 357: Food Chain 28 challenge-357

--description--

Given an array of [predator, prey] pairs, return the food chain from the apex predator down to the bottom.

  • The apex predator is the animal that is never prey to another animal.
  • Return the chain as an array of strings.

--hints--

getFoodChain([["cat", "mouse"]]) should return ["cat", "mouse"].

assert.deepEqual(getFoodChain([["cat", "mouse"]]), ["cat", "mouse"]);

getFoodChain([["wolf", "deer"], ["deer", "grass"]]) should return ["wolf", "deer", "grass"].

assert.deepEqual(getFoodChain([["wolf", "deer"], ["deer", "grass"]]), ["wolf", "deer", "grass"]);

getFoodChain([["hawk", "snake"], ["snake", "frog"], ["frog", "fly"]]) should return ["hawk", "snake", "frog", "fly"].

assert.deepEqual(getFoodChain([["hawk", "snake"], ["snake", "frog"], ["frog", "fly"]]), ["hawk", "snake", "frog", "fly"]);

getFoodChain([["rabbit", "grass"], ["fox", "rabbit"], ["eagle", "fox"]]) should return ["eagle", "fox", "rabbit", "grass"].

assert.deepEqual(getFoodChain([["rabbit", "grass"], ["fox", "rabbit"], ["eagle", "fox"]]), ["eagle", "fox", "rabbit", "grass"]);

getFoodChain([["seal", "salmon"], ["herring", "shrimp"], ["orca", "seal"], ["shrimp", "plankton"], ["salmon", "herring"]]) should return ["orca", "seal", "salmon", "herring", "shrimp", "plankton"].

assert.deepEqual(getFoodChain([["seal", "salmon"], ["herring", "shrimp"], ["orca", "seal"], ["shrimp", "plankton"], ["salmon", "herring"]]), ["orca", "seal", "salmon", "herring", "shrimp", "plankton"]);

--seed--

--seed-contents--

function getFoodChain(pairs) {

  return pairs;
}

--solutions--

function getFoodChain(pairs) {
  const prey = new Set(pairs.map(([, p]) => p));
  const map = Object.fromEntries(pairs);
  const apex = pairs.map(([p]) => p).find(p => !prey.has(p));
  const chain = [apex];
  while (map[chain.at(-1)]) chain.push(map[chain.at(-1)]);
  return chain;
}