chore(i18n,curriculum): processed translations - new ukrainian (#44447)

This commit is contained in:
camperbot
2021-12-10 11:14:24 +05:30
committed by GitHub
parent 8651ee1797
commit 0473dedf47
1663 changed files with 156692 additions and 1 deletions

View File

@ -0,0 +1,150 @@
---
id: a3f503de51cf954ede28891d
title: Знайдіть симетричну різницю множин
challengeType: 5
forumTopicId: 301611
dashedName: find-the-symmetric-difference
---
# --description--
Математичний термін <dfn> симетрична різниця</dfn> (`△` або `⊕`) двох множин - це набір елементів, які знаходяться в одній з множин, але не в обох. Наприклад, для множин `A = {1, 2, 3}` та `B = {2, 3, 4}`, `A △ B = {1, 4}`.
Симетрична різниця множин - це двійкова операція, тобто вона діє лише на два елементи. Тому, щоб оцінити вираз, який містить симетричну різницю множин серед *трьох* елементів(`A △ B △ C`), потрібно виконувати лише одну операцію одночасно. Таким чином, для множин `A` та `B` вище, і `C = {2, 3}`, `A △ B △ C = (A △ B) △ C = {1, 4} △ {2, 3} = {1, 2, 3, 4}`.
# --instructions--
Створіть функцію, яка приймає два чи більше масиви, та повертає масив із їхньою симетричною різницею. Повернений масив має містити лише унікальні значення (* жодних дублікатів *).
# --hints--
`sym([1, 2, 3], [5, 2, 1, 4])` повинен повертатися як `[3, 4, 5]`.
```js
assert.sameMembers(sym([1, 2, 3], [5, 2, 1, 4]), [3, 4, 5]);
```
`sym([1, 2, 3], [5, 2, 1, 4])` має містити лише три елементи.
```js
assert.equal(sym([1, 2, 3], [5, 2, 1, 4]).length, 3);
```
`sym([1, 2, 3, 3], [5, 2, 1, 4])` повинен повертатися як `[3, 4, 5]`.
```js
assert.sameMembers(sym([1, 2, 3, 3], [5, 2, 1, 4]), [3, 4, 5]);
```
`sym([1, 2, 3, 3], [5, 2, 1, 4])` має містити лише три елементи.
```js
assert.equal(sym([1, 2, 3, 3], [5, 2, 1, 4]).length, 3);
```
`sym([1, 2, 3], [5, 2, 1, 4, 5])` повинен повертатися як `[3, 4, 5]`.
```js
assert.sameMembers(sym([1, 2, 3], [5, 2, 1, 4, 5]), [3, 4, 5]);
```
`sym([1, 2, 3], [5, 2, 1, 4, 5])` має містити лише три елементи.
```js
assert.equal(sym([1, 2, 3], [5, 2, 1, 4, 5]).length, 3);
```
`sym([1, 2, 5], [2, 3, 5], [3, 4, 5])` повинен повертатися як `[1, 4, 5]`
```js
assert.sameMembers(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]), [1, 4, 5]);
```
`sym([1, 2, 5], [2, 3, 5], [3, 4, 5])` має містити лише три елементи.
```js
assert.equal(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]).length, 3);
```
`sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])` повинен повертатися як `[1, 4, 5]`.
```js
assert.sameMembers(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]), [1, 4, 5]);
```
`sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])` має містити лише три елементи.
```js
assert.equal(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]).length, 3);
```
`sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3])` повинен повертатися як `[2, 3, 4, 6, 7]`.
```js
assert.sameMembers(
sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]),
[2, 3, 4, 6, 7]
);
```
`sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3])` має містити лише п'ять елементів.
```js
assert.equal(
sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]).length,
5
);
```
`sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])` повинен повертатися як `[1, 2, 4, 5, 6, 7, 8, 9]`.
```js
assert.sameMembers(
sym(
[3, 3, 3, 2, 5],
[2, 1, 5, 7],
[3, 4, 6, 6],
[1, 2, 3],
[5, 3, 9, 8],
[1]
),
[1, 2, 4, 5, 6, 7, 8, 9]
);
```
`sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])` має містити лише вісім елементів.
```js
assert.equal(
sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])
.length,
8
);
```
# --seed--
## --seed-contents--
```js
function sym(args) {
return args;
}
sym([1, 2, 3], [5, 2, 1, 4]);
```
# --solutions--
```js
function sym() {
var arrays = [].slice.call(arguments);
return arrays.reduce(function (symDiff, arr) {
return symDiff.concat(arr).filter(function (val, idx, theArr) {
return theArr.indexOf(val) === idx
&& (symDiff.indexOf(val) === -1 || arr.indexOf(val) === -1);
});
});
}
sym([1, 2, 3], [5, 2, 1, 4]);
```

View File

@ -0,0 +1,138 @@
---
id: 8d5123c8c441eddfaeb5bdef
title: Реалізація бульбашкового сортування
challengeType: 1
forumTopicId: 301612
dashedName: implement-bubble-sort
---
# --description--
Це перше із кількох завдань що стосуються алгоритмів сортування. Враховуючи масив несортованих елементів, ми хочемо повернути впорядкований масив. Ми побачимо кілька різних методів для цього і вивчимо певні компроміси між цими різними підходами. Хоча більшість сучасних мов мають вбудовані методи сортування для таких операцій, все ж важливо зрозуміти деякі загальні основні підходи та дізнатися, як їх можна здійснити.
Тут ми розглянемо бульбашкове сортування. Метод бульбашкового сортування розпочинається на початку несортованого масиву і збільшує невідсортовані значення до кінця, повторюючи через масив поки він не буде повністю відсортованим. Це робиться шляхом порівняння суміжних елементів і їх заміни, якщо вони вийшли з ладу. Метод продовжує цикл по масиву, поки не відбудеться обмін, в якому масив буде відсортовано.
Цей метод вимагає кількох ітерацій через масив, а для найгірших випадків має квадратичну складність часу. В той час як проста складність, як правило, непрактична у більшості ситуацій.
**Instructions:** Напишіть функцію `bubbleSort` яка приймає масив цілих чисел як введення і повертає масив цих цілих чисел у відсортованому порядку від найменшого до найбільшого.
# --hints--
`bubbleSort` має бути функцією.
```js
assert(typeof bubbleSort == 'function');
```
`bubbleSort` повертає відсортований масив (як мінімум до найбільшого).
```js
assert(
isSorted(
bubbleSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
])
)
);
```
`bubbleSort([1,4,2,8,345,123,43,32,5643,63,123,43,2,55,1,234,92])` повертає масив без змін, окрім послідовності.
```js
assert.sameMembers(
bubbleSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
]),
[1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]
);
```
`bubbleSort` не повинен використовувати вбудований `.sort()` метод.
```js
assert(isBuiltInSortUsed());
```
# --seed--
## --after-user-code--
```js
function isSorted(a){
for(let i = 0; i < a.length - 1; i++)
if(a[i] > a[i + 1])
return false;
return true;
}
function isBuiltInSortUsed(){
let sortUsed = false;
Array.prototype.sort = () => sortUsed = true;
bubbleSort([0, 1]);
return !sortUsed;
}
```
## --seed-contents--
```js
function bubbleSort(array) {
// Only change code below this line
return array;
// Only change code above this line
}
```
# --solutions--
```js
function bubbleSort(array) {
for (let i = 0; i < array.length; i++) {
let swapped = false;
for (let j = 1; j < array.length; j++) {
if (array[j - 1] > array[j]) {
let temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
swapped = true;
}
}
if (swapped === false) {
break;
}
}
return array;
}
```

View File

@ -0,0 +1,135 @@
---
id: 587d8259367417b2b2512c86
title: Реалізація сортування вставками
challengeType: 1
forumTopicId: 301613
dashedName: implement-insertion-sort
---
# --description--
Наступний метод сортування, який ми розглянемо - це сортування вставками. Це метод створення відсортованого масиву на початку списку. Так, відсортований масив починається з першого елементу. Тоді йде перевірка наступного елемента і зміна його положення у відсортованому масиві, доки він не отримає відсортовану позицію. Після цього, список продовжує оновлюватися, а нові елементи стають на відсортовану позицію, аж поки сортування не завершиться. Цей алгоритм має квадратичну складність часу як у звичайних, так і у найгірших випадках.
**Instructions:** Напишіть функцію `insertionSort`, де масив цілих чисел - це вхідні дані, і масив цих цілих чисел сортується від найменшого до найбільшого.
# --hints--
`insertionSort` має бути функцією.
```js
assert(typeof insertionSort == 'function');
```
`insertionSort` має повернути впорядкований масив (від меншого до більшого).
```js
assert(
isSorted(
insertionSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
])
)
);
```
`insertionSort([1,4,2,8,345,123,43,32,5643,63,123,43,2,55,1,234,92])` має повернути масив без змін, окрім послідовності.
```js
assert.sameMembers(
insertionSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
]),
[1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]
);
```
`insertionSort([5, 4, 33, 2, 8])` має повернути `[2, 4, 5, 8, 33]`.
```js
assert.deepEqual(insertionSort([5, 4, 33, 2, 8]), [2, 4, 5, 8, 33])
```
`insertionSort` не слід використовувати вбудований `.sort()` метод.
```js
assert(isBuiltInSortUsed());
```
# --seed--
## --after-user-code--
```js
function isSorted(a){
for(let i = 0; i < a.length - 1; i++)
if(a[i] > a[i + 1])
return false;
return true;
}
function isBuiltInSortUsed(){
let sortUsed = false;
Array.prototype.sort = () => sortUsed = true;
insertionSort([0, 1]);
return !sortUsed;
}
```
## --seed-contents--
```js
function insertionSort(array) {
// Only change code below this line
return array;
// Only change code above this line
}
```
# --solutions--
```js
function insertionSort (array) {
for (let currentIndex = 0; currentIndex < array.length; currentIndex++) {
let current = array[currentIndex];
let j = currentIndex - 1;
while (j > -1 && array[j] > current) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = current;
}
return array;
}
```

View File

@ -0,0 +1,156 @@
---
id: 587d825c367417b2b2512c8f
title: Реалізація сортування злиттям
challengeType: 1
forumTopicId: 301614
dashedName: implement-merge-sort
---
# --description--
Ще один поширений алгоритм проміжного сортування - сортування злиттям. Як і швидке сортування, сортування злиттям також використовує метод розділяй і володарюй, рекурсивну методологію для сортування масиву. Він використовує перевагу в тому, що два масиви порівняно легко відсортувати, доки кожен з них відсортовано в першу чергу. Але ми почнемо тільки з одного масиву як з вхідного, то як же отримати з нього два відсортованих масиви? Ми можемо рекурсивно поділити початковий запис два, доки ми не досягнемо базового випадку масиву з одним предметом. Одноелементний масив природно відсортований, тому ми можемо почати комбінувати. Ця комбінація розгорне рекурсивні виклики, які розбивають оригінальний масив, врешті створюючи остаточний сортований масив усіх елементів. Кроки сортування злиттям:
**1)** Рекурсивно розділити вхідний масив навпіл, поки підмасив лише з одним елементом не буде сформовано.
**2)** Об'єднати кожен сортований підмасив разом для створення остаточного сортованого масиву.
Сортування злиттям є ефективним методом сортування зі складністю часу *O(nlog(n))*. Цей алгоритм популярний, оскільки він є продуктивним та відносно простим для реалізації.
До речі, це буде останній алгоритм сортування, який ми тут висвітлюємо. Однак пізніше в розділі про деревовидні структури даних ми опишемо сортування по купі, ще один ефективний метод сортування, який вимагає двійкової купи у своїй реалізації.
**Instructions:**Напишіть функцію `mergeSort` яка приймає масив цілих чисел як введення і повертає масив цих цілих чисел у відсортованому порядку від найменшого до найбільшого. Хороший спосіб реалізувати це - написати одну функцію, наприклад `merge`, яка відповідає за злиття двох сортованих масивів, та інша функція, наприклад, `mergeSort`, яка відповідає за рекурсію, що виробляє одноелементні масиви, для каналу на злиття. Успіхів!
# --hints--
`mergeSort` повинен бути функцією.
```js
assert(typeof mergeSort == 'function');
```
`mergeSort` повинен повертати відсортований масив (від найменшого до найбільшого).
```js
assert(
isSorted(
mergeSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
])
)
);
```
`mergeSort([1,4,2,8,345,123,43,32,5643,63,123,43,2,55,1,234,92])` повинен повернути масив без змін, крім послідовності.
```js
assert.sameMembers(
mergeSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
]),
[1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]
);
```
`mergeSort` не повинен використовувати вбудований `.sort()` метод.
```js
assert(isBuiltInSortUsed());
```
# --seed--
## --after-user-code--
```js
function isSorted(a){
for(let i = 0; i < a.length - 1; i++)
if(a[i] > a[i + 1])
return false;
return true;
}
function isBuiltInSortUsed(){
let sortUsed = false;
Array.prototype.sort = () => sortUsed = true;
mergeSort([0, 1]);
return !sortUsed;
}
```
## --seed-contents--
```js
function mergeSort(array) {
// Only change code below this line
return array;
// Only change code above this line
}
```
# --solutions--
```js
function mergeSort(array) {
if (array.length === 1) {
return array;
} else {
const splitIndex = Math.floor(array.length / 2);
return merge(
mergeSort(array.slice(0, splitIndex)),
mergeSort(array.slice(splitIndex))
);
}
// Merge two sorted arrays
function merge(array1, array2) {
let merged = [];
while (array1.length && array2.length) {
if (array1[0] < array2[0]) {
merged.push(array1.shift());
} else if (array1[0] > array2[0]) {
merged.push(array2.shift());
} else {
merged.push(array1.shift(), array2.shift());
}
}
// After looping ends, one array is empty, and other array contains only
// values greater than all values in `merged`
return [...merged, ...array1, ...array2];
}
}
mergeSort([1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]);
```

