--- id: 5e4ce2b6ac708cc68c1df25e title: Остання літера-перша літера challengeType: 5 forumTopicId: 385256 dashedName: last-letter-first-letter --- # --description-- Одна дитяча гра розпочинається зі слова в певній категорії. Кожен учасник по черзі каже слово, що починається на останню літеру попереднього слова. Якщо слово вже назвали, повторювати його не можна. Якщо суперник не може назвати слово з певної категорії, він вибуває з гри. Нижче наведений приклад категорії "тварини",
Дитина 1: dog (собака) Дитина 2: goldfish (золота рибка) Дитина 1: hippopotamus (бегемот) Дитина 2: snake (змія) ...# --instructions-- Напишіть функцію, яка охоплює вхідний масив слів. Функція повинна видавати масив слів, в яких перша літера кожного слова така ж сама, як остання літера попереднього слова. Використовуйте лише слова з вхідного масиву, і якщо слово було використане, то повторювати його не можна. Слова в масиві видачі слід вибирати та впорядковувати таким чином, щоб вони були якомога довшими. # --hints-- `findLongestChain` повинен бути функцією. ```js assert(typeof findLongestChain == 'function'); ``` `findLongestChain(["certain", "each", "game", "involves", "starting", "with", "word"])` повинен видавати масив. ```js assert( Array.isArray( findLongestChain([ 'certain', 'each', 'game', 'involves', 'starting', 'with', 'word' ]) ) ); ``` `findLongestChain(["certain", "each", "game", "involves", "starting", "with", "word"])` повинен видавати `["involves", "starting", "game", "each"]`. ```js assert.deepEqual( findLongestChain([ 'certain', 'each', 'game', 'involves', 'starting', 'with', 'word' ]), ['involves', 'starting', 'game', 'each'] ); ``` `findLongestChain(["audino", "bagon", "kangaskhan", "banette", "bidoof", "braviary", "exeggcute", "yamask"])` повинен видавати `["braviary", "yamask", "kangaskhan"]` ```js assert.deepEqual( findLongestChain([ 'audino', 'bagon', 'kangaskhan', 'banette', 'bidoof', 'braviary', 'exeggcute', 'yamask' ]), ['braviary', 'yamask', 'kangaskhan'] ); ``` `findLongestChain(["harp", "poliwrath", "poochyena", "porygon2", "porygonz", "archana"])` повинен видавати `["poliwrath", "harp", "poochyena", "archana"]`. ```js assert.deepEqual( findLongestChain([ 'harp', 'poliwrath', 'poochyena', 'porygon2', 'porygonz', 'archana' ]), ['poliwrath', 'harp', 'poochyena', 'archana'] ); ``` `findLongestChain(["scolipede", "elephant", "zeaking", "sealeo", "silcoon", "tigers"])` повинен видавати `["scolipede", "elephant", "tigers", "sealeo"]`. ```js assert.deepEqual( findLongestChain([ 'scolipede', 'elephant', 'zeaking', 'sealeo', 'silcoon', 'tigers' ]), ['scolipede', 'elephant', 'tigers', 'sealeo'] ); ``` `findLongestChain(["loudred", "lumineon", "lunatone", "machamp", "magnezone", "nosepass", "petilil", "pidgeotto", "pikachu"])` повинен видавати `["machamp", "petilil", "lumineon", "nosepass"]`. ```js assert.deepEqual( findLongestChain([ 'loudred', 'lumineon', 'lunatone', 'machamp', 'magnezone', 'nosepass', 'petilil', 'pidgeotto', 'pikachu' ]), ['machamp', 'petilil', 'lumineon', 'nosepass'] ); ``` # --seed-- ## --seed-contents-- ```js function findLongestChain(items) { } ``` # --solutions-- ```js function findLongestChain(items) { function Ref(index, first_char, last_char) { this.index = index; this.first_char = first_char; this.last_char = last_char; } var items_len = items.length var refs_len = items_len; var refs = [] // enough space for all items var longest_path_refs_len = 0; var longest_path_refs = new Array(items_len); function search(curr_len) { if (curr_len > longest_path_refs_len) { longest_path_refs_len = curr_len; for (var i = 0; i < curr_len; i++) { longest_path_refs[i] = refs[i]; } } // recursive search var last_char = refs[curr_len - 1].last_char; for (var i = curr_len; i < refs_len; i++) if (refs[i].first_char == last_char) { var aux = refs[curr_len]; refs[curr_len] = refs[i]; refs[i] = aux; search(curr_len + 1); refs[i] = refs[curr_len]; refs[curr_len] = aux; } } for (var i = 0; i < items_len; i++) { var itemsi_len = items[i].length; refs.push(new Ref(i, items[i][0], items[i][itemsi_len - 1])); } // try each item as possible start for (var i = 0; i < items_len; i++) { var aux = refs[0]; refs[0] = refs[i]; refs[i] = aux; search(1); refs[i] = refs[0]; refs[0] = aux; } var longest_path_len = longest_path_refs_len; var longest_path = new Array(longest_path_len); for (var i = 0; i < longest_path_len; i++) longest_path[i] = items[longest_path_refs[i].index]; return longest_path; } ```