212 lines
5.6 KiB
Markdown
212 lines
5.6 KiB
Markdown
![]() |
---
|
|||
|
id: 5e4ce2b6ac708cc68c1df25e
|
|||
|
title: Остання літера-перша літера
|
|||
|
challengeType: 5
|
|||
|
forumTopicId: 385256
|
|||
|
dashedName: last-letter-first-letter
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
Одна дитяча гра розпочинається зі слова в певній категорії. Кожен учасник по черзі каже слово, що починається на останню літеру попереднього слова. Якщо слово вже назвали, повторювати його не можна. Якщо суперник не може назвати слово з певної категорії, він вибуває з гри.
|
|||
|
|
|||
|
Нижче наведений приклад категорії "тварини",
|
|||
|
|
|||
|
<pre>Дитина 1: dog (собака)
|
|||
|
Дитина 2: goldfish (золота рибка)
|
|||
|
Дитина 1: hippopotamus (бегемот)
|
|||
|
Дитина 2: snake (змія)
|
|||
|
...
|
|||
|
</pre>
|
|||
|
|
|||
|
# --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;
|
|||
|
}
|
|||
|
```
|