View File

@ -0,0 +1,142 @@
---
id: 587d825a367417b2b2512c89
title: Реалізація швидкого сортування
challengeType: 1
forumTopicId: 301615
dashedName: implement-quick-sort
---
# --description--
Тут ми будемо рухатися до проміжного алгоритму сортування: швидке сортування. Швидке сортування - це ефективний, рекурсивний підхід "розподіляй і володарюй" у сортуванні масиву. В цьому методі, обираємо опорний елемент у вихідному масиві. Потім масив розділяється на два підмасиви із меншими і більшими значеннями ніж опорний елемент. Тоді ми об'єднуємо результат рекурсивного виклику алгоритму швидкого сортування в обидвох підмасивах. Це продовжується поки не буде досягнутий базовий регістр порожнього або єдиного елементу масиву, який ми повертаємо. Розмотування рекурсивних викликів повертає нам відсортований масив.
Швидке сортування є дуже ефективним методом, в середньому забезпечує *O(nlog(n))* продуктивність. Також це відносно легко реалізувати. Ці властивості роблять його популярним і корисним методом сортування.
**Інструкція:** записати функцію `quickSort`, яка приймає на вхід масив цілих чисел і повертає відсортований масив цих цілих чисел від найменшого до найбільшого. Незважаючи на те, що вибір опорного елемента є важливим, тут підійде будь-яке значення для наших цілей. Щоб було простіше, то можна використати перший або останній елемент.
# --hints--
`quickSort` повинен бути функцією.
```js
assert(typeof quickSort == 'function');
```
`quickSort` повинен повертати відсортований масив (від найменшого до найбільшого).
```js
assert(
isSorted(
quickSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
])
)
);
```
`quickSort([1,4,2,8,345,123,43,32,5643,63,123,43,2,55,1,234,92])` повинен повернути масив без змін, крім послідовності.
```js
assert.sameMembers(
quickSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
]),
[1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]
);
```
`quickSort` не повинен використовувати вбудований `.sort()` метод.
```js
assert(isBuiltInSortUsed());
```
# --seed--
## --after-user-code--
```js
function isSorted(a){
for(let i = 0; i < a.length - 1; i++)
if(a[i] > a[i + 1])
return false;
return true;
}
function isBuiltInSortUsed(){
let sortUsed = false;
Array.prototype.sort = () => sortUsed = true;
quickSort([0, 1]);
return !sortUsed;
}
```
## --seed-contents--
```js
function quickSort(array) {
// Only change code below this line
return array;
// Only change code above this line
}
```
# --solutions--
```js
function quickSort(array) {
if (array.length === 0) {
return [];
} else {
const pivotValue = array[0];
// Sort elements into three piles
let lesser = [];
let equal = [];
let greater = [];
for (let e of array) {
if (e < pivotValue) {
lesser.push(e);
} else if (e > pivotValue) {
greater.push(e);
} else {
equal.push(e);
}
}
return [...quickSort(lesser), ...equal, ...quickSort(greater)];
}
}
```

View File

@ -0,0 +1,131 @@
---
id: 587d8259367417b2b2512c85
title: Реалізація сортування вибором
challengeType: 1
forumTopicId: 301616
dashedName: implement-selection-sort
---
# --description--
Тут ми виконаємо сортування вибором. Сортування вибором здійснюється шляхом вибору мінімального значення зі списку та його обміну з першим значенням у списку. Потім початок йде з другої позиції, обирається найменше значення з решти списку та здійснюється обмін цього значення з другим елементом. І такий процес обміну елементів продовжується, доки не дійдемо до кінця списку. Тепер список відсортовано. Сортування вибором завжди має квадратичну складність.
**Instructions**: Напишіть функцію `selectionSort`, де масив цілих чисел - це вхідні дані, і масив цих цілих чисел сортується від найменшого до найбільшого.
# --hints--
`selectionSort` має бути функцією.
```js
assert(typeof selectionSort == 'function');
```
`selectionSort` має повернути впорядкований масив (від найменшого до найбільшого).
```js
assert(
isSorted(
selectionSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
])
)
);
```
`selectionSort([1,4,2,8,345,123,43,32,5643,63,123,43,2,55,1,234,92])` має повернути масив без змін, окрім послідовності.
```js
assert.sameMembers(
selectionSort([
1,
4,
2,
8,
345,
123,
43,
32,
5643,
63,
123,
43,
2,
55,
1,
234,
92
]),
[1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]
);
```
`selectionSort` не повинен використовувати вбудований `.sort()` метод.
```js
assert(isBuiltInSortUsed());
```
# --seed--
## --after-user-code--
```js
function isSorted(a){
for(let i = 0; i < a.length - 1; i++)
if(a[i] > a[i + 1])
return false;
return true;
}
function isBuiltInSortUsed(){
let sortUsed = false;
Array.prototype.sort = () => sortUsed = true;
selectionSort([0, 1]);
return !sortUsed;
}
```
## --seed-contents--
```js
function selectionSort(array) {
// Only change code below this line
return array;
// Only change code above this line
}
```
# --solutions--
```js
function selectionSort(array) {
for (let i = 0; i < array.length-1; i++) {
let minimumIndex = i;
for (let j = i+1; j < array.length; j++){
if (array[j] < array[minimumIndex]) {
minimumIndex = j;
}
}
let value = array[minimumIndex];
array[minimumIndex] = array[i];
array[i] = value;
}
return array;
}
```

View File

@ -0,0 +1,228 @@
---
id: a56138aff60341a09ed6c480
title: Оновлення інвентарю
challengeType: 5
forumTopicId: 16019
dashedName: inventory-update
---
# --description--
Порівняйте та оновіть інвентар з масиву 2D та інший масив 2D на нові предмети. Оновіть поточну кількість предметів у інвентарі (у `arr1`). Якщо неможливо знайти об'єкт, додайте новий об'єкт та його кількість у масив інвентарю. Об'єкти висхідного масиву інвентарю мають бути в алфавітному порядку.
# --hints--
Функція `updateInventory` має повернути масив.
```js
assert.isArray(
updateInventory(
[
[21, 'Bowling Ball'],
[2, 'Dirty Sock'],
[1, 'Hair Pin'],
[5, 'Microphone']
],
[
[2, 'Hair Pin'],
[3, 'Half-Eaten Apple'],
[67, 'Bowling Ball'],
[7, 'Toothpaste']
]
)
);
```
`updateInventory([[21, "Bowling Ball"], [2, "Dirty Sock"], [1, "Hair Pin"], [5, "Microphone"]], [[2, "Hair Pin"], [3, "Half-Eaten Apple"], [67, "Bowling Ball"], [7, "Toothpaste"]])` має повернути масив з довжиною 6.
```js
assert.equal(
updateInventory(
[
[21, 'Bowling Ball'],
[2, 'Dirty Sock'],
[1, 'Hair Pin'],
[5, 'Microphone']
],
[
[2, 'Hair Pin'],
[3, 'Half-Eaten Apple'],
[67, 'Bowling Ball'],
[7, 'Toothpaste']
]
).length,
6
);
```
`updateInventory([[21, "Bowling Ball"], [2, "Dirty Sock"], [1, "Hair Pin"], [5, "Microphone"]], [[2, "Hair Pin"], [3, "Half-Eaten Apple"], [67, "Bowling Ball"], [7, "Toothpaste"]])` має повернути `[[88, "Bowling Ball"], [2, "Dirty Sock"], [3, "Hair Pin"], [3, "Half-Eaten Apple"], [5, "Microphone"], [7, "Toothpaste"]]`.
```js
assert.deepEqual(
updateInventory(
[
[21, 'Bowling Ball'],
[2, 'Dirty Sock'],
[1, 'Hair Pin'],
[5, 'Microphone']
],
[
[2, 'Hair Pin'],
[3, 'Half-Eaten Apple'],
[67, 'Bowling Ball'],
[7, 'Toothpaste']
]
),
[
[88, 'Bowling Ball'],
[2, 'Dirty Sock'],
[3, 'Hair Pin'],
[3, 'Half-Eaten Apple'],
[5, 'Microphone'],
[7, 'Toothpaste']
]
);
```
`updateInventory([[21, "Bowling Ball"], [2, "Dirty Sock"], [1, "Hair Pin"], [5, "Microphone"]], [])` має повернути `[[21, "Bowling Ball"], [2, "Dirty Sock"], [1, "Hair Pin"], [5, "Microphone"]]`.
```js
assert.deepEqual(
updateInventory(
[
[21, 'Bowling Ball'],
[2, 'Dirty Sock'],
[1, 'Hair Pin'],
[5, 'Microphone']
],
[]
),
[
[21, 'Bowling Ball'],
[2, 'Dirty Sock'],
[1, 'Hair Pin'],
[5, 'Microphone']
]
);
```
`updateInventory([], [[2, "Hair Pin"], [3, "Half-Eaten Apple"], [67, "Bowling Ball"], [7, "Toothpaste"]])` має повернути `[[67, "Bowling Ball"], [2, "Hair Pin"], [3, "Half-Eaten Apple"], [7, "Toothpaste"]]`.
```js
assert.deepEqual(
updateInventory(
[],
[
[2, 'Hair Pin'],
[3, 'Half-Eaten Apple'],
[67, 'Bowling Ball'],
[7, 'Toothpaste']
]
),
[
[67, 'Bowling Ball'],
[2, 'Hair Pin'],
[3, 'Half-Eaten Apple'],
[7, 'Toothpaste']
]
);
```
`updateInventory([[0, "Bowling Ball"], [0, "Dirty Sock"], [0, "Hair Pin"], [0, "Microphone"]], [[1, "Hair Pin"], [1, "Half-Eaten Apple"], [1, "Bowling Ball"], [1, "Toothpaste"]])` має повернути `[[1, "Bowling Ball"], [0, "Dirty Sock"], [1, "Hair Pin"], [1, "Half-Eaten Apple"], [0, "Microphone"], [1, "Toothpaste"]]`.
```js
assert.deepEqual(
updateInventory(
[
[0, 'Bowling Ball'],
[0, 'Dirty Sock'],
[0, 'Hair Pin'],
[0, 'Microphone']
],
[
[1, 'Hair Pin'],
[1, 'Half-Eaten Apple'],
[1, 'Bowling Ball'],
[1, 'Toothpaste']
]
),
[
[1, 'Bowling Ball'],
[0, 'Dirty Sock'],
[1, 'Hair Pin'],
[1, 'Half-Eaten Apple'],
[0, 'Microphone'],
[1, 'Toothpaste']
]
);
```
# --seed--
## --seed-contents--
```js
function updateInventory(arr1, arr2) {
return arr1;
}
// Example inventory lists
var curInv = [
[21, "Bowling Ball"],
[2, "Dirty Sock"],
[1, "Hair Pin"],
[5, "Microphone"]
];
var newInv = [
[2, "Hair Pin"],
[3, "Half-Eaten Apple"],
[67, "Bowling Ball"],
[7, "Toothpaste"]
];
updateInventory(curInv, newInv);
```
# --solutions--
```js
function updateInventory(arr1, arr2) {
arr2.forEach(function(item) {
createOrUpdate(arr1, item);
});
// All inventory must be accounted for or you're fired!
return arr1;
}
function createOrUpdate(arr1, item) {
var index = -1;
while (++index < arr1.length) {
if (arr1[index][1] === item[1]) {
arr1[index][0] += item[0];
return;
}
if (arr1[index][1] > item[1]) {
break;
}
}
arr1.splice(index, 0, item);
}
// Example inventory lists
var curInv = [
[21, 'Bowling Ball'],
[2, 'Dirty Sock'],
[1, 'Hair Pin'],
[5, 'Microphone']
];
var newInv = [
[2, 'Hair Pin'],
[3, 'Half-Eaten Apple'],
[67, 'Bowling Ball'],
[7, 'Toothpaste']
];
updateInventory(curInv, newInv);
```

View File

@ -0,0 +1,126 @@
---
id: a7bf700cd123b9a54eef01d5
title: Без повторів, будь ласка
challengeType: 5
forumTopicId: 16037
dashedName: no-repeats-please
---
# --description--
Повертає кількість всіх перестановок заданого рядка, в яких не повторюються літери поспіль. Припустимо, що всі символи в заданому рядку унікальні.
Наприклад, `aab` повинен повернути 2, тому що загалом він має 6 перестановок (`aab`, `aab`, `aba`, `aba`, `baa`, `baa`), але тільки 2 з них ( `aba` та `aba`) не мають повторення однієї і тієї ж букви (в даному випадку `a`).
# --hints--
`permAlone("aab")` має повертати число.
```js
assert.isNumber(permAlone('aab'));
```
`permAlone("aab")` має повертати 2.
```js
assert.strictEqual(permAlone('aab'), 2);
```
`permAlone("aaa")` має повертати 0.
```js
assert.strictEqual(permAlone('aaa'), 0);
```
`permAlone("aabb")` має повертати 8.
```js
assert.strictEqual(permAlone('aabb'), 8);
```
`permAlone("abcdefa")` має повертати 3600.
```js
assert.strictEqual(permAlone('abcdefa'), 3600);
```
`permAlone("abfdefa")` має повертати 2640.
```js
assert.strictEqual(permAlone('abfdefa'), 2640);
```
`permAlone("zzzzzzzz")` має повертати 0.
```js
assert.strictEqual(permAlone('zzzzzzzz'), 0);
```
`permAlone("a")` має повертати 1.
```js
assert.strictEqual(permAlone('a'), 1);
```
`permAlone("aaab")` має повертати 0.
```js
assert.strictEqual(permAlone('aaab'), 0);
```
`permAlone("aaabb")` має повертати 12.
```js
assert.strictEqual(permAlone('aaabb'), 12);
```
# --seed--
## --seed-contents--
```js
function permAlone(str) {
return str;
}
permAlone('aab');
```
# --solutions--
```js
function permAlone(str) {
return permuter(str).filter(function(perm) {
return !perm.match(/(.)\1/g);
}).length;
}
function permuter(str) {
// http://staff.roguecc.edu/JMiller/JavaScript/permute.html
//permArr: Global array which holds the list of permutations
//usedChars: Global utility array which holds a list of "currently-in-use" characters
var permArr = [], usedChars = [];
function permute(input) {
//convert input into a char array (one element for each character)
var i, ch, chars = input.split("");
for (i = 0; i < chars.length; i++) {
//get and remove character at index "i" from char array
ch = chars.splice(i, 1);
//add removed character to the end of used characters
usedChars.push(ch);
//when there are no more characters left in char array to add, add used chars to list of permutations
if (chars.length === 0) permArr[permArr.length] = usedChars.join("");
//send characters (minus the removed one from above) from char array to be permuted
permute(chars.join(""));
//add removed character back into char array in original position
chars.splice(i, 0, ch);
//remove the last character used off the end of used characters array
usedChars.pop();
}
}
permute(str);
return permArr;
}
permAlone('aab');
```

View File

@ -0,0 +1,100 @@
---
id: a3f503de51cfab748ff001aa
title: Парність
challengeType: 5
forumTopicId: 301617
dashedName: pairwise
---
# --description--
У масиві `arr`, знайдіть пари елементів, сума яких рівняється другому аргументу `arg` і поверніть суму їх індексів.
Ви можете використовувати декілька пар, які мають однакові числові елементи, але різні індекси. У кожній парі варто використовувати найнижчі доступні індекси. Після того, як елемент було використано, його вже не можна використати для пари з іншим елементом. Наприклад, `pairwise([1, 1, 2], 3)` створює пару `[2, 1]`, де 1 має індекс 0, а не 1, оскільки 0+2 &lt; 1+2.
Наприклад, `pairwise([7, 9, 11, 13, 15], 20)` повертає `6`. Пара з сумою 20 буде `[7, 13]` and `[9, 11]`. Тепер ми можемо записати масив з їхніми індексами і значеннями.
<div style='margin-left: 2em;'>
| Індекс | 0 | 1 | 2 | 3 | 4 |
| ----- | - | - | -- | -- | -- |
| Значення | 7 | 9 | 11 | 13 | 15 |
</div>
Нижче ми беремо відповідні індекси і додаємо.
<div style='margin-left: 2em;'>
7 + 13 = 20 → Індекси 0 + 3 = 3
9 + 11 = 20 → Індекси 1 + 2 = 3
3 + 3 = 6 → Повертає `6`
</div>
# --hints--
`pairwise([1, 4, 2, 3, 0, 5], 7)` має повернути 11.
```js
assert.deepEqual(pairwise([1, 4, 2, 3, 0, 5], 7), 11);
```
`pairwise([1, 3, 2, 4], 4)` має повернути 1.
```js
assert.deepEqual(pairwise([1, 3, 2, 4], 4), 1);
```
`pairwise([1, 1, 1], 2)` має повернути 1.
```js
assert.deepEqual(pairwise([1, 1, 1], 2), 1);
```
`pairwise([0, 0, 0, 0, 1, 1], 1)` має повернути 10.
```js
assert.deepEqual(pairwise([0, 0, 0, 0, 1, 1], 1), 10);
```
`pairwise([], 100)` має повернути 0.
```js
assert.deepEqual(pairwise([], 100), 0);
```
# --seed--
## --seed-contents--
```js
function pairwise(arr, arg) {
return arg;
}
pairwise([1,4,2,3,0,5], 7);
```
# --solutions--
```js
function pairwise(arr, arg) {
var sum = 0;
arr.forEach(function(e, i, a) {
if (e != null) {
var diff = arg-e;
a[i] = null;
var dix = a.indexOf(diff);
if (dix !== -1) {
sum += dix;
sum += i;
a[dix] = null;
}
}
});
return sum;
}
pairwise([1,4,2,3,0,5], 7);
```