1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
+
+Розглядаючи значення послідовності Фібоначчі, які не перевищують певне число (`n`), знайдіть суму парних значень.
+
+# --hints--
+
+`fiboEvenSum(10)` у сумі становить число.
+
+```js
+assert(typeof fiboEvenSum(10) === 'number');
+```
+
+Ваша функція має дорівнювати `even` value.
+
+```js
+assert.equal(fiboEvenSum(10) % 2 === 0, true);
+```
+
+Ваша функція має додати парні значення послідовності Фібоначчі: `fiboEvenSum(8)` має повернути 10.
+
+```js
+assert.strictEqual(fiboEvenSum(8), 10);
+```
+
+`fiboEvenSum(10)` має повернути 10.
+
+```js
+assert.strictEqual(fiboEvenSum(10), 10);
+```
+
+`fiboEvenSum(34)` у сумі становить 44.
+
+```js
+assert.strictEqual(fiboEvenSum(34), 44);
+```
+
+`fiboEvenSum(60)` у сумі становить 44.
+
+```js
+assert.strictEqual(fiboEvenSum(60), 44);
+```
+
+`fiboEvenSum(1000)` у сумі становить 798.
+
+```js
+assert.strictEqual(fiboEvenSum(1000), 798);
+```
+
+`fiboEvenSum(100000)` має дорівнювати 60696.
+
+```js
+assert.strictEqual(fiboEvenSum(100000), 60696);
+```
+
+`fiboEvenSum(4000000)` має дорівнювати 4613732.
+
+```js
+assert.strictEqual(fiboEvenSum(4000000), 4613732);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function fiboEvenSum(n) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+const fiboEvenSum = (number) => {
+ if (number <= 1) {
+ return 0;
+ } else {
+ let evenSum = 0,
+ prevFibNum = 1,
+ fibNum = 2; // According to problem description our Fibonacci series starts with 1, 2
+ for (let i = 2; fibNum <= number; i++) {
+ if (fibNum % 2 == 0) {
+ evenSum += fibNum;
+ }
+ [prevFibNum, fibNum] = [fibNum, prevFibNum + fibNum];
+ }
+ return evenSum;
+ }
+};
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-20-factorial-digit-sum.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-20-factorial-digit-sum.md
new file mode 100644
index 00000000000..f9857fc290b
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-20-factorial-digit-sum.md
@@ -0,0 +1,79 @@
+---
+id: 5900f3801000cf542c50fe93
+title: 'Завдання 20: Сума цифр факторіала'
+challengeType: 5
+forumTopicId: 301839
+dashedName: problem-20-factorial-digit-sum
+---
+
+# --description--
+
+`n`! означає `n` × (`n` − 1) × ... × 3 × 2 × 1
+
+Наприклад, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800,
+і сума цифр у числі 10! дорівнює 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.
+
+Знайдіть суму цифр у числі `n`!
+
+# --hints--
+
+`sumFactorialDigits(10)` має повернути число.
+
+```js
+assert(typeof sumFactorialDigits(10) === 'number');
+```
+
+`sumFactorialDigits(10)` має повернути число 27.
+
+```js
+assert.strictEqual(sumFactorialDigits(10), 27);
+```
+
+`sumFactorialDigits(25)` має повернути число 72.
+
+```js
+assert.strictEqual(sumFactorialDigits(25), 72);
+```
+
+`sumFactorialDigits(50)` має повернути число 216.
+
+```js
+assert.strictEqual(sumFactorialDigits(50), 216);
+```
+
+`sumFactorialDigits(75)` має повернути число 432.
+
+```js
+assert.strictEqual(sumFactorialDigits(75), 432);
+```
+
+`sumFactorialDigits(100)` має повернути число 648.
+
+```js
+assert.strictEqual(sumFactorialDigits(100), 648);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function sumFactorialDigits(n) {
+
+ return n;
+}
+
+sumFactorialDigits(100);
+```
+
+# --solutions--
+
+```js
+let factorial = (n) => n <= 1 ? BigInt(n) : BigInt(n) * BigInt(factorial(--n));
+
+let sumDigits = n => n.toString().split('').map(x => parseInt(x)).reduce((a,b) => a + b);
+
+function sumFactorialDigits(n) {
+ return sumDigits(factorial(n));
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200.md
new file mode 100644
index 00000000000..2a04328c2d0
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200.md
@@ -0,0 +1,48 @@
+---
+id: 5900f4351000cf542c50ff47
+title: >-
+ Завдання 200: Знайдіть 200-тий доведений простий ск'юб, що містить суміжний підрядок "200"
+challengeType: 5
+forumTopicId: 301840
+dashedName: >-
+ problem-200-find-the-200th-prime-proof-sqube-containing-the-contiguous-sub-string-200
+---
+
+# --description--
+
+Ми визначимо, що ск'юб буде числом виду, $ {p^2} {q^3} $, де $p$ і $q$ є різними простими числами.
+
+Наприклад, $200 = {5^2}{2^3}$ або $120072949 = {{23}^2}{{61}^3}$.
+
+Перші п'ять квадратів - це 72, 108, 200, 392 і 500.
+
+Цікаво, що 200 також є першим числом, для якого ви не можете змінити жодну цифру, щоб зробити просте число; ми будемо називати такі числа доведено простими. Наступний доведено простий ск'юб, що містить суміжний підрядок `200` - 1992008.
+
+Знайдіть 200-те значення доведено простого ск'юба, що містить суміжний підрядок `200`.
+
+# --hints--
+
+`primeProofSqubeWithSubString()` має видати `229161792008`.
+
+```js
+assert.strictEqual(primeProofSqubeWithSubString(), 229161792008);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function primeProofSqubeWithSubString() {
+
+ return true;
+}
+
+primeProofSqubeWithSubString();
+```
+
+# --solutions--
+
+```js
+// solution required
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-201-subsets-with-a-unique-sum.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-201-subsets-with-a-unique-sum.md
new file mode 100644
index 00000000000..bcd4d4105b4
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-201-subsets-with-a-unique-sum.md
@@ -0,0 +1,48 @@
+---
+id: 5900f4361000cf542c50ff48
+title: 'Завдання 201: Підмножини з унікальною сумою'
+challengeType: 5
+forumTopicId: 301841
+dashedName: problem-201-subsets-with-a-unique-sum
+---
+
+# --description--
+
+Для будь-якого набору чисел $A$ нехай $sum(A)$ буде сумою елементів $A$.
+
+Розглянемо набір $B = \\{1,3,6,8,10,11\\}$. Існує 20 підмножин $B$, що містять три елементи, і їх сумидорівнюють:
+
+$$\begin{align} & sum(\\{1,3,6\\}) = 10 \\\\ & sum(\\{1,3,8\\}) = 12 \\\\ & sum(\\{1,3,10\\}) = 14 \\\\ & sum(\\{1,3,11\\}) = 15 \\\\ & sum(\\{1,6,8\\}) = 15 \\\\ & sum(\\{1,6,10\\}) = 17 \\\\ & sum(\\{1,6,11\\}) = 18 \\\\ & sum(\\{1,8,10\\}) = 19 \\\\ & sum(\\{1,8,11\\}) = 20 \\\\ & sum(\\{1,10,11\\}) = 22 \\\\ & sum(\\{3,6,8\\}) = 17 \\\\ & sum(\\{3,6,10\\}) = 19 \\\\ & sum(\\{3,6,11\\}) = 20 \\\\ & sum(\\{3,8,10\\}) = 21 \\\\ & sum(\\{3,8,11\\}) = 22 \\\\ & sum(\\{3,10,11\\}) = 24 \\\\ & sum(\\{6,8,10\\}) = 24 \\\\ & sum(\\{6,8,11\\}) = 25 \\\\ & sum(\\{6,10,11\\}) = 27 \\\\ & sum(\\{8,10,11\\}) = 29 \\end{align}$$
+
+Деякі з цих сум трапляються більше, ніж один раз, інші - унікальні. Для набору $A$ нехай $U(A,k)$ буде набором унікальних сум $k$-елементних підмножин $A$, у нашому прикладі ми знаходимо $U(B,3) = \\{10,12,14,18,21,25,27,29\\}$ і $sum(U(B,3)) = 156$.
+
+Тепер розглянемо $100$-елементний набір $S = \\ {1^2, 2^2, \ldots, {100}^2\\}$. $S$ має $100\\,891\\,344\\,545\\,564\\,193\\,3\\,812\\,497\\,256\\;$ $50$-елементних підмножин.
+
+Визначте суму всіх цілих чисел, які є сумою лише одного з $50$-елементів підмножини $S$, тобто знайдіть $sum (U(S,50))$.
+
+# --hints--
+
+`uniqueSubsetsSum()` має видати `115039000`.
+
+```js
+assert.strictEqual(uniqueSubsetsSum(), 115039000);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function uniqueSubsetsSum() {
+
+ return true;
+}
+
+uniqueSubsetsSum();
+```
+
+# --solutions--
+
+```js
+// solution required
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-202-laserbeam.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-202-laserbeam.md
new file mode 100644
index 00000000000..8d425ccf25b
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-202-laserbeam.md
@@ -0,0 +1,46 @@
+---
+id: 5900f4371000cf542c50ff49
+title: 'Завдання 202: Лазерний промінь'
+challengeType: 5
+forumTopicId: 301843
+dashedName: problem-202-laserbeam
+---
+
+# --description--
+
+Три дзеркала розташовано в формі рівностороннього трикутника таким чином, що їх поверхні, які відбивають світло, повернуті всередину. На кожній вершині цього трикутника є дуже маленька прогалина, через яку може пройти лазерний промінь.
+
+Позначимо вершини $A$, $B$ і $C$. Лазерний промінь може ввійти в вершину $C$, відбитись від 11 поверхонь і вийти через ту саму вершину 2 способами: перший наведено нижче; другий є протилежним до нього.
+
+1p, 5p, 5p, 10p, 20p, 50p, £1 (100p) і £2 (200p).
+
+£2 можна скласти наступним чином:
+
+1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
+
+Перетворивши кожну літеру слова в число, що відповідає її порядковому номеру в алфавіті, і додавши ці значення, ми отримаємо числове значення слова. Наприклад, числове значення слова SKY дорівнює 19 + 11 + 25 = 55 = `t`(1 + 2 + ... + 10)2 = 552 = 3025
+
+Отже, різницею суми квадратів та квадрату суми перших десяти натуральних чисел є 3025 − 385 = 2640.
+
+Знайдіть різницю суми квадратів та квадрату суми перших `n` натуральних чисел.
+
+# --hints--
+
+`sumSquareDifference(10)` має повернути число.
+
+```js
+assert(typeof sumSquareDifference(10) === 'number');
+```
+
+`sumSquareDifference(10)` має повернути число 2640.
+
+```js
+assert.strictEqual(sumSquareDifference(10), 2640);
+```
+
+`sumSquareDifference(20)` має повернути число 41230.
+
+```js
+assert.strictEqual(sumSquareDifference(20), 41230);
+```
+
+`sumSquareDifference(100)` має повернути число 25164150.
+
+```js
+assert.strictEqual(sumSquareDifference(100), 25164150);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function sumSquareDifference(n) {
+
+ return true;
+}
+
+sumSquareDifference(100);
+```
+
+# --solutions--
+
+```js
+const sumSquareDifference = (number)=>{
+ let squareOfSum = Math.pow(sumOfArithmeticSeries(1,1,number),2);
+ let sumOfSquare = sumOfSquareOfNumbers(number);
+ return squareOfSum - sumOfSquare;
+}
+
+function sumOfArithmeticSeries(a,d,n){
+ return (n/2)*(2*a+(n-1)*d);
+}
+
+function sumOfSquareOfNumbers(n){
+ return (n*(n+1)*(2*n+1))/6;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-60-prime-pair-sets.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-60-prime-pair-sets.md
new file mode 100644
index 00000000000..f957cddca18
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-60-prime-pair-sets.md
@@ -0,0 +1,46 @@
+---
+id: 5900f3a81000cf542c50febb
+title: 'Завдання 60: Об''єднання пари в просте число'
+challengeType: 5
+forumTopicId: 302172
+dashedName: problem-60-prime-pair-sets
+---
+
+# --description--
+
+Прості числа 3, 7, 109 і 673 досить вражаючі. Якщо взяти будь-які два простих числа та об’єднати їх у будь-якому порядку, у результаті завжди вийде просте число. Наприклад, якщо взяти 7 і 109, то обидва числа, 7109 та 1097, будуть простими. Сума цих чотирьох простих чисел, 792, є найменшою сумою для набору з чотирьох простих чисел із цією властивістю.
+
+Знайдіть найменшу суму набору з п'яти простих чисел, для яких об'єднання будь-яких двох простих чисел дасть нове просте число.
+
+# --hints--
+
+`primePairSets()` має повернути число.
+
+```js
+assert(typeof primePairSets() === 'number');
+```
+
+`primePairSets()` має повернути число 26033.
+
+```js
+assert.strictEqual(primePairSets(), 26033);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function primePairSets() {
+
+ return true;
+}
+
+primePairSets();
+```
+
+# --solutions--
+
+```js
+// solution required
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-61-cyclical-figurate-numbers.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-61-cyclical-figurate-numbers.md
new file mode 100644
index 00000000000..0a345d1fbd6
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-61-cyclical-figurate-numbers.md
@@ -0,0 +1,252 @@
+---
+id: 5900f3a91000cf542c50febc
+title: 'Завдання 61: Циклічні фігурні числа'
+challengeType: 5
+forumTopicId: 302173
+dashedName: problem-61-cyclical-figurate-numbers
+---
+
+# --description--
+
+Трикутні, квадратні, п'ятикутні, шестикутні, семикутні і восьмикутні числа є фігурними (багатокутними) числами і визначаються за такими формулами:
+
+| Тип числа | Формула | Послідовність |
+| ----------- | ----------------------------- | --------------------- |
+| Трикутне | $P_3(n) = \frac{n(n+1)}{2}$ | 1, 3, 6, 10, 15, ... |
+| Квадратне | $P_4(n) = n^2$ | 1, 4, 9, 16, 25, ... |
+| П'ятикутне | $P_5(n) = \frac{n(3n−1)}2$ | 1, 5, 12, 22, 35, ... |
+| Шестикутне | $P_6(n) = n(2n−1)$ | 1, 6, 15, 28, 45, ... |
+| Семикутне | $P_7(n) = \frac{n(5n−3)}{2}$ | 1, 7, 18, 34, 55, ... |
+| Восьмикутне | $P_8(n) = n(3n−2)$ | 1, 8, 21, 40, 65, ... |
+
+Впорядкована множина з трьох 4-значних чисел: 8128, 2882, 8281 має три цікаві властивості.
+
+1. Множина циклічна, оскільки дві останні цифри кожного числа є першими двома цифрами наступного числа (включаючи останнє та перше число).
+2. Кожен тип багатокутника: трикутний ($P_3(127) = 8128$), квадратний ($P_4(91) = 8281$), і п'ятикутний ($P_5(44) = 2882$), представлений іншим числом в даній множині.
+3. Це єдина множина 4-цифрових чисел з цією властивістю.
+
+Знайдіть суму всіх чисел у впорядкованих множинах з `n` циклічних 4-значних чисел, в яких кожен з типів багатокутника від $P_3$ до $P_{n + 2}$ представлений іншим числом цієї множини.
+
+# --hints--
+
+`cyclicalFigurateNums(3)` має повернути число.
+
+```js
+assert(typeof cyclicalFigurateNums(3) === 'number');
+```
+
+`cyclicalFigurateNums(3)` має повернути `19291`.
+
+```js
+assert.strictEqual(cyclicalFigurateNums(3), 19291);
+```
+
+`cyclicalFigurateNums(4)` має повернути `28684`.
+
+```js
+assert.strictEqual(cyclicalFigurateNums(4), 28684);
+```
+
+`cyclicalFigurateNums(5)` має повернути `76255`.
+
+```js
+assert.strictEqual(cyclicalFigurateNums(5), 76255);
+```
+
+`cyclicalFigurateNums(6)` має повернути `28684`.
+
+```js
+assert.strictEqual(cyclicalFigurateNums(6), 28684);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function cyclicalFigurateNums(n) {
+
+ return true;
+}
+
+cyclicalFigurateNums(3);
+```
+
+# --solutions--
+
+```js
+function cyclicalFigurateNums(n) {
+ function getChains(chain, n, numberTypes, numsExcludingLastNeededType) {
+ if (chain.length === n) {
+ return [chain];
+ }
+
+ const nextNumbers = getNextNumbersInChain(
+ chain[chain.length - 1],
+ numsExcludingLastNeededType
+ );
+
+ const chains = [];
+ for (let j = 0; j < nextNumbers.length; j++) {
+ const nextNumber = nextNumbers[j];
+ if (chain.indexOf(nextNumber) === -1) {
+ const nextChain = [...chain, nextNumber];
+ chains.push(
+ ...getChains(nextChain, n, numberTypes, numsExcludingLastNeededType)
+ );
+ }
+ }
+ return chains;
+ }
+
+ function getNextNumbersInChain(num, numsExcludingLastNeededType) {
+ const results = [];
+ const beginning = num % 100;
+ numsExcludingLastNeededType.forEach(number => {
+ if (Math.floor(number / 100) === beginning) {
+ results.push(number);
+ }
+ });
+ return results;
+ }
+
+ function fillNumberTypes(n, numberTypes, numsExcludingLastNeededType) {
+ const [, lastTypeCheck, lastTypeArr] = numberTypes[n - 1];
+
+ for (let i = 1000; i <= 9999; i++) {
+ for (let j = 0; j < n - 1; j++) {
+ const [, typeCheck, typeArr] = numberTypes[j];
+ if (typeCheck(i)) {
+ typeArr.push(i);
+ numsExcludingLastNeededType.add(i);
+ }
+ }
+
+ if (lastTypeCheck(i)) {
+ lastTypeArr.push(i);
+ }
+ }
+ }
+
+ function isCyclicalChain(chain, n, numberTypes) {
+ const numberTypesInChain = getNumberTypesInChain(chain, numberTypes);
+
+ if (!isChainAllowed(numberTypesInChain, n)) {
+ return false;
+ }
+
+ const isChainCyclic =
+ Math.floor(chain[0] / 100) === chain[chain.length - 1] % 100;
+ return isChainCyclic;
+ }
+
+ function getNumberTypesInChain(chain, numberTypes) {
+ const numbersInChain = {};
+ for (let i = 0; i < numberTypes.length; i++) {
+ const numberTypeName = numberTypes[i][0];
+ numbersInChain[numberTypeName] = [];
+ }
+
+ for (let i = 0; i < chain.length; i++) {
+ for (let j = 0; j < n; j++) {
+ const [typeName, , typeNumbers] = numberTypes[j];
+ const typeNumbersInChain = numbersInChain[typeName];
+ if (typeNumbers.indexOf(chain[i]) !== -1) {
+ typeNumbersInChain.push(chain[i]);
+ }
+ }
+ }
+ return numbersInChain;
+ }
+
+ function isChainAllowed(numberTypesInChain, n) {
+ for (let i = 0; i < n; i++) {
+ const typeName = numberTypes[i][0];
+ const isNumberWithTypeInChain = numberTypesInChain[typeName].length > 0;
+ if (!isNumberWithTypeInChain) {
+ return false;
+ }
+
+ for (let j = i + 1; j < n; j++) {
+ const otherTypeName = numberTypes[j][0];
+ if (
+ isNumberRepeatedAsOnlyNumberInTwoTypes(
+ numberTypesInChain[typeName],
+ numberTypesInChain[otherTypeName]
+ )
+ ) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ function isNumberRepeatedAsOnlyNumberInTwoTypes(
+ typeNumbers,
+ otherTypeNumbers
+ ) {
+ return (
+ typeNumbers.length === 1 &&
+ otherTypeNumbers.length === 1 &&
+ typeNumbers[0] === otherTypeNumbers[0]
+ );
+ }
+
+ function isTriangle(num) {
+ return ((8 * num + 1) ** 0.5 - 1) % 2 === 0;
+ }
+
+ function isSquare(num) {
+ return num ** 0.5 === parseInt(num ** 0.5, 10);
+ }
+
+ function isPentagonal(num) {
+ return ((24 * num + 1) ** 0.5 + 1) % 6 === 0;
+ }
+
+ function isHexagonal(num) {
+ return ((8 * num + 1) ** 0.5 + 1) % 4 === 0;
+ }
+
+ function isHeptagonal(num) {
+ return ((40 * num + 9) ** 0.5 + 3) % 10 === 0;
+ }
+
+ function isOctagonal(num) {
+ return ((3 * num + 1) ** 0.5 + 1) % 3 === 0;
+ }
+
+ const numberTypes = [
+ ['triangle', isTriangle, []],
+ ['square', isSquare, []],
+ ['pentagonal', isPentagonal, []],
+ ['hexagonal', isHexagonal, []],
+ ['heptagonal', isHeptagonal, []],
+ ['octagonal', isOctagonal, []]
+ ];
+ const numsExcludingLastNeededType = new Set();
+ fillNumberTypes(n, numberTypes, numsExcludingLastNeededType);
+
+ const nNumberChains = [];
+ const [, , lastType] = numberTypes[n - 1];
+ for (let i = 0; i < lastType.length; i++) {
+ const startOfChain = lastType[i];
+ nNumberChains.push(
+ ...getChains([startOfChain], n, numberTypes, numsExcludingLastNeededType)
+ );
+ }
+
+ const cyclicalChains = nNumberChains.filter(chain =>
+ isCyclicalChain(chain, n, numberTypes)
+ );
+
+ let sum = 0;
+ for (let i = 0; i < cyclicalChains.length; i++) {
+ for (let j = 0; j < cyclicalChains[0].length; j++) {
+ sum += cyclicalChains[i][j];
+ }
+ }
+ return sum;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-62-cubic-permutations.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-62-cubic-permutations.md
new file mode 100644
index 00000000000..8e22222a359
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-62-cubic-permutations.md
@@ -0,0 +1,97 @@
+---
+id: 5900f3aa1000cf542c50febd
+title: 'Завдання 62: Кубічні перестановки'
+challengeType: 5
+forumTopicId: 302174
+dashedName: problem-62-cubic-permutations
+---
+
+# --description--
+
+Цифри куба 41063625 ($345^3$) можна переставити, щоб утворити два інших куба: 56623104 ($384^3$) та 66430125 ($405^3$). Насправді, 41063625 це найменший куб, який має рівно три перестановки своїх цифр, які також є кубами.
+
+Знайдіть найменший куб, для якого рівно `n` перестановок його цифр є кубами.
+
+# --hints--
+
+`cubicPermutations(2)` має повернути число.
+
+```js
+assert(typeof cubicPermutations(2) === 'number');
+```
+
+`cubicPermutations(2)` має повернути `125`.
+
+```js
+assert.strictEqual(cubicPermutations(2), 125);
+```
+
+`cubicPermutations(3)` має повернути `41063625`.
+
+```js
+assert.strictEqual(cubicPermutations(3), 41063625);
+```
+
+`cubicPermutations(4)` має повернути `1006012008`.
+
+```js
+assert.strictEqual(cubicPermutations(4), 1006012008);
+```
+
+`cubicPermutations(5)` має повернути `127035954683`.
+
+```js
+assert.strictEqual(cubicPermutations(5), 127035954683);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function cubicPermutations(n) {
+
+ return true;
+}
+
+cubicPermutations(2);
+```
+
+# --solutions--
+
+```js
+function cubicPermutations(n) {
+ function getDigits(num) {
+ const digits = [];
+ while (num > 0) {
+ digits.push(num % 10);
+ num = Math.floor(num / 10);
+ }
+ return digits;
+ }
+
+ function getCube(num) {
+ return num ** 3;
+ }
+
+ const digitsToCubeCounts = {};
+ let curNum = 1;
+ let digits;
+
+ while (!digitsToCubeCounts[digits] || digitsToCubeCounts[digits].count < n) {
+ const cube = getCube(curNum);
+ digits = getDigits(cube).sort().join();
+ if (!digitsToCubeCounts[digits]) {
+ digitsToCubeCounts[digits] = {
+ count: 1,
+ smallestCube: cube
+ };
+ } else {
+ digitsToCubeCounts[digits].count += 1;
+ }
+
+ curNum++;
+ }
+ return digitsToCubeCounts[digits].smallestCube;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-63-powerful-digit-counts.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-63-powerful-digit-counts.md
new file mode 100644
index 00000000000..67aac5f3bfe
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-63-powerful-digit-counts.md
@@ -0,0 +1,122 @@
+---
+id: 5900f3ab1000cf542c50febe
+title: 'Завдання 63: Степені, що дорівнюють кількості цифр'
+challengeType: 5
+forumTopicId: 302175
+dashedName: problem-63-powerful-digit-counts
+---
+
+# --description--
+
+5-значне число 16807 = 7
+
+| !!crwdBlockTags_6_sgaTkcolBdwrc!! |!!crwdBlockTags_7_sgaTkcolBdwrc!! |
+| -------------------------------------- | --------------------------------------------- |
+| 9 | 4,2,3; 5,3,1; 6,1,2 |
+| 9 | 4,3,2; 6,2,1; 5,1,3 |
+| 10 | 2,3,5; 4,5,1; 6,1,3 |
+| 10 | 2,5,3; 6,3,1; 4,1,5 |
+| 11 | 1,4,6; 3,6,2; 5,2,4 |
+| 11 | 1,6,4; 5,4,2; 3,2,6 |
+| 12 | 1,5,6; 2,6,4; 3,4,5 |
+| 12 | 1,6,5; 3,5,4; 2,4,6 |
+
+
+
+Об'єднавши кожну групу, можна утворити 9-значні рядки; максимальним значенням такого рядка для 3-кутного кільця є 432621513.
+
+Використовуючи числа від 1 до 10, залежно від розташування, можна утворити 16- та 17-значні рядки. Яким є максимальне значення **16-значного** рядка для «магічного» 5-кутного кільця?
+
+
+
+| $n$ | $\text{Relatively Prime}$ | $\displaystyle{\phi}(n)$ | $\displaystyle\frac{n}{{\phi}(n)}$ |
+| --- | ------------------------- | ------------------------ | ---------------------------------- |
+| 2 | 1 | 1 | 2 |
+| 3 | 1,2 | 2 | 1.5 |
+| 4 | 1,3 | 2 | 2 |
+| 5 | 1,2,3,4 | 4 | 1.25 |
+| 6 | 1,5 | 2 | 3 |
+| 7 | 1,2,3,4,5,6 | 6 | 1.1666... |
+| 8 | 1,3,5,7 | 4 | 2 |
+| 9 | 1,2,4,5,7,8 | 6 | 1.5 |
+| 10 | 1,3,7,9 | 4 | 2.5 |
+
+
+
+Можна побачити, що `n` = 6 утворює максимальну суму $\displaystyle\frac{n}{{\phi}(n)}$ для `n` ≤ 10.
+
+Знайдіть значення `n` ≤ `limit`, для якого $\displaystyle\frac{n}{{\phi(n)}$ є максимальним.
+
+# --hints--
+
+`totientMaximum(10)` має повернути число.
+
+```js
+assert(typeof totientMaximum(10) === 'number');
+```
+
+`totientMaximum(10)` має повернути `6`.
+
+```js
+assert.strictEqual(totientMaximum(10), 6);
+```
+
+`totientMaximum(10000)` має повернути `2310`.
+
+```js
+assert.strictEqual(totientMaximum(10000), 2310);
+```
+
+`totientMaximum(500000)` має повернути `30030`.
+
+```js
+assert.strictEqual(totientMaximum(500000), 30030);
+```
+
+`totientMaximum(1000000)` має повернути `510510`.
+
+```js
+assert.strictEqual(totientMaximum(1000000), 510510);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function totientMaximum(limit) {
+
+ return true;
+}
+
+totientMaximum(10);
+```
+
+# --solutions--
+
+```js
+function totientMaximum(limit) {
+ function getSievePrimes(max) {
+ const primesMap = new Array(max).fill(true);
+ primesMap[0] = false;
+ primesMap[1] = false;
+ const primes = [];
+ for (let i = 2; i < max; i = i + 2) {
+ if (primesMap[i]) {
+ primes.push(i);
+ for (let j = i * i; j < max; j = j + i) {
+ primesMap[j] = false;
+ }
+ }
+ if (i === 2) {
+ i = 1;
+ }
+ }
+ return primes;
+ }
+
+ const MAX_PRIME = 50;
+ const primes = getSievePrimes(MAX_PRIME);
+ let result = 1;
+
+ for (let i = 0; result * primes[i] < limit; i++) {
+ result *= primes[i];
+ }
+ return result;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-7-10001st-prime.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-7-10001st-prime.md
new file mode 100644
index 00000000000..b66746caad9
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-7-10001st-prime.md
@@ -0,0 +1,86 @@
+---
+id: 5900f3731000cf542c50fe86
+title: 'Завдання 7: 10001-е просте число'
+challengeType: 5
+forumTopicId: 302182
+dashedName: problem-7-10001st-prime
+---
+
+# --description--
+
+Перерахувавши перші шість простих чисел: 2, 3, 5, 7, 11 та 13, ми бачимо, що 13 - це 6-те просте число.
+
+Яким буде `n`-те просте число?
+
+# --hints--
+
+`nthPrime(6)` має повернути число.
+
+```js
+assert(typeof nthPrime(6) === 'number');
+```
+
+`nthPrime(6)` має повернути число 13.
+
+```js
+assert.strictEqual(nthPrime(6), 13);
+```
+
+`nthPrime(10)` має повернути число 29.
+
+```js
+assert.strictEqual(nthPrime(10), 29);
+```
+
+`nthPrime(100)` має повернути число 541.
+
+```js
+assert.strictEqual(nthPrime(100), 541);
+```
+
+`nthPrime(1000)` має повернути число 7919.
+
+```js
+assert.strictEqual(nthPrime(1000), 7919);
+```
+
+`nthPrime(10001)` має повернути число 104743.
+
+```js
+assert.strictEqual(nthPrime(10001), 104743);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function nthPrime(n) {
+
+ return true;
+}
+
+nthPrime(10001);
+```
+
+# --solutions--
+
+```js
+const nthPrime = n => {
+ let pN = 2;
+ let step = 0;
+ while (step < n) {
+ let isPrime = true;
+ let rootN = Math.sqrt(pN);
+ for (let i = 2; i <= rootN; i++) {
+ if (!(pN % i)) {
+ isPrime = false;
+ break;
+ }
+ }
+ isPrime ? step++ : '';
+ pN++;
+ }
+ return pN - 1;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-70-totient-permutation.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-70-totient-permutation.md
new file mode 100644
index 00000000000..adeb71e5976
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-70-totient-permutation.md
@@ -0,0 +1,118 @@
+---
+id: 5900f3b21000cf542c50fec5
+title: 'Завдання 70: Тотієнтна перестановка простих чисел'
+challengeType: 5
+forumTopicId: 302183
+dashedName: problem-70-totient-permutation
+---
+
+# --description--
+
+Функція Ейлера, ${\phi}(n)$ (іноді називають функцією phi), використовується для визначення кількості додатних чисел менших за або рівних `n`, які є відносно простими до `n`. Наприклад, як 1, 2, 4, 5, 7, та 8 менше 9 та відносно прості до 9 - ${\phi}(9) = 6$. Число 1 вважається відносно простим до кожного додатного числа, тобто ${\phi}(1) = 1$.
+
+Цікаво, що ${\phi}(87109) = 79180$, і можна побачити, що 87109 - це пермутація 79180.
+
+Знайдіть значення `n`, 1 < `n` < `limit`, для яких ${\phi}(n)$ є пермутацією `n`, і співвідношення $\displaystyle\frac{n}{{\phi}(n)}$ продукує мінімальне значення.
+
+# --hints--
+
+`totientPermutation(10000)` має вивести число.
+
+```js
+assert(typeof totientPermutation(10000) === 'number');
+```
+
+`totientPermutation(10000)` має вивести `4435`.
+
+```js
+assert.strictEqual(totientPermutation(10000), 4435);
+```
+
+`totientPermutation(100000)` має вивести `75841`.
+
+```js
+assert.strictEqual(totientPermutation(100000), 75841);
+```
+
+`totientPermutation(500000)` має вивести `474883`.
+
+```js
+assert.strictEqual(totientPermutation(500000), 474883);
+```
+
+`totientPermutation(10000000)` має вивести `8319823`.
+
+```js
+assert.strictEqual(totientPermutation(10000000), 8319823);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function totientPermutation(limit) {
+
+ return true;
+}
+
+totientPermutation(10000);
+```
+
+# --solutions--
+
+```js
+function totientPermutation(limit) {
+ function getSievePrimes(max) {
+ const primes = [];
+ const primesMap = new Array(max).fill(true);
+ primesMap[0] = false;
+ primesMap[1] = false;
+
+ for (let i = 2; i < max; i += 2) {
+ if (primesMap[i]) {
+ primes.push(i);
+ for (let j = i * i; j < max; j += i) {
+ primesMap[j] = false;
+ }
+ }
+ if (i === 2) {
+ i = 1;
+ }
+ }
+ return primes;
+ }
+
+ function sortDigits(number) {
+ return number.toString().split('').sort().join('');
+ }
+
+ function isPermutation(numberA, numberB) {
+ return sortDigits(numberA) === sortDigits(numberB);
+ }
+
+ const MAX_PRIME = 4000;
+ const primes = getSievePrimes(MAX_PRIME);
+
+ let nValue = 1;
+ let minRatio = Infinity;
+
+ for (let i = 1; i < primes.length; i++) {
+ for (let j = i + 1; j < primes.length; j++) {
+ const num = primes[i] * primes[j];
+ if (num > limit) {
+ break;
+ }
+
+ const phi = (primes[i] - 1) * (primes[j] - 1);
+ const ratio = num / phi;
+
+ if (minRatio > ratio && isPermutation(num, phi)) {
+ nValue = num;
+ minRatio = ratio;
+ }
+ }
+ }
+ return nValue;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-71-ordered-fractions.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-71-ordered-fractions.md
new file mode 100644
index 00000000000..1c0c7b2d05b
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-71-ordered-fractions.md
@@ -0,0 +1,95 @@
+---
+id: 5900f3b31000cf542c50fec6
+title: 'Завдання 71: Упорядковані дроби'
+challengeType: 5
+forumTopicId: 302184
+dashedName: problem-71-ordered-fractions
+---
+
+# --description--
+
+Розглянемо дріб $\frac{n}{d}$, де `n` та `d` є додатними цілими числами. Якщо `n` < `d` та найвищий спільний дільник ${{HCF}(n, d)} = 1$, то він називається нескоротним правильним дробом.
+
+Якщо ми перерахуємо набір знижених правильних дробів для `d` ≤ 8 у порядку зростання розміру, то ми отримаємо:
+
+$$\frac{1}{8}, \frac{1}{7}, \frac{1}{6}, \frac{1}{5}, \frac{1}{4}, \frac{2}{7}, \frac{1}{3}, \frac{3}{8}, \frac{\textbf2}{\textbf5}, \frac{3}{7}, \frac{1}{2}, \frac{4}{7}, \frac{3}{5}, \frac{5}{8}, \frac{2}{3}, \frac{5}{7}, \frac{3}{4}, \frac{4}{5}, \frac{5}{6}, \frac{6}{7}, \frac{7}{8}$$
+
+Можна побачити, що $\frac{2}{5}$ — це дріб одразу зліва від $\frac{3}{7}$.
+
+При перерахунку набору нескоротних правильних дробів для `d` ≤ `limit` у порядку зростання розміру, знайдіть чисельник дробу одразу зліва від $\frac{3}{7}$.
+
+# --hints--
+
+`orderedFractions(8)` повинен повертатися як число.
+
+```js
+assert(typeof orderedFractions(8) === 'number');
+```
+
+`orderedFractions(8)` повинен повертатися як `2`.
+
+```js
+assert.strictEqual(orderedFractions(8), 2);
+```
+
+`orderedFractions(10)` повинен повертатися як `2`.
+
+```js
+assert.strictEqual(orderedFractions(10), 2);
+```
+
+`orderedFractions(9994)` повинен повертатися як `4283`.
+
+```js
+assert.strictEqual(orderedFractions(9994), 4283);
+```
+
+`orderedFractions(500000)` повинен повертатися як `214283`.
+
+```js
+assert.strictEqual(orderedFractions(500000), 214283);
+```
+
+`orderedFractions(1000000)` повинен повертатися як `428570`.
+
+```js
+assert.strictEqual(orderedFractions(1000000), 428570);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function orderedFractions(limit) {
+
+ return true;
+}
+
+orderedFractions(8);
+```
+
+# --solutions--
+
+```js
+function orderedFractions(limit) {
+ const fractions = [];
+ const fractionValues = {};
+ const highBoundary = 3 / 7;
+ let lowBoundary = 2 / 7;
+
+ for (let denominator = limit; denominator > 2; denominator--) {
+ let numerator = Math.floor((3 * denominator - 1) / 7);
+ let value = numerator / denominator;
+ if (value > highBoundary || value < lowBoundary) {
+ continue;
+ }
+ fractionValues[value] = [numerator, denominator];
+ fractions.push(value);
+ lowBoundary = value;
+ }
+
+ fractions.sort();
+ return fractionValues[fractions[fractions.length - 1]][0];
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-72-counting-fractions.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-72-counting-fractions.md
new file mode 100644
index 00000000000..79ffdd40016
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-72-counting-fractions.md
@@ -0,0 +1,90 @@
+---
+id: 5900f3b41000cf542c50fec7
+title: 'Завдання 72: Підрахунок дробів'
+challengeType: 5
+forumTopicId: 302185
+dashedName: problem-72-counting-fractions
+---
+
+# --description--
+
+Розглянемо дріб $\frac{n}{d}$, де `n` та `d` є додатними цілими числами. Якщо `n` < `d` та найбільший спільний дільник ${HCF}(n, d) = 1$, то це називається нескоротним правильним дробом.
+
+Якщо перерахуємо нескоротні правильні дроби для `d` ≤ 8 у порядку зростання, то отримаємо:
+
+$$\frac{1}{8}, \frac{1}{7}, \frac{1}{6}, \frac{1}{5}, \frac{1}{4}, \frac{2}{7}, \frac{1}{3}, \frac{3}{8}, \frac{2}{5}, \frac{3}{7}, \frac{1}{2}, \frac{4}{7}, \frac{3}{5}, \frac{5}{8}, \frac{2}{3}, \frac{5}{7}, \frac{3}{4}, \frac{4}{5}, \frac{5}{6}, \frac{6}{7}, \frac{7}{8}$$
+
+Бачимо, що кількість елементів становить `21`.
+
+Скільки елементів нескоротних правильних дробів буде при `d` ≤ `limit`?
+
+# --hints--
+
+`countingFractions(8)` має повернути число.
+
+```js
+assert(typeof countingFractions(8) === 'number');
+```
+
+`countingFractions(8)` має повернути `21`.
+
+```js
+assert.strictEqual(countingFractions(8), 21);
+```
+
+`countingFractions(20000)` має повернути `121590395`.
+
+```js
+assert.strictEqual(countingFractions(20000), 121590395);
+```
+
+`countingFractions(500000)` має повернути `75991039675`.
+
+```js
+assert.strictEqual(countingFractions(500000), 75991039675);
+```
+
+`countingFractions(1000000)` має повернути `303963552391`.
+
+```js
+assert.strictEqual(countingFractions(1000000), 303963552391);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function countingFractions(limit) {
+
+ return true;
+}
+
+countingFractions(8);
+```
+
+# --solutions--
+
+```js
+function countingFractions(limit) {
+ const phi = {};
+ let count = 0;
+
+ for (let i = 2; i <= limit; i++) {
+ if (!phi[i]) {
+ phi[i] = i;
+ }
+ if (phi[i] === i) {
+ for (let j = i; j <= limit; j += i) {
+ if (!phi[j]) {
+ phi[j] = j;
+ }
+ phi[j] = (phi[j] / i) * (i - 1);
+ }
+ }
+ count += phi[i];
+ }
+
+ return count;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-73-counting-fractions-in-a-range.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-73-counting-fractions-in-a-range.md
new file mode 100644
index 00000000000..b1045831997
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-73-counting-fractions-in-a-range.md
@@ -0,0 +1,83 @@
+---
+id: 5900f3b61000cf542c50fec8
+title: 'Завдання 73: Підрахунок дробів в межах діапазону'
+challengeType: 5
+forumTopicId: 302186
+dashedName: problem-73-counting-fractions-in-a-range
+---
+
+# --description--
+
+Розглянемо дріб $\frac{n}{d}$, де `n` та `d` є додатними цілими числами. Якщо `n` < `d` та найбільший спільний дільник ${HCF}(n, d) = 1$, то це називається нескоротним правильним дробом.
+
+Якщо ми перерахуємо набір знижених правильних дробів для `d` ≤ 8 у порядку зростання розміру, то ми отримаємо:
+
+$$\frac{1}{8}, \frac{1}{7}, \frac{1}{6}, \frac{1}{5}, \frac{1}{4}, \frac{2}{7}, \frac{1}{3}, \mathbf{\frac{3}{8}, \frac{2}{5}, \frac{3}{7}}, \frac{1}{2}, \frac{4}{7}, \frac{3}{5}, \frac{5}{8}, \frac{2}{3}, \frac{5}{7}, \frac{3}{4}, \frac{4}{5}, \frac{5}{6}, \frac{6}{7}, \frac{7}{8}$$
+
+Можна побачити, що є `3` дроби між $\frac{1}{3}$ та $\frac{1}{2}$.
+
+Як багато дробів лежить між $\frac{1}{3}$ та $\frac{1}{2}$ у відсортованому наборі зі нескоротних правильних дробів для `d` ≤ `limit`?
+
+# --hints--
+
+`countingFractionsInARange(8)` повинен повертатися як число.
+
+```js
+assert(typeof countingFractionsInARange(8) === 'number');
+```
+
+`countingFractionsInARange(8)` повинен повертатися як `3`.
+
+```js
+assert.strictEqual(countingFractionsInARange(8), 3);
+```
+
+`countingFractionsInARange(1000)` повинен повертатися як `50695`.
+
+```js
+assert.strictEqual(countingFractionsInARange(1000), 50695);
+```
+
+`countingFractionsInARange(6000)` повинен повертатися як `1823861`.
+
+```js
+assert.strictEqual(countingFractionsInARange(6000), 1823861);
+```
+
+`countingFractionsInARange(12000)` повинен повертатися як `7295372`.
+
+```js
+assert.strictEqual(countingFractionsInARange(12000), 7295372);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function countingFractionsInARange(limit) {
+
+ return true;
+}
+
+countingFractionsInARange(8);
+```
+
+# --solutions--
+
+```js
+function countingFractionsInARange(limit) {
+ let result = 0;
+ const stack = [[3, 2]];
+ while (stack.length > 0) {
+ const [startDenominator, endDenominator] = stack.pop();
+ const curDenominator = startDenominator + endDenominator;
+ if (curDenominator <= limit) {
+ result++;
+ stack.push([startDenominator, curDenominator]);
+ stack.push([curDenominator, endDenominator]);
+ }
+ }
+ return result;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-74-digit-factorial-chains.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-74-digit-factorial-chains.md
new file mode 100644
index 00000000000..a5dd044de9d
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-74-digit-factorial-chains.md
@@ -0,0 +1,123 @@
+---
+id: 5900f3b61000cf542c50fec9
+title: 'Проблема 74: ланцюги цифрових факторіалів'
+challengeType: 5
+forumTopicId: 302187
+dashedName: problem-74-digit-factorial-chains
+---
+
+# --description--
+
+Число 145 відоме своєю властивістю, що сума факторіала цих цифр дорівнює 145:
+
+$$1! + 4! + 5! = 1 + 24 + 120 = 145$$
+
+Можливо, менш відомим є 169, в якому він продукує найдовший ланцюг чисел, що посилається на 169; виявляється, що існує лише три такі цикли:
+
+$$\початок{align} &169 → 363601 → 1454 → 169\\\\ &871 → 45361 → 871\\\\ &872 → 45362 → 872\\\\ \кінець{align}$$
+
+Не важко довести, що КОЖНЕ початкове число врешті застрягне в циклі. Наприклад,
+
+$$\початок{align} &69 → 363600 → 1454 → 169 → 363601\\ (→ 1454)\\\\ &78 → 45360 → 871 → 45361\\ (→ 871)\\\\ &540 → 145\\ (→ 145)\\\\ \кінець{align}$$
+
+Починаючи з 69 продукується ланцюжок з 5 неповторних значень, але найдовший неповторний ланцюжок з початковим числом нижче одного мільйона - це шістдесят значень.
+
+Скільки ланцюжків з початковим числом нижче `n` містить саме шістдесят неповторних значень?
+
+# --hints--
+
+`digitFactorialChains(2000)` має вивести число.
+
+```js
+assert(typeof digitFactorialChains(2000) === 'number');
+```
+
+`digitFactorialChains(2000)` має вивести `6`.
+
+```js
+assert.strictEqual(digitFactorialChains(2000), 6);
+```
+
+`digitFactorialChains(100000)` має вивести `42`.
+
+```js
+assert.strictEqual(digitFactorialChains(100000), 42);
+```
+
+`digitFactorialChains(500000)` має вивести `282`.
+
+```js
+assert.strictEqual(digitFactorialChains(500000), 282);
+```
+
+`digitFactorialChains(1000000)` має вивести `402`.
+
+```js
+assert.strictEqual(digitFactorialChains(1000000), 402);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function digitFactorialChains(n) {
+
+ return true;
+}
+
+digitFactorialChains(2000);
+```
+
+# --solutions--
+
+```js
+function digitFactorialChains(n) {
+ function sumDigitsFactorials(number) {
+ let sum = 0;
+ while (number > 0) {
+ sum += factorials[number % 10];
+ number = Math.floor(number / 10);
+ }
+ return sum;
+ }
+
+ const factorials = [1];
+ for (let i = 1; i < 10; i++) {
+ factorials.push(factorials[factorials.length - 1] * i);
+ }
+
+ const sequences = {
+ 169: 3,
+ 871: 2,
+ 872: 2,
+ 1454: 3,
+ 45362: 2,
+ 45461: 2,
+ 3693601: 3
+ };
+ let result = 0;
+
+ for (let i = 2; i < n; i++) {
+ let curNum = i;
+ let chainLength = 0;
+ const curSequence = [];
+ while (curSequence.indexOf(curNum) === -1) {
+ curSequence.push(curNum);
+ curNum = sumDigitsFactorials(curNum);
+ chainLength++;
+ if (sequences.hasOwnProperty(curNum) > 0) {
+ chainLength += sequences[curNum];
+ break;
+ }
+ }
+ if (chainLength === 60) {
+ result++;
+ }
+ for (let j = 1; j < curSequence.length; j++) {
+ sequences[curSequence[j]] = chainLength - j;
+ }
+ }
+ return result;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-75-singular-integer-right-triangles.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-75-singular-integer-right-triangles.md
new file mode 100644
index 00000000000..86d54293853
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-75-singular-integer-right-triangles.md
@@ -0,0 +1,117 @@
+---
+id: 5900f3b71000cf542c50feca
+title: 'Завдання 75: Одиничні цілочисельні прямокутні трикутники'
+challengeType: 5
+forumTopicId: 302188
+dashedName: problem-75-singular-integer-right-triangles
+---
+
+# --description--
+
+Виявилось, що 12 см — це найменша довжина проводу, який можна зігнути так, щоб сформувати прямокутний трикутник лише одним способом, проте існує набагато більше прикладів.
+
+
+
+| Монетні стопки |
+| ----------------- |
+| OOOOO |
+| OOOO O |
+| OOO OO |
+| OOO O O |
+| OO OO O |
+| OO O O O |
+| O O O O O |
+
+
, 2D масив представляє матрицю. Максимальний розмір матриці, що використовується в тестах, дорівнюватиме 80 на 80.
+
+--hints--
+
+pathSumFourWays(testMatrix1)` має вивести число.
+
+```js
+assert(typeof pathSumFourWays(_testMatrix1) === 'number');
+```
+
+`pathSumFourWays(testMatrix1)` має вивести `2297`.
+
+```js
+assert.strictEqual(pathSumFourWays(_testMatrix1), 2297);
+```
+
+`pathSumFourWays(testMatrix2)` має вивести `425185`.
+
+```js
+assert.strictEqual(pathSumFourWays(_testMatrix2), 425185);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const _testMatrix1 = [
+ [131, 673, 234, 103, 18],
+ [201, 96, 342, 965, 150],
+ [630, 803, 746, 422, 111],
+ [537, 699, 497, 121, 956],
+ [805, 732, 524, 37, 331]
+];
+const _testMatrix2 = [
+ [4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870],
+ [1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377],
+ [9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230],
+ [7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187],
+ [3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505],
+ [1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942],
+ [4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757],
+ [510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706],
+ [9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048],
+ [3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540],
+ [6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442],
+ [7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509],
+ [4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000],
+ [356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672],
+ [9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785],
+ [192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095],
+ [1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859],
+ [4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837],
+ [5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286],
+ [1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963],
+ [1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127],
+ [8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535],
+ [7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446],
+ [3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615],
+ [9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303],
+ [5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266],
+ [6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763],
+ [9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550],
+ [5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887],
+ [6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531],
+ [5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739],
+ [1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269],
+ [4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380],
+ [4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829],
+ [8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873],
+ [2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271],
+ [6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281],
+ [2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660],
+ [6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665],
+ [3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056],
+ [5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089],
+ [3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523],
+ [1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616],
+ [8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125],
+ [3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307],
+ [8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920],
+ [8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225],
+ [9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976],
+ [3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432],
+ [1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351],
+ [7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991],
+ [9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110],
+ [7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965],
+ [3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314],
+ [1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416],
+ [126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028],
+ [8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407],
+ [7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312],
+ [4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000],
+ [4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229],
+ [7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256],
+ [7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842],
+ [6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241],
+ [4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213],
+ [9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015],
+ [3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405],
+ [2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640],
+ [3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480],
+ [4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181],
+ [171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501],
+ [3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698],
+ [2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531],
+ [7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255],
+ [8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631],
+ [2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914],
+ [6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864],
+ [8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738],
+ [2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294],
+ [2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789],
+ [5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981]
+];
+```
+
+## --seed-contents--
+
+```js
+function pathSumFourWays(matrix) {
+
+ return true;
+}
+
+// Only change code above this line
+
+const testMatrix1 = [
+ [131, 673, 234, 103, 18],
+ [201, 96, 342, 965, 150],
+ [630, 803, 746, 422, 111],
+ [537, 699, 497, 121, 956],
+ [805, 732, 524, 37, 331]
+];
+
+pathSumFourWays(testMatrix1);
+```
+
+# --solutions--
+
+```js
+function pathSumFourWays(matrix) {
+ const MOVES = [
+ [-1, 0],
+ [1, 0],
+ [0, -1],
+ [0, 1]
+ ];
+
+ function getAllowedMoves(row, col) {
+ const moves = [];
+ for (let i = 0; i < MOVES.length; i++) {
+ const [rowChange, colChange] = MOVES[i];
+ const nextRow = row + rowChange;
+ const nextCol = col + colChange;
+ if (isMoveAllowed(nextRow, nextCol)) {
+ moves.push([nextRow, nextCol]);
+ }
+ }
+ return moves;
+ }
+
+ function isMoveAllowed(nextRow, nextCol) {
+ if (nextRow < 0 || nextRow >= size || nextCol < 0 || nextCol >= size) {
+ return false;
+ }
+ return true;
+ }
+
+ const size = matrix.length;
+ const resultMatrix = new Array(size)
+ .fill()
+ .map(() => new Array(size).fill(Infinity));
+
+ const [startRow, startCol] = new Array(2).fill(size - 1);
+ const queue = [[startRow, startCol]];
+ resultMatrix[startRow][startCol] = matrix[startRow][startCol];
+
+ while (queue.length > 0) {
+ const [curRow, curCol] = queue.shift();
+
+ const allowedMoves = getAllowedMoves(curRow, curCol);
+
+ for (let i = 0; i < allowedMoves.length; i++) {
+ const [nextRow, nextCol] = allowedMoves[i];
+ const bestPath = resultMatrix[nextRow][nextCol];
+ const newPath = resultMatrix[curRow][curCol] + matrix[nextRow][nextCol];
+ if (newPath < bestPath) {
+ resultMatrix[nextRow][nextCol] = newPath;
+ queue.push(allowedMoves[i]);
+ }
+ }
+ }
+ return resultMatrix[0][0];
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-84-monopoly-odds.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-84-monopoly-odds.md
new file mode 100644
index 00000000000..c0cf868b674
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-84-monopoly-odds.md
@@ -0,0 +1,268 @@
+---
+id: 5900f3c11000cf542c50fed3
+title: 'Завдання 84: Шанси Монополії'
+challengeType: 5
+forumTopicId: 302198
+dashedName: problem-84-monopoly-odds
+---
+
+# --description--
+
+У грі, *Монополія*, стандартна плата встановлюється наступним чином:
+
+
+
+
+
+ ВПЕРЕД
+ А1
+ CC1
+ А2
+ Т1
+ Р1
+ В1
+ CH1
+ В2
+ B3
+ ТЮРМА
+
+
+ H2
+
+ С1
+
+
+ Т2
+
+ U1
+
+
+ H1
+
+ C2
+
+
+ CH3
+
+ C3
+
+
+ R4
+
+ R2
+
+
+ G3
+
+ D1
+
+
+ CC3
+
+ CC2
+
+
+ G2
+
+ D2
+
+
+ G1
+
+ D3
+
+
+ G2J
+ F3
+ U2
+ F2
+ F1
+ R3
+ E3
+ E2
+ CH2
+ E1
+ FP
+
+
+
+
+
+Гравець стартує зі стартової площадки і додає очки з 6-бічних кубиків для визначення кількості квадратів, за якими просувається за годинниковою стрілкою. Без будь-яких подальших правил ми очікуємо відвідати кожен квадрат з рівною ймовірністю: 2,5%. Однак, кроки на G2J (прямуйте до тюрми), CC (скриня спільноти), і CH (шанс) змінює цей розподіл.
+
+На додачу до G2J, є ще одна карта з CC і CH, що наказує гравцю іти безпосередньо до в'язниці, якщо гравець викидає три парні поспіль, то вони не підвищує результат свого третього кидка. Але вони потрапляють безпосередньо до тюрми.
+
+На початку гри CC та CH картки змішані. Коли гравець опиняється на CC або CH він бере карту зверху відповідної купи і, після виконання інструкцій, повертає картку донизу купи. У кожній стопці по шістнадцять карт, але для цілей цієї задачі ми матимемо справу лише з картками, які вказують рух; будь-яка інструкція, яка не стосується руху буде проігнорована, і гравець залишиться на полі CC/CH.
+
+
+ Скриня спільноти (2/16 карт):
+
+ Перейти на початок
+ Перейти до ТЮРМИ
+
+
+ Шанс (10/16 карт):
+
+ Перейти на початок
+ Перейти до ТЮРМИ
+ Перейти до C1
+ Перейти до E3
+ Перейти до H2
+ Перейти до C1
+ Перейти до наступної R (залізнична компанія)
+ Перейти до наступної R
+ Перейти до наступного U (комунальна компанія)
+ Назад на 3 ходи.
+
+
+
+Корінь цієї проблеми стосується ймовірності відвідання певного квадрату. Тобто ймовірність закінчити на цьому квадраті після виконання ходу. З цієї причини слід розуміти, що, за винятком G2J, при якому ймовірність фінішу на цьому кроці дорівнює нулю, квадрати CH матимуть найнижчі ймовірності, як 5/8 запит руху на інший квадрат, а ми зацікавленні саме на фінальному квадраті, де гравець закінчує після кожного кидку. Ми не будемо розрізняти "Просто відвідування" та відправлення до ТЮРЬМИ, також ми ігноруватимемо правило щодо вимагання подвійної плати щоб "вийти з в'язниці", припустивши, що гравці платять за те, щоб вийти на свій наступний хід.
+
+Починаючи з кроку GO та послідовно нумеруючи квадрати з 00 до 39, ми можемо об'єднати ці двоцифрові числа для отримання рядків, що відповідають наборам квадратів.
+
+Статистично можна показати, що три найпопулярніші квадрати, по порядку, це ТЮРМА (6.24%) = Квадрат 10, Е3 (3.18%) = Квадрат 24, і GO (3.09%) = Квадрат 00. Отож, ці три найпопулярніші квадрати можна перелічити шестизначним модальним рядком `102400`.
+
+Якщо замість 6-гранного кубика використовується дво`n`-гранний кубик, знайдіть шестизначний модальний рядок.
+
+# --hints--
+
+`monopolyOdds(8)` має вивести рядок.
+
+```js
+assert(typeof monopolyOdds(8) === 'string');
+```
+
+`monopolyOdds(8)` має вивести рядок `102400`.
+
+```js
+assert.strictEqual(monopolyOdds(8), '102400');
+```
+
+`monopolyOdds(10)` має вивести рядок `100024`.
+
+```js
+assert.strictEqual(monopolyOdds(10), '100024');
+```
+
+`monopolyOdds(20)` має вивести рядок `100005`.
+
+```js
+assert.strictEqual(monopolyOdds(20), '100005');
+```
+
+`monopolyOdds(4)` має вивести рядок `101524`.
+
+```js
+assert.strictEqual(monopolyOdds(4), '101524');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function monopolyOdds(n) {
+
+ return true;
+}
+
+monopolyOdds(8);
+```
+
+# --solutions--
+
+```js
+function monopolyOdds(n) {
+ function chanceCard(position, chanceCardPosition) {
+ chanceCardPosition = (chanceCardPosition + 1) % 16;
+ if (chanceCardPosition < 6) {
+ position = chanceCardsMoves[chanceCardPosition];
+ } else if (chanceCardPosition === 6 || chanceCardPosition === 7) {
+ position = nextMovesFromR[position];
+ } else if (chanceCardPosition === 8) {
+ position = nextMovesFromU[position];
+ } else if (chanceCardPosition === 9) {
+ position -= 3;
+ }
+ return [position, chanceCardPosition];
+ }
+
+ function chestCard(position, chestPosition) {
+ chestPosition = (chestPosition + 1) % 16;
+ if (chestPosition < 2) {
+ position = chestCardsMoves[chestPosition];
+ }
+ return [position, chestPosition];
+ }
+
+ function isChest(position) {
+ return position === 2 || position === 17 || position === 33;
+ }
+
+ function isChance(position) {
+ return position === 7 || position === 22 || position === 36;
+ }
+
+ function isJail(position) {
+ return position === 30;
+ }
+
+ function roll(dice) {
+ return Math.floor(Math.random() * dice) + 1;
+ }
+
+ function getTopThree(board) {
+ return sortByVisits(board)
+ .slice(0, 3)
+ .map(elem => elem[0].toString().padStart(2, '0'))
+ .join('');
+ }
+
+ function sortByVisits(board) {
+ return board
+ .map((element, index) => [index, element])
+ .sort((a, b) => a[1] - b[1])
+ .reverse();
+ }
+
+ const rounds = 2000000;
+ const chestCardsMoves = [0, 10];
+ const chanceCardsMoves = [0, 10, 11, 24, 39, 5];
+ const nextMovesFromR = { 7: 15, 22: 25, 36: 5 };
+ const nextMovesFromU = { 7: 12, 36: 12, 22: 28 };
+
+ const board = new Array(40).fill(0);
+ let doubleCount = 0;
+ let curPosition = 0;
+ let curChestCard = 0;
+ let curChanceCard = 0;
+
+ for (let i = 0; i < rounds; i++) {
+ const dice1 = roll(n);
+ const dice2 = roll(n);
+
+ if (dice1 === dice2) {
+ doubleCount++;
+ } else {
+ doubleCount = 0;
+ }
+
+ if (doubleCount > 2) {
+ curPosition = 10;
+ doubleCount = 0;
+ } else {
+ curPosition = (curPosition + dice1 + dice2) % 40;
+
+ if (isChance(curPosition)) {
+ [curPosition, curChanceCard] = chanceCard(curPosition, curChanceCard);
+ } else if (isChest(curPosition)) {
+ [curPosition, curChestCard] = chestCard(curPosition, curChestCard);
+ } else if (isJail(curPosition)) {
+ curPosition = 10;
+ }
+ }
+ board[curPosition]++;
+ }
+ return getTopThree(board);
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-85-counting-rectangles.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-85-counting-rectangles.md
new file mode 100644
index 00000000000..17838ece97c
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-85-counting-rectangles.md
@@ -0,0 +1,109 @@
+---
+id: 5900f3c11000cf542c50fed4
+title: 'Завдання 85: Підрахунок прямокутників'
+challengeType: 5
+forumTopicId: 302199
+dashedName: problem-85-counting-rectangles
+---
+
+# --description--
+
+При ретельному підрахунку можна побачити, що прямокутна сітка розміром 3 на 2 містить вісімнадцять прямокутників:
+
+
+
+Хоча може і не існувати прямокутної сітки, що містить саме `n` прямокутники, знайдіть площу сітки з приблизним розв'язком.
+
+# --hints--
+
+`countingRectangles(18)` має вивести число.
+
+```js
+assert(typeof countingRectangles(18) === 'number');
+```
+
+`countingRectangles(18)` має вивести `6`.
+
+```js
+assert.strictEqual(countingRectangles(18), 6);
+```
+
+`countingRectangles(250)` має вивести `22`.
+
+```js
+assert.strictEqual(countingRectangles(250), 22);
+```
+
+`countingRectangles(50000)` має вивести `364`.
+
+```js
+assert.strictEqual(countingRectangles(50000), 364);
+```
+
+`countingRectangles(1000000)` має вивести `1632`.
+
+```js
+assert.strictEqual(countingRectangles(1000000), 1632);
+```
+
+`countingRectangles(2000000)` має вивести `2772`.
+
+```js
+assert.strictEqual(countingRectangles(2000000), 2772);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function countingRectangles(n) {
+
+ return true;
+}
+
+countingRectangles(18);
+```
+
+# --solutions--
+
+```js
+function countingRectangles(n) {
+ function numberOfRectangles(h, w) {
+ return (h * (h + 1) * w * (w + 1)) / 4;
+ }
+
+ function rectangleArea(h, w) {
+ return h * w;
+ }
+
+ let rectanglesCount = 1;
+ let maxSide = 1;
+ while (rectanglesCount < n) {
+ maxSide++;
+ rectanglesCount = numberOfRectangles(maxSide, 1);
+ }
+
+ let bestDiff = Math.abs(rectanglesCount - n);
+ let bestSize = [maxSide, 1];
+
+ let curHeight = maxSide - 1;
+ let curWidth = 1;
+
+ for (curWidth; curWidth < curHeight; curWidth++) {
+ for (curHeight; curHeight > curWidth; curHeight--) {
+ rectanglesCount = numberOfRectangles(curHeight, curWidth);
+ const curDiff = Math.abs(rectanglesCount - n);
+ if (curDiff < bestDiff) {
+ bestDiff = curDiff;
+ bestSize = [curHeight, curWidth];
+ }
+
+ if (rectanglesCount < n) {
+ break;
+ }
+ }
+ }
+ return rectangleArea(...bestSize);
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-86-cuboid-route.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-86-cuboid-route.md
new file mode 100644
index 00000000000..f6ea5dba83f
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-86-cuboid-route.md
@@ -0,0 +1,94 @@
+---
+id: 5900f3c31000cf542c50fed5
+title: 'Завдання 86: Кубоподібний маршрут'
+challengeType: 5
+forumTopicId: 302200
+dashedName: problem-86-cuboid-route
+---
+
+# --description--
+
+Павук, S, сидить в одному кутку кубоподібної кімнати розміром 6 на 5 на 3, і муха, F, сидить в протилежному кутку. Переміщаючись по поверхнях кімнати, найкоротша відстань від S до F - 10, шлях показано на діаграмі.
+
+
+
+Однак, для будь-якого даного куба існує до трьох кандидатів на "найкоротший" шлях, та найкоротший маршрут не завжди має цілочисельну довжину.
+
+Можна показати, що існує саме `2060` окремих кубоїди, ігноруючи обертання, з цілочисельною величиною, до максимального розміру М на М на М, для якого найкоротший маршрут має цілочисельну довжину при M = 100. Це найменше значення М, для якого кількість розв'язків спочатку перевищує дві тисячі; кількість розв'язків при М = 99 `1975`.
+
+Знайдіть найменше значення М таким чином, щоб кількість розв'язків спочатку перевищувала `n`.
+
+# --hints--
+
+`cuboidRoute(2000)` має вивести число.
+
+```js
+assert(typeof cuboidRoute(2000) === 'number');
+```
+
+`cuboidRoute(2000)` має вивести `100`.
+
+```js
+assert.strictEqual(cuboidRoute(2000), 100);
+```
+
+`cuboidRoute(25000)` має вивести `320`.
+
+```js
+assert.strictEqual(cuboidRoute(25000), 320);
+```
+
+`cuboidRoute(500000)` має вивести `1309`.
+
+```js
+assert.strictEqual(cuboidRoute(500000), 1309);
+```
+
+`cuboidRoute(1000000)` має вивести `1818`.
+
+```js
+assert.strictEqual(cuboidRoute(1000000), 1818);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function cuboidRoute(n) {
+
+ return true;
+}
+
+cuboidRoute(2000);
+```
+
+# --solutions--
+
+```js
+function cuboidRoute(n) {
+ // Based on https://www.mathblog.dk/project-euler-86-shortest-path-cuboid/
+ function getLength(a, b) {
+ return Math.sqrt(a ** 2 + b ** 2);
+ }
+
+ let M = 2;
+ let counter = 0;
+
+ while (counter < n) {
+ M++;
+ for (let baseHeightWidth = 3; baseHeightWidth <= 2 * M; baseHeightWidth++) {
+ const pathLength = getLength(M, baseHeightWidth);
+ if (Number.isInteger(pathLength)) {
+ if (baseHeightWidth <= M) {
+ counter += Math.floor(baseHeightWidth / 2);
+ } else {
+ counter += 1 + M - Math.floor((baseHeightWidth + 1) / 2);
+ }
+ }
+ }
+ }
+
+ return M;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-87-prime-power-triples.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-87-prime-power-triples.md
new file mode 100644
index 00000000000..f1606328e4e
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-87-prime-power-triples.md
@@ -0,0 +1,131 @@
+---
+id: 5900f3c51000cf542c50fed8
+title: 'Завдання 87: Прості кубічні степені'
+challengeType: 5
+forumTopicId: 302201
+dashedName: problem-87-prime-power-triples
+---
+
+# --description--
+
+Найменша кількість виражена як сума простого квадрату, простого куба та простого четвертого степеню, дорівнює `28`. Насправді, саме чотири числа нижче п'ятдесяти можуть бути виражені таким чином:
+
+
+ 28 = 22 + 23 + 24
+ 33 = 32 + 23 + 24
+ 49 = 52 + 23 + 24
+ 47 = 22 + 33 + 24
+
+
+Скільки чисел нижче `n` можуть бути виражені як сума простого квадрату, простого куба та простого четвертого степеня?
+
+# --hints--
+
+`primePowerTriples(50)` має вивести число.
+
+```js
+assert(typeof primePowerTriples(50) === 'number');
+```
+
+`primePowerTriples(50)` має вивести `4`.
+
+```js
+assert.strictEqual(primePowerTriples(50), 4);
+```
+
+`primePowerTriples(10035)` має вивести `684`.
+
+```js
+assert.strictEqual(primePowerTriples(10035), 684);
+```
+
+`primePowerTriples(500000)` має вивести `18899`.
+
+```js
+assert.strictEqual(primePowerTriples(500000), 18899);
+```
+
+`primePowerTriples(5000000)` має вивести `138932`.
+
+```js
+assert.strictEqual(primePowerTriples(5000000), 138932);
+```
+
+`primePowerTriples(50000000)` має вивести `1097343`.
+
+```js
+assert.strictEqual(primePowerTriples(50000000), 1097343);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function primePowerTriples(n) {
+
+ return true;
+}
+
+primePowerTriples(50);
+```
+
+# --solutions--
+
+```js
+function primePowerTriples(n) {
+ function getSievePrimes(max) {
+ const primes = [];
+ const primesMap = new Array(max).fill(true);
+ primesMap[0] = false;
+ primesMap[1] = false;
+
+ for (let i = 2; i <= max; i += 2) {
+ if (primesMap[i]) {
+ primes.push(i);
+ for (let j = i * i; j <= max; j = j + i) {
+ primesMap[j] = false;
+ }
+ }
+ if (i === 2) {
+ i = 1;
+ }
+ }
+ return primes;
+ }
+
+ function getPowersSummed(numbers, powers, limit, curSum) {
+ if (curSum >= limit) {
+ return [];
+ } else if (powers.length === 0) {
+ return [curSum];
+ }
+
+ const powersSummed = [];
+
+ const curPower = powers[0];
+ const powersLeft = powers.slice(1);
+ for (let i = 0; i < numbers.length; i++) {
+ const curNumber = numbers[i];
+ const nextSum = curSum + curNumber ** curPower;
+ if (nextSum >= limit) {
+ return powersSummed;
+ }
+ const result = getPowersSummed(
+ numbers,
+ powersLeft,
+ limit,
+ curSum + curNumber ** curPower
+ );
+ powersSummed.push(...result);
+ }
+ return powersSummed;
+ }
+
+ const maximumBaseNumber = Math.floor(Math.sqrt(n - 2 ** 3 - 2 ** 4)) + 1;
+ const primes = getSievePrimes(maximumBaseNumber);
+ const uniqueSums = new Set(getPowersSummed(primes, [2, 3, 4], n, 0));
+
+ return uniqueSums.size;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-88-product-sum-numbers.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-88-product-sum-numbers.md
new file mode 100644
index 00000000000..a8324adef1d
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-88-product-sum-numbers.md
@@ -0,0 +1,110 @@
+---
+id: 5900f3c51000cf542c50fed6
+title: 'Проблема 88: Сума похідних чисел'
+challengeType: 5
+forumTopicId: 302203
+dashedName: problem-88-product-sum-numbers
+---
+
+# --description--
+
+Натуральне число, `N`, яке можна записати як суму і добуток даної множини, щонайменше двох натуральних чисел, $\\{a_1, a_2, \ldots , a_k\\}$, називається чисельною сумою: $N = a_1 + a_2 + \cdots + a_k = a_1 × a_2 × \cdots × a_k$.
+
+Наприклад, 6 = 1 + 2 + 3 = 1 × 2 × 3.
+
+Для заданої величини, `k`, необхідно назвати найменше N за допомогою цієї властивості мінімального числа похідних. Таким чином, мінімальними похідними для множин розміру - `k` = 2, 3, 4, 5, і 6.
+
+
+ k =2: 4 = 2 × 2 = 2 + 2
+ k =3: 6 = 1 × 2 × 3 = 1 + 2 + 3
+ k =4: 8 = 1 × 1 × 2 × 4 = 1 + 1 + 2 + 4
+ k =5: 8 = 1 × 1 × 2 × 2 × 2 = 1 + 1 + 2 + 2 + 2
+ k =6: 12 = 1 × 1 × 1 × 1 × 2 × 6 = 1 + 1 + 1 + 1 + 2 + 6
+
+
+Звідси, для 2 ≤ `k` ≤ 6, мінімальною сумою похідних є 4 + 6 + 8 + 12 = 30; зверніть увагу, що `8` в сумі додається лише раз.
+
+Фактично, як і повним значенням мінімального числа похідних для 2 ≤ `k` ≤ 12 є $\\{4, 6, 8, 12, 15, 16\\}$, а сумою є `61`.
+
+Яка сума мінімальних похідних чисел для 2 ≤ `k` ≤ `limit`?
+
+# --hints--
+
+`productSumNumbers(6)` має вивести число.
+
+```js
+assert(typeof productSumNumbers(6) === 'number');
+```
+
+`productSumNumbers(6)` має видати `30`.
+
+```js
+assert.strictEqual(productSumNumbers(6), 30);
+```
+
+`productSumNumbers(12)` має видати `61`.
+
+```js
+assert.strictEqual(productSumNumbers(12), 61);
+```
+
+`productSumNumbers(300)` має видати `12686`.
+
+```js
+assert.strictEqual(productSumNumbers(300), 12686);
+```
+
+`productSumNumbers(6000)` має видати `2125990`.
+
+```js
+assert.strictEqual(productSumNumbers(6000), 2125990);
+```
+
+`productSumNumbers(12000)` має видати `7587457`.
+
+```js
+assert.strictEqual(productSumNumbers(12000), 7587457);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function productSumNumbers(limit) {
+
+ return true;
+}
+
+productSumNumbers(6);
+```
+
+# --solutions--
+
+```js
+function productSumNumbers(limit) {
+ function getProductSums(curProduct, curSum, factorsCount, start) {
+ const k = curProduct - curSum + factorsCount;
+ if (k <= limit) {
+ if (curProduct < minimalProductSums[k]) {
+ minimalProductSums[k] = curProduct;
+ }
+ for (let i = start; i < Math.floor((limit / curProduct) * 2) + 1; i++) {
+ getProductSums(curProduct * i, curSum + i, factorsCount + 1, i);
+ }
+ }
+ }
+
+ const minimalProductSums = new Array(limit + 1).fill(2 * limit);
+ getProductSums(1, 1, 1, 2);
+
+ const uniqueProductSums = [...new Set(minimalProductSums.slice(2))];
+
+ let sum = 0;
+ for (let i = 0; i < uniqueProductSums.length; i++) {
+ sum += uniqueProductSums[i];
+ }
+
+ return sum;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-89-roman-numerals.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-89-roman-numerals.md
new file mode 100644
index 00000000000..1c1ce20c706
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-89-roman-numerals.md
@@ -0,0 +1,117 @@
+---
+id: 5900f3c51000cf542c50fed7
+title: 'Завдання 89: Римські цифри'
+challengeType: 5
+forumTopicId: 302204
+dashedName: problem-89-roman-numerals
+---
+
+# --description--
+
+Аби число, написане римськими цифрами, вважалося дійсним, необхідно дотримуватися основних правил. Попри те, що правила дозволяють виражати деякі числа кількома способами, завжди існує *best* спосіб написання певного числа.
+
+- Цифри повинні бути розташовані в порядку спадання.
+- М, С і Х не можуть бути виражені або перевищені меншими номіналами.
+- D, L, і V можуть з'являтися тільки один раз.
+
+На додаток до трьох правил, наведених вище, якщо використовуються від'ємні числа, необхідно дотримуватися наступних чотирьох правил.
+
+- Тільки I, X та C можуть бути використані як початкова цифра у частині від’ємної пари.
+- I можна розмістити лише перед V та X.
+- X можна розмістити лише перед L та C.
+- C можна розмістити лише перед D та M.
+
+Наприклад, з'ясувалося, що існує принаймні шість способів написання числа шістнадцять:
+
+
+ IIIIIIIIIIIIIIII
+ VIIIIIIIIIII
+ VVIIIIII
+ XIIIIII
+ VVVI
+ XVI
+
+
+Проте, згідно із правилами лише XIIIIII та XVI є дійсними, а останній приклад вважається найбільш ефективним, оскільки він використовує найменшу кількість цифр.
+
+Масив `roman` міститиме числа, написані дійсними, але не обов’язково мінімальними римськими цифрами.
+
+Знайдіть кількість збережених символів, записавши кожен із них у мінімальній формі.
+
+**Примітка:** Можна припустити, що всі римські цифри в масиві містять не більше чотирьох послідовних однакових одиниць.
+
+# --hints--
+
+`romanNumerals(testNumerals1)` має повертатись як число.
+
+```js
+assert(typeof romanNumerals(_testNumerals1) === 'number');
+```
+
+`romanNumerals(testNumerals1)` має повертатись як `19`.
+
+```js
+assert.strictEqual(romanNumerals(_testNumerals1), 19);
+```
+
+`romanNumerals(testNumerals2)` має повертатись як `743`.
+
+```js
+assert.strictEqual(romanNumerals(_testNumerals2), 743);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const _testNumerals1 = [
+ 'XIIIIII', 'XVI', 'MMMCCLXVIIII', 'XXXXVI', 'MMMMXX', 'CCLI', 'CCCCXX', 'MMMMDCXXXXI', 'DCCCCIIII', 'MXVIIII'
+];
+const _testNumerals2 = [
+ 'MMMMDCLXXII','MMDCCCLXXXIII','MMMDLXVIIII','MMMMDXCV','DCCCLXXII','MMCCCVI','MMMCDLXXXVII','MMMMCCXXI','MMMCCXX','MMMMDCCCLXXIII','MMMCCXXXVII','MMCCCLXXXXIX','MDCCCXXIIII','MMCXCVI','CCXCVIII','MMMCCCXXXII','MDCCXXX','MMMDCCCL','MMMMCCLXXXVI','MMDCCCXCVI','MMMDCII','MMMCCXII','MMMMDCCCCI','MMDCCCXCII','MDCXX','CMLXXXVII','MMMXXI','MMMMCCCXIV','MLXXII','MCCLXXVIIII','MMMMCCXXXXI','MMDCCCLXXII','MMMMXXXI','MMMDCCLXXX','MMDCCCLXXIX','MMMMLXXXV','MCXXI','MDCCCXXXVII','MMCCCLXVII','MCDXXXV','CCXXXIII','CMXX','MMMCLXIV','MCCCLXXXVI','DCCCXCVIII','MMMDCCCCXXXIV','CDXVIIII','MMCCXXXV','MDCCCXXXII','MMMMD','MMDCCLXIX','MMMMCCCLXXXXVI','MMDCCXLII','MMMDCCCVIIII','DCCLXXXIIII','MDCCCCXXXII','MMCXXVII','DCCCXXX','CCLXIX','MMMXI','MMMMCMLXXXXVIII','MMMMDLXXXVII','MMMMDCCCLX','MMCCLIV','CMIX','MMDCCCLXXXIIII','CLXXXII','MMCCCCXXXXV','MMMMDLXXXVIIII','MMMDCCCXXI','MMDCCCCLXXVI','MCCCCLXX','MMCDLVIIII','MMMDCCCLIX','MMMMCCCCXIX','MMMDCCCLXXV','XXXI','CDLXXXIII','MMMCXV','MMDCCLXIII','MMDXXX','MMMMCCCLVII','MMMDCI','MMMMCDLXXXIIII','MMMMCCCXVI','CCCLXXXVIII','MMMMCML','MMMMXXIV','MMMCCCCXXX','DCCX','MMMCCLX','MMDXXXIII','CCCLXIII','MMDCCXIII','MMMCCCXLIV','CLXXXXI','CXVI','MMMMCXXXIII','CLXX','DCCCXVIII','MLXVII','DLXXXX','MMDXXI','MMMMDLXXXXVIII','MXXII','LXI','DCCCCXLIII','MMMMDV','MMMMXXXIV','MDCCCLVIII','MMMCCLXXII','MMMMDCCXXXVI','MMMMLXXXIX','MDCCCLXXXI','MMMMDCCCXV','MMMMCCCCXI','MMMMCCCLIII','MDCCCLXXI','MMCCCCXI','MLXV','MMCDLXII','MMMMDXXXXII','MMMMDCCCXL','MMMMCMLVI','CCLXXXIV','MMMDCCLXXXVI','MMCLII','MMMCCCCXV','MMLXXXIII','MMMV','MMMV','DCCLXII','MMDCCCCXVI','MMDCXLVIII','CCLIIII','CCCXXV','MMDCCLXXXVIIII','MMMMDCLXXVIII','MMMMDCCCXCI','MMMMCCCXX','MMCCXLV','MMMDCCCLXIX','MMCCLXIIII','MMMDCCCXLIX','MMMMCCCLXIX','CMLXXXXI','MCMLXXXIX','MMCDLXI','MMDCLXXVIII','MMMMDCCLXI','MCDXXV','DL','CCCLXXII','MXVIIII','MCCCCLXVIII','CIII','MMMDCCLXXIIII','MMMDVIII','MMMMCCCLXXXXVII','MMDXXVII','MMDCCLXXXXV','MMMMCXLVI','MMMDCCLXXXII','MMMDXXXVI','MCXXII','CLI','DCLXXXIX','MMMCLI','MDCLXIII','MMMMDCCXCVII','MMCCCLXXXV','MMMDCXXVIII','MMMCDLX','MMMCMLII','MMMIV','MMMMDCCCLVIII','MMMDLXXXVIII','MCXXIV','MMMMLXXVI','CLXXIX','MMMCCCCXXVIIII','DCCLXXXV','MMMDCCCVI','LI','CLXXXVI','MMMMCCCLXXVI','MCCCLXVI','CCXXXIX','MMDXXXXI','MMDCCCXLI','DCCCLXXXVIII','MMMMDCCCIV','MDCCCCXV','MMCMVI','MMMMCMLXXXXV','MMDCCLVI','MMMMCCXLVIII','DCCCCIIII','MMCCCCIII','MMMDCCLXXXVIIII','MDCCCLXXXXV','DVII','MMMV','DCXXV','MMDCCCXCV','DCVIII','MMCDLXVI','MCXXVIII','MDCCXCVIII','MMDCLX','MMMDCCLXIV','MMCDLXXVII','MMDLXXXIIII','MMMMCCCXXII','MMMDCCCXLIIII','DCCCCLXVII','MMMCLXXXXIII','MCCXV','MMMMDCXI','MMMMDCLXXXXV','MMMCCCLII','MMCMIX','MMDCCXXV','MMDLXXXVI','MMMMDCXXVIIII','DCCCCXXXVIIII','MMCCXXXIIII','MMDCCLXXVIII','MDCCLXVIIII','MMCCLXXXV','MMMMDCCCLXXXVIII','MMCMXCI','MDXLII','MMMMDCCXIV','MMMMLI','DXXXXIII','MMDCCXI','MMMMCCLXXXIII','MMMDCCCLXXIII','MDCLVII','MMCD','MCCCXXVII','MMMMDCCIIII','MMMDCCXLVI','MMMCLXXXVII','MMMCCVIIII','MCCCCLXXIX','DL','DCCCLXXVI','MMDXCI','MMMMDCCCCXXXVI','MMCII','MMMDCCCXXXXV','MMMCDXLV','MMDCXXXXIV','MMD','MDCCCLXXXX','MMDCXLIII','MMCCXXXII','MMDCXXXXVIIII','DCCCLXXI','MDXCVIIII','MMMMCCLXXVIII','MDCLVIIII','MMMCCCLXXXIX','MDCLXXXV','MDLVIII','MMMMCCVII','MMMMDCXIV','MMMCCCLXIIII','MMIIII','MMMMCCCLXXIII','CCIII','MMMCCLV','MMMDXIII','MMMCCCXC','MMMDCCCXXI','MMMMCCCCXXXII','CCCLVI','MMMCCCLXXXVI','MXVIIII','MMMCCCCXIIII','CLXVII','MMMCCLXX','CCCCLXIV','MMXXXXII','MMMMCCLXXXX','MXL','CCXVI','CCCCLVIIII','MMCCCII','MCCCLVIII','MMMMCCCX','MCDLXXXXIV','MDCCCXIII','MMDCCCXL','MMMMCCCXXIII','DXXXIV','CVI','MMMMDCLXXX','DCCCVII','MMCMLXIIII','MMMDCCCXXXIII','DCCC','MDIII','MMCCCLXVI','MMMCCCCLXXI','MMDCCCCXVIII','CCXXXVII','CCCXXV','MDCCCXII','MMMCMV','MMMMCMXV','MMMMDCXCI','DXXI','MMCCXLVIIII','MMMMCMLII','MDLXXX','MMDCLXVI','CXXI','MMMDCCCLIIII','MMMCXXI','MCCIII','MMDCXXXXI','CCXCII','MMMMDXXXV','MMMCCCLXV','MMMMDLXV','MMMCCCCXXXII','MMMCCCVIII','DCCCCLXXXXII','MMCLXIV','MMMMCXI','MLXXXXVII','MMMCDXXXVIII','MDXXII','MLV','MMMMDLXVI','MMMCXII','XXXIII','MMMMDCCCXXVI','MMMLXVIIII','MMMLX','MMMCDLXVII','MDCCCLVII','MMCXXXVII','MDCCCCXXX','MMDCCCLXIII','MMMMDCXLIX','MMMMCMXLVIII','DCCCLXXVIIII','MDCCCLIII','MMMCMLXI','MMMMCCLXI','MMDCCCLIII','MMMDCCCVI','MMDXXXXIX','MMCLXXXXV','MMDXXX','MMMXIII','DCLXXIX','DCCLXII','MMMMDCCLXVIII','MDCCXXXXIII','CCXXXII','MMMMDCXXV','MMMCCCXXVIII','MDCVIII','MMMCLXXXXIIII','CLXXXI','MDCCCCXXXIII','MMMMDCXXX','MMMDCXXIV','MMMCCXXXVII','MCCCXXXXIIII','CXVIII','MMDCCCCIV','MMMMCDLXXV','MMMDLXIV','MDXCIII','MCCLXXXI','MMMDCCCXXIV','MCXLIII','MMMDCCCI','MCCLXXX','CCXV','MMDCCLXXI','MMDLXXXIII','MMMMDCXVII','MMMCMLXV','MCLXVIII','MMMMCCLXXVI','MMMDCCLXVIIII','MMMMDCCCIX','DLXXXXIX','DCCCXXII','MMMMIII','MMMMCCCLXXVI','DCCCXCIII','DXXXI','MXXXIIII','CCXII','MMMDCCLXXXIIII','MMMCXX','MMMCMXXVII','DCCCXXXX','MMCDXXXVIIII','MMMMDCCXVIII','LV','MMMDCCCCVI','MCCCII','MMCMLXVIIII','MDCCXI','MMMMDLXVII','MMCCCCLXI','MMDCCV','MMMCCCXXXIIII','MMMMDI','MMMDCCCXCV','MMDCCLXXXXI','MMMDXXVI','MMMDCCCLVI','MMDCXXX','MCCCVII','MMMMCCCLXII','MMMMXXV','MMCMXXV','MMLVI','MMDXXX','MMMMCVII','MDC','MCCIII','MMMMDCC','MMCCLXXV','MMDCCCXXXXVI','MMMMCCCLXV','CDXIIII','MLXIIII','CCV','MMMCMXXXI','CCCCLXVI','MDXXXII','MMMMCCCLVIII','MMV','MMMCLII','MCMLI','MMDCCXX','MMMMCCCCXXXVI','MCCLXXXI','MMMCMVI','DCCXXX','MMMMCCCLXV','DCCCXI','MMMMDCCCXIV','CCCXXI','MMDLXXV','CCCCLXXXX','MCCCLXXXXII','MMDCIX','DCCXLIIII','DXIV','MMMMCLII','CDLXI','MMMCXXVII','MMMMDCCCCLXIII','MMMDCLIIII','MCCCCXXXXII','MMCCCLX','CCCCLIII','MDCCLXXVI','MCMXXIII','MMMMDLXXVIII','MMDCCCCLX','MMMCCCLXXXX','MMMCDXXVI','MMMDLVIII','CCCLXI','MMMMDCXXII','MMDCCCXXI','MMDCCXIII','MMMMCLXXXVI','MDCCCCXXVI','MDV','MMDCCCCLXXVI','MMMMCCXXXVII','MMMDCCLXXVIIII','MMMCCCCLXVII','DCCXLI','MMCLXXXVIII','MCCXXXVI','MMDCXLVIII','MMMMCXXXII','MMMMDCCLXVI','MMMMCMLI','MMMMCLXV','MMMMDCCCXCIV','MCCLXXVII','LXXVIIII','DCCLII','MMMCCCXCVI','MMMCLV','MMDCCCXXXXVIII','DCCCXV','MXC','MMDCCLXXXXVII','MMMMCML','MMDCCCLXXVIII','DXXI','MCCCXLI','DCLXXXXI','MMCCCLXXXXVIII','MDCCCCLXXVIII','MMMMDXXV','MMMDCXXXVI','MMMCMXCVII','MMXVIIII','MMMDCCLXXIV','MMMCXXV','DXXXVIII','MMMMCLXVI','MDXII','MMCCCLXX','CCLXXI','DXIV','MMMCLIII','DLII','MMMCCCXLIX','MMCCCCXXVI','MMDCXLIII','MXXXXII','CCCLXXXV','MDCLXXVI','MDCXII','MMMCCCLXXXIII','MMDCCCCLXXXII','MMMMCCCLXXXV','MMDCXXI','DCCCXXX','MMMDCCCCLII','MMMDCCXXII','MMMMCDXCVIII','MMMCCLXVIIII','MMXXV','MMMMCDXIX','MMMMCCCX','MMMCCCCLXVI','MMMMDCLXXVIIII','MMMMDCXXXXIV','MMMCMXII','MMMMXXXIII','MMMMDLXXXII','DCCCLIV','MDXVIIII','MMMCLXXXXV','CCCCXX','MMDIX','MMCMLXXXVIII','DCCXLIII','DCCLX','D','MCCCVII','MMMMCCCLXXXIII','MDCCCLXXIIII','MMMDCCCCLXXXVII','MMMMCCCVII','MMMDCCLXXXXVI','CDXXXIV','MCCLXVIII','MMMMDLX','MMMMDXII','MMMMCCCCLIIII','MCMLXXXXIII','MMMMDCCCIII','MMDCLXXXIII','MDCCCXXXXIV','XXXXVII','MMMDCCCXXXII','MMMDCCCXLII','MCXXXV','MDCXXVIIII','MMMCXXXXIIII','MMMMCDXVII','MMMDXXIII','MMMMCCCCLXI','DCLXXXXVIIII','LXXXXI','CXXXIII','MCDX','MCCLVII','MDCXXXXII','MMMCXXIV','MMMMLXXXX','MMDCCCCXLV','MLXXX','MMDCCCCLX','MCDLIII','MMMCCCLXVII','MMMMCCCLXXIV','MMMDCVIII','DCCCCXXIII','MMXCI','MMDCCIV','MMMMDCCCXXXIV','CCCLXXI','MCCLXXXII','MCMIII','CCXXXI','DCCXXXVIII','MMMMDCCXLVIIII','MMMMCMXXXV','DCCCLXXV','DCCXCI','MMMMDVII','MMMMDCCCLXVIIII','CCCXCV','MMMMDCCXX','MCCCCII','MMMCCCXC','MMMCCCII','MMDCCLXXVII','MMDCLIIII','CCXLIII','MMMDCXVIII','MMMCCCIX','MCXV','MMCCXXV','MLXXIIII','MDCCXXVI','MMMCCCXX','MMDLXX','MMCCCCVI','MMDCCXX','MMMMDCCCCXCV','MDCCCXXXII','MMMMDCCCCXXXX','XCIV','MMCCCCLX','MMXVII','MLXXI','MMMDXXVIII','MDCCCCII','MMMCMLVII','MMCLXXXXVIII','MDCCCCLV','MCCCCLXXIIII','MCCCLII','MCDXLVI','MMMMDXVIII','DCCLXXXIX','MMMDCCLXIV','MDCCCCXLIII','CLXXXXV','MMMMCCXXXVI','MMMDCCCXXI','MMMMCDLXXVII','MCDLIII','MMCCXLVI','DCCCLV','MCDLXX','DCLXXVIII','MMDCXXXIX','MMMMDCLX','MMDCCLI','MMCXXXV','MMMCCXII','MMMMCMLXII','MMMMCCV','MCCCCLXIX','MMMMCCIII','CLXVII','MCCCLXXXXIIII','MMMMDCVIII','MMDCCCLXI','MMLXXIX','CMLXIX','MMDCCCXLVIIII','DCLXII','MMMCCCXLVII','MDCCCXXXV','MMMMDCCXCVI','DCXXX','XXVI','MMLXIX','MMCXI','DCXXXVII','MMMMCCCXXXXVIII','MMMMDCLXI','MMMMDCLXXIIII','MMMMVIII','MMMMDCCCLXII','MDCXCI','MMCCCXXIIII','CCCCXXXXV','MMDCCCXXI','MCVI','MMDCCLXVIII','MMMMCXL','MLXVIII','CMXXVII','CCCLV','MDCCLXXXIX','MMMCCCCLXV','MMDCCLXII','MDLXVI','MMMCCCXVIII','MMMMCCLXXXI','MMCXXVII','MMDCCCLXVIII','MMMCXCII','MMMMDCLVIII','MMMMDCCCXXXXII','MMDCCCCLXXXXVI','MDCCXL','MDCCLVII','MMMMDCCCLXXXVI','DCCXXXIII','MMMMDCCCCLXXXV','MMCCXXXXVIII','MMMCCLXXVIII','MMMDCLXXVIII','DCCCI','MMMMLXXXXVIIII','MMMCCCCLXXII','MMCLXXXVII','CCLXVI','MCDXLIII','MMCXXVIII','MDXIV','CCCXCVIII','CLXXVIII','MMCXXXXVIIII','MMMDCLXXXIV','CMLVIII','MCDLIX','MMMMDCCCXXXII','MMMMDCXXXIIII','MDCXXI','MMMDCXLV','MCLXXVIII','MCDXXII','IV','MCDLXXXXIII','MMMMDCCLXV','CCLI','MMMMDCCCXXXVIII','DCLXII','MCCCLXVII','MMMMDCCCXXXVI','MMDCCXLI','MLXI','MMMCDLXVIII','MCCCCXCIII','XXXIII','MMMDCLXIII','MMMMDCL','DCCCXXXXIIII','MMDLVII','DXXXVII','MCCCCXXIIII','MCVII','MMMMDCCXL','MMMMCXXXXIIII','MCCCCXXIV','MMCLXVIII','MMXCIII','MDCCLXXX','MCCCLIIII','MMDCLXXI','MXI','MCMLIV','MMMCCIIII','DCCLXXXVIIII','MDCLIV','MMMDCXIX','CMLXXXI','DCCLXXXVII','XXV','MMMXXXVI','MDVIIII','CLXIII','MMMCDLVIIII','MMCCCCVII','MMMLXX','MXXXXII','MMMMCCCLXVIII','MMDCCCXXVIII','MMMMDCXXXXI','MMMMDCCCXXXXV','MMMXV','MMMMCCXVIIII','MMDCCXIIII','MMMXXVII','MDCCLVIIII','MMCXXIIII','MCCCLXXIV','DCLVIII','MMMLVII','MMMCXLV','MMXCVII','MMMCCCLXXXVII','MMMMCCXXII','DXII','MMMDLV','MCCCLXXVIII','MMMCLIIII','MMMMCLXXXX','MMMCLXXXIIII','MDCXXIII','MMMMCCXVI','MMMMDLXXXIII','MMMDXXXXIII','MMMMCCCCLV','MMMDLXXXI','MMMCCLXXVI','MMMMXX','MMMMDLVI','MCCCCLXXX','MMMXXII','MMXXII','MMDCCCCXXXI','MMMDXXV','MMMDCLXXXVIIII','MMMDLXXXXVII','MDLXIIII','CMXC','MMMXXXVIII','MDLXXXVIII','MCCCLXXVI','MMCDLIX','MMDCCCXVIII','MDCCCXXXXVI','MMMMCMIV','MMMMDCIIII','MMCCXXXV','XXXXVI','MMMMCCXVII','MMCCXXIV','MCMLVIIII','MLXXXIX','MMMMLXXXIX','CLXXXXIX','MMMDCCCCLVIII','MMMMCCLXXIII','MCCCC','DCCCLIX','MMMCCCLXXXII','MMMCCLXVIIII','MCLXXXV','CDLXXXVII','DCVI','MMX','MMCCXIII','MMMMDCXX','MMMMXXVIII','DCCCLXII','MMMMCCCXLIII','MMMMCLXV','DXCI','MMMMCLXXX','MMMDCCXXXXI','MMMMXXXXVI','DCLX','MMMCCCXI','MCCLXXX','MMCDLXXII','DCCLXXI','MMMCCCXXXVI','MCCCCLXXXVIIII','CDLVIII','DCCLVI','MMMMDCXXXVIII','MMCCCLXXXIII','MMMMDCCLXXV','MMMXXXVI','CCCLXXXXIX','CV','CCCCXIII','CCCCXVI','MDCCCLXXXIIII','MMDCCLXXXII','MMMMCCCCLXXXI','MXXV','MMCCCLXXVIIII','MMMCCXII','MMMMCCXXXIII','MMCCCLXXXVI','MMMDCCCLVIIII','MCCXXXVII','MDCLXXV','XXXV','MMDLI','MMMCCXXX','MMMMCXXXXV','CCCCLIX','MMMMDCCCLXXIII','MMCCCXVII','DCCCXVI','MMMCCCXXXXV','MDCCCCXCV','CLXXXI','MMMMDCCLXX','MMMDCCCIII','MMCLXXVII','MMMDCCXXIX','MMDCCCXCIIII','MMMCDXXIIII','MMMMXXVIII','MMMMDCCCCLXVIII','MDCCCXX','MMMMCDXXI','MMMMDLXXXIX','CCXVI','MDVIII','MMCCLXXI','MMMDCCCLXXI','MMMCCCLXXVI','MMCCLXI','MMMMDCCCXXXIV','DLXXXVI','MMMMDXXXII','MMMXXIIII','MMMMCDIV','MMMMCCCXLVIII','MMMMCXXXVIII','MMMCCCLXVI','MDCCXVIII','MMCXX','CCCLIX','MMMMDCCLXXII','MDCCCLXXV','MMMMDCCCXXIV','DCCCXXXXVIII','MMMDCCCCXXXVIIII','MMMMCCXXXV','MDCLXXXIII','MMCCLXXXIV','MCLXXXXIIII','DXXXXIII','MCCCXXXXVIII','MMCLXXIX','MMMMCCLXIV','MXXII','MMMCXIX','MDCXXXVII','MMDCCVI','MCLXXXXVIII','MMMCXVI','MCCCLX','MMMCDX','CCLXVIIII','MMMCCLX','MCXXVIII','LXXXII','MCCCCLXXXI','MMMI','MMMCCCLXIV','MMMCCCXXVIIII','CXXXVIII','MMCCCXX','MMMCCXXVIIII','MCCLXVI','MMMCCCCXXXXVI','MMDCCXCIX','MCMLXXI','MMCCLXVIII','CDLXXXXIII','MMMMDCCXXII','MMMMDCCLXXXVII','MMMDCCLIV','MMCCLXIII','MDXXXVII','DCCXXXIIII','MCII','MMMDCCCLXXI','MMMLXXIII','MDCCCLIII','MMXXXVIII','MDCCXVIIII','MDCCCCXXXVII','MMCCCXVI','MCMXXII','MMMCCCLVIII','MMMMDCCCXX','MCXXIII','MMMDLXI','MMMMDXXII','MDCCCX','MMDXCVIIII','MMMDCCCCVIII','MMMMDCCCCXXXXVI','MMDCCCXXXV','MMCXCIV','MCMLXXXXIII','MMMCCCLXXVI','MMMMDCLXXXV','CMLXIX','DCXCII','MMXXVIII','MMMMCCCXXX','XXXXVIIII'
+];
+```
+
+## --seed-contents--
+
+```js
+function romanNumerals(roman) {
+
+ return true;
+}
+
+// Only change code above this line
+
+const testNumerals1 = [
+ 'XIIIIII', 'XVI', 'MMMCCLXVIIII', 'XXXXVI', 'MMMMXX', 'CCLI', 'CCCCXX', 'MMMMDCXXXXI', 'DCCCCIIII', 'MXVIIII'
+];
+
+romanNumerals(testNumerals1);
+```
+
+# --solutions--
+
+```js
+function romanNumerals(roman) {
+ const numerals = [...roman];
+ const replaces = [
+ ['VIIII', 'IX'],
+ ['IIII', 'IV'],
+ ['LXXXX', 'XC'],
+ ['XXXX', 'XL'],
+ ['DCCCC', 'CM'],
+ ['CCCC', 'CD']
+ ];
+ let savedChars = 0;
+ for (let i = 0; i < numerals.length; i++) {
+ const charsBefore = numerals[i].length;
+ for (let j = 0; j < replaces.length; j++) {
+ numerals[i] = numerals[i].replace(...replaces[j]);
+ }
+ const charsAfter = numerals[i].length;
+ savedChars += charsBefore - charsAfter;
+ }
+ return savedChars;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-9-special-pythagorean-triplet.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-9-special-pythagorean-triplet.md
new file mode 100644
index 00000000000..f571dbbdd08
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-9-special-pythagorean-triplet.md
@@ -0,0 +1,74 @@
+---
+id: 5900f3761000cf542c50fe88
+title: 'Завдання 9: Особлива Піфагорова трійка'
+challengeType: 5
+forumTopicId: 302205
+dashedName: problem-9-special-pythagorean-triplet
+---
+
+# --description--
+
+Піфагорова трійка - це набір з трьох натуральних чисел `a` < `b` < `c`, для яких
+
+a 2 + b 2 = c 2
+
+Наприклад, 32 + 42 = 9 + 16 = 25 = 52 .
+
+Існує лише одна Піфагорова трійка, для якої `a` + `b` + `c` = 1000. Знайдіть такий добуток `abc`, щоб `a` + `b` + `c` = `n`.
+
+# --hints--
+
+`specialPythagoreanTriplet(24)` має повернути число.
+
+```js
+assert(typeof specialPythagoreanTriplet(24) === 'number');
+```
+
+`specialPythagoreanTriplet(24)` має повернути число 480.
+
+```js
+assert.strictEqual(specialPythagoreanTriplet(24), 480);
+```
+
+`specialPythagoreanTriplet(120)` має повернути числа 49920, 55080 або число 60000
+
+```js
+assert([49920, 55080, 60000].includes(specialPythagoreanTriplet(120)));
+```
+
+`specialPythagoreanTriplet(1000)` має повернути число 31875000.
+
+```js
+assert.strictEqual(specialPythagoreanTriplet(1000), 31875000);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function specialPythagoreanTriplet(n) {
+ let sumOfabc = n;
+
+ return true;
+}
+
+specialPythagoreanTriplet(1000);
+```
+
+# --solutions--
+
+```js
+const specialPythagoreanTriplet = (n)=>{
+ let sumOfabc = n;
+ let a,b,c;
+ for(a = 1; a<=sumOfabc/3; a++){
+ for(b = a+1; b<=sumOfabc/2; b++){
+ c = Math.sqrt(a*a+b*b);
+ if((a+b+c) == sumOfabc){
+ return a*b*c;
+ }
+ }
+ }
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-90-cube-digit-pairs.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-90-cube-digit-pairs.md
new file mode 100644
index 00000000000..472e33bf121
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-90-cube-digit-pairs.md
@@ -0,0 +1,65 @@
+---
+id: 5900f3c61000cf542c50fed9
+title: 'Завдання 90: Пари цифр на кубиках'
+challengeType: 5
+forumTopicId: 302207
+dashedName: problem-90-cube-digit-pairs
+---
+
+# --description--
+
+На кожній із шести граней куба написана інша цифра (від 0 до 9); те саме зроблено і з другим кубом. Розмістивши два кубики поруч у різних положеннях, ми можемо сформувати різноманітні двозначні числа.
+
+Наприклад, можна сформувати квадратне число 64:
+
+
+
+Взагалі, ретельно вибираючи цифри на обох кубиках, можна відобразити всі квадратні числа нижче сотні: 01, 04, 09, 16, 25, 36, 49, 64 та 81.
+
+Наприклад, можна вибрати {0, 5, 6, 7, 8, 9} на одному кубі та {1, 2, 3, 4, 8, 9} на іншому кубі.
+
+Проте для цього потрібно допустити, щоб 6 або 9 були перевернутими так, щоб варіанти типу {0, 5, 6, 7, 8, 9} і {1, 2, 3, 4, 6, 7} дозволяли відображати всі дев'ять квадратних чисел; в іншому випадку було б неможливо отримати 09.
+
+У визначенні чіткого варіанту важливі цифри на кожному кубі, а не їхній порядок.
+
+
+ {1, 2, 3, 4, 5, 6} дорівнює {3, 6, 4, 1, 2, 5}
+ {1, 2, 3, 4, 5, 6} відрізняється від {1, 2, 3, 4, 5, 9}
+
+
+Але оскільки ми допускаємо, щоб 6 та 9 були оберненими, то два різні набори в попередньому прикладі відображають розширений набір {1, 2, 3, 4, 5, 6, 9} для формування 2-значних чисел.
+
+Скільки різних варіантів цифр на двох кубах уможливлюють відображення всіх квадратних чисел?
+
+# --hints--
+
+`cubeDigitPairs()` має повернути число.
+
+```js
+assert(typeof cubeDigitPairs() === 'number');
+```
+
+`cubeDigitPairs()` має повернути 1217.
+
+```js
+assert.strictEqual(cubeDigitPairs(), 1217);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function cubeDigitPairs() {
+
+ return true;
+}
+
+cubeDigitPairs();
+```
+
+# --solutions--
+
+```js
+// solution required
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-91-right-triangles-with-integer-coordinates.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-91-right-triangles-with-integer-coordinates.md
new file mode 100644
index 00000000000..9a1bf364ff8
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-91-right-triangles-with-integer-coordinates.md
@@ -0,0 +1,119 @@
+---
+id: 5900f3c71000cf542c50feda
+title: 'Завдання 91: Прямокутні трикутники з цілочисельними координатами'
+challengeType: 5
+forumTopicId: 302208
+dashedName: problem-91-right-triangles-with-integer-coordinates
+---
+
+# --description--
+
+Точки ${P}(x_1, y_1)$ і ${Q}(x_2, y_2)$ нанесені на цілочисельні координати та приєднані до координат ${O}(0, 0)$ для формування ${\Delta}OPQ$.
+
+
+
+Існує рівно чотирнадцять трикутників, що містять прямий кут, який можна утворити, коли кожна координата знаходиться між 0 та 2 включно; тобто, $0 ≤ x_1, y_1, x_2, y_2 ≤ 2$.
+
+
+
+Враховуючи, що $0 ≤ x_1, y_1, x_2, y_2 ≤ limit$, скільки прямокутних трикутників можна утворити?
+
+# --hints--
+
+`rightTrianglesIntCoords(2)` має вивести число.
+
+```js
+assert(typeof rightTrianglesIntCoords(2) === 'number');
+```
+
+`rightTrianglesIntCoords(2)` має вивести `14`.
+
+```js
+assert.strictEqual(rightTrianglesIntCoords(2), 14);
+```
+
+`rightTrianglesIntCoords(10)` має вивести `448`.
+
+```js
+assert.strictEqual(rightTrianglesIntCoords(10), 448);
+```
+
+`rightTrianglesIntCoords(25)` має вивести `3207`.
+
+```js
+assert.strictEqual(rightTrianglesIntCoords(25), 3207);
+```
+
+`rightTrianglesIntCoords(50)` має вивести `14234`.
+
+```js
+assert.strictEqual(rightTrianglesIntCoords(50), 14234);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function rightTrianglesIntCoords(limit) {
+
+ return true;
+}
+
+rightTrianglesIntCoords(2);
+```
+
+# --solutions--
+
+```js
+function rightTrianglesIntCoords(limit) {
+ function isRightTriangle(points) {
+ for (let i = 0; i < points.length; i++) {
+ const pointA = points[i];
+ const pointB = points[(i + 1) % 3];
+ const pointC = points[(i + 2) % 3];
+ const vectorAB = [pointB[0] - pointA[0], pointB[1] - pointA[1]];
+ const vectorAC = [pointC[0] - pointA[0], pointC[1] - pointA[1]];
+
+ if (isRightAngleBetween(vectorAB, vectorAC)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function isRightAngleBetween(vector1, vector2) {
+ return vector1[0] * vector2[0] + vector1[1] * vector2[1] === 0;
+ }
+
+ function getSetKey(points) {
+ return (
+ '0.0,' +
+ points
+ .sort((a, b) => a[0] - b[0])
+ .map(point => point.join('.'))
+ .join(',')
+ );
+ }
+
+ const pointO = [0, 0];
+ const rightTriangles = new Set();
+ for (let x1 = 1; x1 <= limit; x1++) {
+ for (let y1 = 0; y1 <= limit; y1++) {
+ const pointP = [x1, y1];
+ for (let x2 = 0; x2 <= limit; x2++) {
+ for (let y2 = 1; y2 <= limit; y2++) {
+ const pointQ = [x2, y2];
+ if (pointP[0] === pointQ[0] && pointP[1] === pointQ[1]) {
+ continue;
+ }
+ if (isRightTriangle([pointO, pointP, pointQ])) {
+ rightTriangles.add(getSetKey([pointP, pointQ]));
+ }
+ }
+ }
+ }
+ }
+ return rightTriangles.size;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-92-square-digit-chains.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-92-square-digit-chains.md
new file mode 100644
index 00000000000..b5b22665528
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-92-square-digit-chains.md
@@ -0,0 +1,152 @@
+---
+id: 5900f3c81000cf542c50fedb
+title: 'Завдання 92: Послідовності квадратів цифр'
+challengeType: 5
+forumTopicId: 302209
+dashedName: problem-92-square-digit-chains
+---
+
+# --description--
+
+Послідовність чисел створюється шляхом додавання квадратів цифр попереднього числа до тих пір, поки не вийде число, яке вже зустрічалося раніше.
+
+Наприклад,
+
+$$\begin{align} & 44 → 32 → 13 → 10 → \boldsymbol{1} → \boldsymbol{1}\\\\ & 85 → \boldsymbol{89} → 145 → 42 → 20 → 4 → 16 → 37 → 58 → \boldsymbol{89}\\\\ \end{align}$$
+
+Таким чином, будь-яка послідовність, що призводить до отримання 1 або 89, замкнеться в нескінченний цикл. Найдивовижніше, що БУДЬ-ЯКЕ початкове число рано чи пізно дасть 1 або 89.
+
+Скільки початкових чисел `limit` десяти мільйонів приведуть до отримання 89?
+
+# --hints--
+
+`squareDigitChains(100)` повинен повертатися як число.
+
+```js
+assert(typeof squareDigitChains(100) === 'number');
+```
+
+`squareDigitChains(100)` повинен повертатися як `80`.
+
+```js
+assert.strictEqual(squareDigitChains(100), 80);
+```
+
+`squareDigitChains(1000)` має повертатися як `857`.
+
+```js
+assert.strictEqual(squareDigitChains(1000), 857);
+```
+
+`squareDigitChains(100000)` повинен повертатися як `85623`.
+
+```js
+assert.strictEqual(squareDigitChains(100000), 85623);
+```
+
+`squareDigitChains(10000000)` повинен повертатися як `8581146`.
+
+```js
+assert.strictEqual(squareDigitChains(10000000), 8581146);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function squareDigitChains(limit) {
+
+ return true;
+}
+
+squareDigitChains(100);
+```
+
+# --solutions--
+
+```js
+function squareDigitChains(limit) {
+ // Based on https://www.xarg.org/puzzle/project-euler/problem-92/
+ function getCombinations(neededDigits, curDigits) {
+ if (neededDigits === curDigits.length) {
+ return [curDigits];
+ }
+ const combinations = [];
+ const lastDigit = curDigits.length !== 0 ? curDigits[0] : 9;
+ for (let i = 0; i <= lastDigit; i++) {
+ const results = getCombinations(neededDigits, [i].concat(curDigits));
+ combinations.push(...results);
+ }
+ return combinations;
+ }
+
+ function getPossibleSums(limit) {
+ const digitsCount = getDigits(limit).length - 1;
+ const possibleSquaredSums = [false];
+ for (let i = 1; i <= 81 * digitsCount; i++) {
+ let curVal = i;
+ while (curVal !== 1 && curVal !== 89) {
+ curVal = addSquaredDigits(curVal);
+ }
+ possibleSquaredSums[i] = curVal === 89;
+ }
+ return possibleSquaredSums;
+ }
+
+ function addSquaredDigits(num) {
+ const digits = getDigits(num);
+ let result = 0;
+ for (let i = 0; i < digits.length; i++) {
+ result += digits[i] ** 2;
+ }
+ return result;
+ }
+
+ function getDigits(number) {
+ const digits = [];
+ while (number > 0) {
+ digits.push(number % 10);
+ number = Math.floor(number / 10);
+ }
+ return digits;
+ }
+
+ function getFactorials(number) {
+ const factorials = [1];
+ for (let i = 1; i < number; i++) {
+ factorials[i] = factorials[i - 1] * i;
+ }
+ return factorials;
+ }
+
+ const neededDigits = getDigits(limit).length - 1;
+ const combinations = getCombinations(neededDigits, []);
+ const possibleSquaredDigitsSums = getPossibleSums(limit);
+ const factorials = getFactorials(neededDigits + 1);
+
+ let endingWith89 = 0;
+
+ for (let i = 0; i < combinations.length; i++) {
+ let counts = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+ let digits = combinations[i];
+ let curSum = 0;
+ for (let j = 0; j < digits.length; j++) {
+ const curDigit = digits[j];
+ curSum += curDigit ** 2;
+ counts[curDigit]++;
+ }
+
+ if (possibleSquaredDigitsSums[curSum]) {
+ let denominator = 1;
+ for (let j = 0; j < counts.length; j++) {
+ denominator = denominator * factorials[counts[j]];
+ }
+ endingWith89 += Math.floor(
+ factorials[factorials.length - 1] / denominator
+ );
+ }
+ }
+ return endingWith89;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-93-arithmetic-expressions.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-93-arithmetic-expressions.md
new file mode 100644
index 00000000000..3d036cd3378
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-93-arithmetic-expressions.md
@@ -0,0 +1,59 @@
+---
+id: 5900f3ca1000cf542c50fedc
+title: 'Завдання 93: Арифметичні вирази'
+challengeType: 5
+forumTopicId: 302210
+dashedName: problem-93-arithmetic-expressions
+---
+
+# --description--
+
+Використовуючи кожну цифру з множини, {1, 2, 3, 4}, тільки один раз, і використовуючи чотири арифметичні операції (+, −, \*, /) і квадратні дужки/круглі дужки, можна сформувати різні цілі додатні числа.
+
+Наприклад,
+
+
+ 8 = (4 * (1 + 3)) / 2
+ 14 = 4 * (3 + 1 / 2)
+ 19 = 4 * (2 + 3) − 1
+ 36 = 3 * 4 * (2 + 1)
+
+
+Зверніть увагу, що злиття цифр, таких як 12 + 34, не допускаються.
+
+Використовуючи множину, {1, 2, 3, 4}, можна отримати тридцять одне різне цільове число, з яких 36 є максимальним, і кожне з чисел від 1 до 28 можна отримати, перш ніж зустріти перше невиражене число.
+
+Знайдіть множину чотирьох різних цифр, `a` < `b` < `c` < `d`, для якої найдовший набір послідовних цілих чисел у порядку від 1 до `n`, який можна отримати, отримуючи вашу відповідь як рядок: `abcd`.
+
+# --hints--
+
+`arithmeticExpressions()` має повернути number.
+
+```js
+assert(typeof arithmeticExpressions() === 'number');
+```
+
+`arithmeticExpressions()` має повернути 1258.
+
+```js
+assert.strictEqual(arithmeticExpressions(), 1258);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function arithmeticExpressions() {
+
+ return true;
+}
+
+arithmeticExpressions();
+```
+
+# --solutions--
+
+```js
+// solution required
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-94-almost-equilateral-triangles.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-94-almost-equilateral-triangles.md
new file mode 100644
index 00000000000..912ffa70147
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-94-almost-equilateral-triangles.md
@@ -0,0 +1,84 @@
+---
+id: 5900f3ca1000cf542c50fedd
+title: 'Завдання 94: Майже рівносторонні трикутники'
+challengeType: 5
+forumTopicId: 302211
+dashedName: problem-94-almost-equilateral-triangles
+---
+
+# --description--
+
+Відомо, що не існує рівностороннього трикутника з цілочисельними сторонами і площею. Однак майже рівносторонній трикутник 5-5-6 має площу 12 квадратних одиниць.
+
+Визначимо майже рівносторонній трикутник як трикутник, у якого дві сторони рівні, а третя відрізняється не більше ніж на одну одиницю.
+
+Знайдіть суму периметрів усіх майже рівносторонніх трикутників з цілочисельними сторонами і площею, периметри яких не перевищують `limit`.
+
+# --hints--
+
+`almostEquilateralTriangles(50)` має повернути число.
+
+```js
+assert(typeof almostEquilateralTriangles(50) === 'number');
+```
+
+`almostEquilateralTriangles(50)` має повернути `66`.
+
+```js
+assert.strictEqual(almostEquilateralTriangles(50), 66);
+```
+
+`almostEquilateralTriangles(10000)` має повернути `3688`.
+
+```js
+assert.strictEqual(almostEquilateralTriangles(10000), 3688);
+```
+
+`almostEquilateralTriangles(10000000)` має повернути `9973078`.
+
+```js
+assert.strictEqual(almostEquilateralTriangles(10000000), 9973078);
+```
+
+`almostEquilateralTriangles(1000000000)` має повернути `518408346`.
+
+```js
+assert.strictEqual(almostEquilateralTriangles(1000000000), 518408346);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function almostEquilateralTriangles(limit) {
+
+ return true;
+}
+
+almostEquilateralTriangles(50);
+```
+
+# --solutions--
+
+```js
+function almostEquilateralTriangles(limit) {
+ // Based on https://blog.dreamshire.com/project-euler-94-solution/
+ let perimetersSum = 0;
+
+ let sidesAB = 1;
+ let sideC = 1;
+ let perimeter = 0;
+ let perimeterOffset = 1;
+
+ while (perimeter <= limit) {
+ [sidesAB, sideC] = [4 * sidesAB - sideC + 2 * perimeterOffset, sidesAB];
+ perimeterOffset = -perimeterOffset;
+
+ perimetersSum += perimeter;
+ perimeter = 3 * sidesAB - perimeterOffset;
+ }
+
+ return perimetersSum;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-95-amicable-chains.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-95-amicable-chains.md
new file mode 100644
index 00000000000..77825d07104
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-95-amicable-chains.md
@@ -0,0 +1,124 @@
+---
+id: 5900f3cc1000cf542c50fede
+title: 'Задача 95: Ланцюжки дружніх чисел'
+challengeType: 5
+forumTopicId: 302212
+dashedName: problem-95-amicable-chains
+---
+
+# --description--
+
+Власними дільниками числа є всі його дільники, окрім самого числа. Наприклад, власними дільниками числа 28 є 1, 2, 4, 7 і 14. Оскільки сума цих дільників дорівнює 28, ми називаємо його ідеальним числом.
+
+Цікаво, що сума власних дільників числа 220 дорівнює 284, а сума власних дільників числа 284 дорівнює 220, утворюючи ланцюжок з двох чисел. Тому числа 220 і 284 називаються парою дружніх чисел.
+
+Можливо, менше відомими є ланцюжки більшої довжини. Наприклад, починаючи з числа 12496, формується ланцюжок з п'яти чисел:
+
+$$ 12496 → 14288 → 15472 → 14536 → 14264 \\,(→ 12496 → \cdots) $$
+
+Оскільки ланцюжок закінчується тим самим числом, з якого починався, його називають ланцюжком дружніх чисел.
+
+Знайдіть найменший член найдовшого ланцюжка дружніх чисел, жоден елемент якої не перевищує `limit`.
+
+# --hints--
+
+`amicableChains(300)` має повернути число.
+
+```js
+assert(typeof amicableChains(300) === 'number');
+```
+
+`amicableChains(300)` має повернути `220`.
+
+```js
+assert.strictEqual(amicableChains(300), 220);
+```
+
+`amicableChains(15000)` має повернути `220`.
+
+```js
+assert.strictEqual(amicableChains(15000), 220);
+```
+
+`amicableChains(100000)` має повернути `12496`.
+
+```js
+assert.strictEqual(amicableChains(100000), 12496);
+```
+
+`amicableChains(1000000)` має повернути `14316`.
+
+```js
+assert.strictEqual(amicableChains(1000000), 14316);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function amicableChains(limit) {
+
+ return true;
+}
+
+amicableChains(300);
+```
+
+# --solutions--
+
+```js
+function amicableChains(limit) {
+ function getSmallestMember(chain) {
+ let smallest = chain[0];
+ for (let i = 1; i < chain.length; i++) {
+ if (smallest > chain[i]) {
+ smallest = chain[i];
+ }
+ }
+ return smallest;
+ }
+
+ function getFactorsSums(limit) {
+ const factorsSums = new Array(limit + 1).fill(1);
+ for (let i = 2; i <= limit / 2; i++) {
+ for (let j = 2 * i; j <= limit; j += i) {
+ factorsSums[j] += i;
+ }
+ }
+ return factorsSums;
+ }
+
+ const factorsSums = getFactorsSums(limit);
+ const checkedNumbers = new Set();
+
+ let longestChain = 0;
+ let smallestMember = 0;
+ for (let i = 0; i <= limit; i++) {
+ const curChain = [];
+ let curNumber = i;
+ while (!checkedNumbers.has(curNumber) && factorsSums[curNumber] <= limit) {
+ curNumber = factorsSums[curNumber];
+
+ const chainStart = curChain.indexOf(curNumber);
+ if (chainStart === -1) {
+ curChain.push(curNumber);
+ continue;
+ }
+
+ const chainLength = curChain.length - chainStart;
+ if (chainLength > longestChain) {
+ longestChain = chainLength;
+ smallestMember = getSmallestMember(curChain.slice(chainStart));
+ }
+ break;
+ }
+
+ for (let j = 0; j < curChain.length; j++) {
+ checkedNumbers.add(curChain[j]);
+ }
+ }
+
+ return smallestMember;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-96-su-doku.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-96-su-doku.md
new file mode 100644
index 00000000000..93b1b667223
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-96-su-doku.md
@@ -0,0 +1,296 @@
+---
+id: 5900f3cc1000cf542c50fedf
+title: 'Проблема 96: Су Доку'
+challengeType: 5
+forumTopicId: 302213
+dashedName: problem-96-su-doku
+---
+
+# --description--
+
+Су Доку (з японської * розміщення чисел*) - це назва популярної головоломки. Її походження невідоме, проте слід згадати Леонарда Ейлера, який створив схожий, але проте набагато складніший пазл під назвою "Латинський квадрат". Мета головоломки Су Доку - заповнити пусті клітинки (або нулі) на полі 9 на 9 клітинок таким чином, щоб кожен ряд, колонка і квадрат 3 на 3 клітинки містив усі цифри від 1 до 9. Нижче наведено приклад початкового поля Су Доку і поля з уже вирішеною головоломкою.
+
+
+
+
+
+
+
+
+
+
+ 0 0 3 9 0 0 0 0 1
+
+
+ 0 2 0 3 0 5 8 0 6
+
+
+ 6 0 0 0 0 1 4 0 0
+
+
+
+
+ 0 0 8 7 0 0 0 0 6
+
+
+ 1 0 2 0 0 0 7 0 8
+
+
+ 9 0 0 0 0 8 2 0 0
+
+
+
+
+ 0 0 2 8 0 0 0 0 5
+
+
+ 6 0 9 2 0 3 0 1 0
+
+
+ 5 0 0 0 0 9 3 0 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4 8 3 9 6 7 2 5 1
+
+
+ 9 2 1 3 4 5 8 7 6
+
+
+ 6 5 7 8 2 1 4 9 3
+
+
+
+
+ 5 4 8 7 2 9 1 3 6
+
+
+ 1 3 2 5 6 4 7 9 8
+
+
+ 9 7 6 1 3 8 2 4 5
+
+
+
+
+ 3 7 2 8 1 4 6 9 5
+
+
+ 6 8 9 2 5 3 4 1 7
+
+
+ 5 1 4 7 6 9 3 8 2
+
+
+
+
+
+
+
+
+
+
+Вдало створена головоломка Су Доку вирішується логічно в єдиний унікальний спосіб. Хоча, задля того аби зменшити кількість варіантів вирішення, може знадобитися метод "спробуй здогадку" (проте це дуже спірне питання). Заплутаність вирішення залежить від складності самої головоломки. Наведений вище приклад вважається легким, оскільки його можна вирішити простою дедукцією.
+
+Масив `puzzlesArr` складається з різних рядків головоломки Су Доку, що відрізняються за складністю, проте кожен зі своїм унікальним способом вирішення.
+
+Щоб вирішити `puzzlesArr`, порахуйте суму трьох значних цифр у лівому верхньому кутку кожного поля. Наприклад, 483 - трьох значна цифра у верхньому лівому кутку поля (з вирішенням), що наведено вище.
+
+# --hints--
+
+`suDoku(testPuzzles1)` має вивести число.
+
+```js
+assert(typeof suDoku(_testPuzzles1) === 'number');
+```
+
+`suDoku(testPuzzles1)` має вивести `1190`.
+
+```js
+assert.strictEqual(suDoku(_testPuzzles1), 1190);
+```
+
+`suDoku(testPuzzles2)` має вивести `24702`.
+
+```js
+assert.strictEqual(suDoku(_testPuzzles2), 24702);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const _testPuzzles1 = [
+ '003020600900305001001806400008102900700000008006708200002609500800203009005010300',
+ '200080300060070084030500209000105408000000000402706000301007040720040060004010003',
+ '000000907000420180000705026100904000050000040000507009920108000034059000507000000'
+];
+
+const _testPuzzles2 = [
+ '003020600900305001001806400008102900700000008006708200002609500800203009005010300',
+ '200080300060070084030500209000105408000000000402706000301007040720040060004010003',
+ '000000907000420180000705026100904000050000040000507009920108000034059000507000000',
+ '030050040008010500460000012070502080000603000040109030250000098001020600080060020',
+ '020810740700003100090002805009040087400208003160030200302700060005600008076051090',
+ '100920000524010000000000070050008102000000000402700090060000000000030945000071006',
+ '043080250600000000000001094900004070000608000010200003820500000000000005034090710',
+ '480006902002008001900370060840010200003704100001060049020085007700900600609200018',
+ '000900002050123400030000160908000000070000090000000205091000050007439020400007000',
+ '001900003900700160030005007050000009004302600200000070600100030042007006500006800',
+ '000125400008400000420800000030000095060902010510000060000003049000007200001298000',
+ '062340750100005600570000040000094800400000006005830000030000091006400007059083260',
+ '300000000005009000200504000020000700160000058704310600000890100000067080000005437',
+ '630000000000500008005674000000020000003401020000000345000007004080300902947100080',
+ '000020040008035000000070602031046970200000000000501203049000730000000010800004000',
+ '361025900080960010400000057008000471000603000259000800740000005020018060005470329',
+ '050807020600010090702540006070020301504000908103080070900076205060090003080103040',
+ '080005000000003457000070809060400903007010500408007020901020000842300000000100080',
+ '003502900000040000106000305900251008070408030800763001308000104000020000005104800',
+ '000000000009805100051907420290401065000000000140508093026709580005103600000000000',
+ '020030090000907000900208005004806500607000208003102900800605007000309000030020050',
+ '005000006070009020000500107804150000000803000000092805907006000030400010200000600',
+ '040000050001943600009000300600050002103000506800020007005000200002436700030000040',
+ '004000000000030002390700080400009001209801307600200008010008053900040000000000800',
+ '360020089000361000000000000803000602400603007607000108000000000000418000970030014',
+ '500400060009000800640020000000001008208000501700500000000090084003000600060003002',
+ '007256400400000005010030060000508000008060200000107000030070090200000004006312700',
+ '000000000079050180800000007007306800450708096003502700700000005016030420000000000',
+ '030000080009000500007509200700105008020090030900402001004207100002000800070000090',
+ '200170603050000100000006079000040700000801000009050000310400000005000060906037002',
+ '000000080800701040040020030374000900000030000005000321010060050050802006080000000',
+ '000000085000210009960080100500800016000000000890006007009070052300054000480000000',
+ '608070502050608070002000300500090006040302050800050003005000200010704090409060701',
+ '050010040107000602000905000208030501040070020901080406000401000304000709020060010',
+ '053000790009753400100000002090080010000907000080030070500000003007641200061000940',
+ '006080300049070250000405000600317004007000800100826009000702000075040190003090600',
+ '005080700700204005320000084060105040008000500070803010450000091600508007003010600',
+ '000900800128006400070800060800430007500000009600079008090004010003600284001007000',
+ '000080000270000054095000810009806400020403060006905100017000620460000038000090000',
+ '000602000400050001085010620038206710000000000019407350026040530900020007000809000',
+ '000900002050123400030000160908000000070000090000000205091000050007439020400007000',
+ '380000000000400785009020300060090000800302009000040070001070500495006000000000092',
+ '000158000002060800030000040027030510000000000046080790050000080004070100000325000',
+ '010500200900001000002008030500030007008000500600080004040100700000700006003004050',
+ '080000040000469000400000007005904600070608030008502100900000005000781000060000010',
+ '904200007010000000000706500000800090020904060040002000001607000000000030300005702',
+ '000700800006000031040002000024070000010030080000060290000800070860000500002006000',
+ '001007090590080001030000080000005800050060020004100000080000030100020079020700400',
+ '000003017015009008060000000100007000009000200000500004000000020500600340340200000',
+ '300200000000107000706030500070009080900020004010800050009040301000702000000008006'
+];
+```
+
+## --seed-contents--
+
+```js
+function suDoku(puzzlesArr) {
+
+ return true;
+}
+
+// Only change code above this line
+
+const testPuzzles1 = [
+ '003020600900305001001806400008102900700000008006708200002609500800203009005010300',
+ '200080300060070084030500209000105408000000000402706000301007040720040060004010003',
+ '000000907000420180000705026100904000050000040000507009920108000034059000507000000'
+];
+
+suDoku(testPuzzles1);
+```
+
+# --solutions--
+
+```js
+function suDoku(puzzlesArr) {
+ function solve(puzzle) {
+ for (let row = 0; row < 9; row++) {
+ for (let col = 0; col < 9; col++) {
+ if (puzzle[row][col] > 0) {
+ continue;
+ }
+
+ const allowedNumbers = getAllowedNumbers(puzzle, row, col);
+
+ for (let number = 1; number <= 9; number++) {
+ if (allowedNumbers[number]) {
+ puzzle[row][col] = number;
+ if (solve(puzzle)) {
+ return true;
+ }
+ }
+ }
+
+ puzzle[row][col] = 0;
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function getAllowedNumbers(puzzle, row, col) {
+ const allowed = new Array(10).fill(true);
+ allowed[0] = false;
+
+ for (let i = 0; i < 9; i++) {
+ const numberInSameRow = puzzle[row][i];
+ if (numberInSameRow > 0) {
+ allowed[numberInSameRow] = false;
+ }
+
+ const numberInSameCol = puzzle[i][col];
+ if (numberInSameCol > 0) {
+ allowed[numberInSameCol] = false;
+ }
+ }
+
+ const rowOfSubGrid = Math.floor(row / 3) * 3;
+ const colOfSubGrid = Math.floor(col / 3) * 3;
+ for (let rowInSubGrid = 0; rowInSubGrid < 3; rowInSubGrid++) {
+ for (let colInSubGrid = 0; colInSubGrid < 3; colInSubGrid++) {
+ const numberInSameSubGrid =
+ puzzle[rowOfSubGrid + rowInSubGrid][colOfSubGrid + colInSubGrid];
+ if (numberInSameSubGrid > 0) {
+ allowed[numberInSameSubGrid] = false;
+ }
+ }
+ }
+
+ return allowed;
+ }
+
+ function parsePuzzle(string) {
+ const puzzle = [];
+ for (let row = 0; row < 9; row++) {
+ puzzle.push(
+ string
+ .slice(row * 9, 9 + row * 9)
+ .split('')
+ .map(x => parseInt(x, 10))
+ );
+ }
+ return puzzle;
+ }
+
+ let sum = 0;
+ for (let i = 0; i < puzzlesArr.length; i++) {
+ const puzzle = parsePuzzle(puzzlesArr[i]);
+ if (solve(puzzle)) {
+ sum += 100 * puzzle[0][0] + 10 * puzzle[0][1] + puzzle[0][2];
+ }
+ }
+
+ return sum;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-97-large-non-mersenne-prime.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-97-large-non-mersenne-prime.md
new file mode 100644
index 00000000000..eb4e876efaf
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-97-large-non-mersenne-prime.md
@@ -0,0 +1,88 @@
+---
+id: 5900f3ce1000cf542c50fee0
+title: 'Завдання 97: Велике просте число не-Мерсенна'
+challengeType: 5
+forumTopicId: 302214
+dashedName: problem-97-large-non-mersenne-prime
+---
+
+# --description--
+
+Перше відоме просте число, що перевищувало один мільйон цифр, було виявлено в 1999 році, і воно є Мерсеннським простим числом у формі $2^{6972593} − 1$; воно містить рівно 2,098,960 цифр. Згодом, виявилося, що інші Мерсеннівські числа, у формі $2^p − 1$, містять більше цифр.
+
+Однак, у 2004 році винайшли масивне немерсеннівське просте число, яке містить 2,357,207 цифр: $28433 × 2^{7830457} + 1$.
+
+Знайдіть останні десять цифр простих чисел у вигляді $multiplier × 2^{power} + 1$.
+
+# --hints--
+
+`largeNonMersennePrime(19, 6833086)` має вивести рядок.
+
+```js
+assert(typeof largeNonMersennePrime(19, 6833086) === 'string');
+```
+
+`largeNonMersennePrime(19, 6833086)` має вивести рядок `3637590017`.
+
+```js
+assert.strictEqual(largeNonMersennePrime(19, 6833086), '3637590017');
+```
+
+`largeNonMersennePrime(27, 7046834)` має вивести рядок `0130771969`.
+
+```js
+assert.strictEqual(largeNonMersennePrime(27, 7046834), '0130771969');
+```
+
+`largeNonMersennePrime(6679881, 6679881)` має вивести рядок `4455386113`.
+
+```js
+assert.strictEqual(largeNonMersennePrime(6679881, 6679881), '4455386113');
+```
+
+`largeNonMersennePrime(28433, 7830457)` має вивести рядок `8739992577`.
+
+```js
+assert.strictEqual(largeNonMersennePrime(28433, 7830457), '8739992577');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function largeNonMersennePrime(multiplier, power) {
+
+ return true;
+}
+
+largeNonMersennePrime(19, 6833086);
+```
+
+# --solutions--
+
+```js
+function largeNonMersennePrime(multiplier, power) {
+ function modStepsResults(number, other, mod, startValue, step) {
+ let result = startValue;
+ for (let i = 0; i < other; i++) {
+ result = step(number, result) % mod;
+ }
+ return result;
+ }
+
+ const numOfDigits = 10;
+ const mod = 10 ** numOfDigits;
+ const digitsAfterPower = modStepsResults(2, power, mod, 1, (a, b) => a * b);
+ const digitsAfterMultiply = modStepsResults(
+ digitsAfterPower,
+ multiplier,
+ mod,
+ 0,
+ (a, b) => a + b
+ );
+ const lastDigits = (digitsAfterMultiply + 1) % mod;
+
+ return lastDigits.toString().padStart(10, '0');
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-98-anagramic-squares.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-98-anagramic-squares.md
new file mode 100644
index 00000000000..9d60c9a9e51
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-98-anagramic-squares.md
@@ -0,0 +1,205 @@
+---
+id: 5900f3cf1000cf542c50fee1
+title: 'Завдання 98: Квадратні анаграми'
+challengeType: 5
+forumTopicId: 302215
+dashedName: problem-98-anagramic-squares
+---
+
+# --description--
+
+Змінюючи кожну з літер у слові CARE на 1, 2, 9 і 6 відповідно, ми створюємо квадратне число: 1296 = 36^2$. Цікаво, що використовуючи ті ж цифрові підстановки, анаграма RACE, також утворює квадратне число: $9216 = 96^2$. Ми будемо називати CARE (та RACE) парою квадратних анаграм і уточнимо, що нулі на початку не дозволені, також різні літери не можуть мати однакові цифрові значення.
+
+Використовуючи масив `words`, знайдіть всі пари квадратних анаграм (слово-паліндром НЕ вважається анаграмою самого себе).
+
+Яким є найбільше квадратне число, утворене кожним членом такої пари?
+
+**Примітка:** Усі анаграми повинні міститися в масиві наданих `words`.
+
+# --hints--
+
+`anagramicSquares(['CARE', 'RACE'])` повинен повертатися як число.
+
+```js
+assert(typeof anagramicSquares(['CARE', 'RACE']) === 'number');
+```
+
+`anagramicSquares(['CARE', 'RACE'])` повинен повертатися як `9216`.
+
+```js
+assert.strictEqual(anagramicSquares(['CARE', 'RACE']), 9216);
+```
+
+`anagramicSquares(testWords1)` повинен повертатися як `4761`.
+
+```js
+assert.strictEqual(anagramicSquares(_testWords1), 4761);
+```
+
+`anagramicSquares(testWords2)` повинен повертатися як `18769`.
+
+```js
+assert.strictEqual(anagramicSquares(_testWords2), 18769);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const _testWords1 = [
+ "DAMAGE","DANGER","DANGEROUS","DARK","DATA","DATE","DAUGHTER","DAY","DEAD","DEAL","DEATH","DEBATE","DEBT","DECADE","DECIDE","DECISION","DECLARE","DEEP","DEFENCE","DEFENDANT","DEFINE","DEFINITION","DEGREE","DELIVER","DEMAND","DEMOCRATIC","DEMONSTRATE","DENY","DEPARTMENT","DEPEND","DEPUTY","DERIVE","DESCRIBE","DESCRIPTION","DESIGN","DESIRE","DESK","DESPITE","DESTROY","DETAIL","DETAILED","DETERMINE","DEVELOP","DEVELOPMENT","DEVICE","DIE","DIFFERENCE","DIFFERENT","DIFFICULT","DIFFICULTY","DINNER","DIRECT","DIRECTION","DIRECTLY","DIRECTOR","DISAPPEAR","DISCIPLINE","DISCOVER","DISCUSS","DISCUSSION","DISEASE","DISPLAY","DISTANCE","DISTINCTION","DISTRIBUTION","DISTRICT","DIVIDE","DIVISION","DO","DOCTOR","DOCUMENT","DOG","DOMESTIC","DOOR","DOUBLE","DOUBT","DOWN","DRAW","DRAWING","DREAM","DRESS","DRINK","DRIVE","DRIVER","DROP","DRUG","DRY","DUE","DURING","DUTY","LABOUR","LACK","LADY","LAND","LANGUAGE","LARGE","LARGELY","LAST","LATE","LATER","LATTER","LAUGH","LAUNCH","LAW","LAWYER","LAY","LEAD","LEADER","LEADERSHIP","LEADING","LEAF","LEAGUE","LEAN","LEARN","LEAST","LEAVE","LEFT","LEG","LEGAL","LEGISLATION","LENGTH","LESS","LET","LETTER","LEVEL","LIABILITY","LIBERAL","LIBRARY","LIE","LIFE","LIFT","LIGHT","LIKE","LIKELY","LIMIT","LIMITED","LINE","LINK","LIP","LIST","LISTEN","LITERATURE","LITTLE","LIVE","LIVING","LOAN","LOCAL","LOCATION","LONG","LOOK","LORD","LOSE","LOSS","LOT","LOVE","LOVELY","LOW","LUNCH"
+];
+const _testWords2 = [
+ "A","ABILITY","ABLE","ABOUT","ABOVE","ABSENCE","ABSOLUTELY","ACADEMIC","ACCEPT","ACCESS","ACCIDENT","ACCOMPANY","ACCORDING","ACCOUNT","ACHIEVE","ACHIEVEMENT","ACID","ACQUIRE","ACROSS","ACT","ACTION","ACTIVE","ACTIVITY","ACTUAL","ACTUALLY","ADD","ADDITION","ADDITIONAL","ADDRESS","ADMINISTRATION","ADMIT","ADOPT","ADULT","ADVANCE","ADVANTAGE","ADVICE","ADVISE","AFFAIR","AFFECT","AFFORD","AFRAID","AFTER","AFTERNOON","AFTERWARDS","AGAIN","AGAINST","AGE","AGENCY","AGENT","AGO","AGREE","AGREEMENT","AHEAD","AID","AIM","AIR","AIRCRAFT","ALL","ALLOW","ALMOST","ALONE","ALONG","ALREADY","ALRIGHT","ALSO","ALTERNATIVE","ALTHOUGH","ALWAYS","AMONG","AMONGST","AMOUNT","AN","ANALYSIS","ANCIENT","AND","ANIMAL","ANNOUNCE","ANNUAL","ANOTHER","ANSWER","ANY","ANYBODY","ANYONE","ANYTHING","ANYWAY","APART","APPARENT","APPARENTLY","APPEAL","APPEAR","APPEARANCE","APPLICATION","APPLY","APPOINT","APPOINTMENT","APPROACH","APPROPRIATE","APPROVE","AREA","ARGUE","ARGUMENT","ARISE","ARM","ARMY","AROUND","ARRANGE","ARRANGEMENT","ARRIVE","ART","ARTICLE","ARTIST","AS","ASK","ASPECT","ASSEMBLY","ASSESS","ASSESSMENT","ASSET","ASSOCIATE","ASSOCIATION","ASSUME","ASSUMPTION","AT","ATMOSPHERE","ATTACH","ATTACK","ATTEMPT","ATTEND","ATTENTION","ATTITUDE","ATTRACT","ATTRACTIVE","AUDIENCE","AUTHOR","AUTHORITY","AVAILABLE","AVERAGE","AVOID","AWARD","AWARE","AWAY","AYE","BABY","BACK","BACKGROUND","BAD","BAG","BALANCE","BALL","BAND","BANK","BAR","BASE","BASIC","BASIS","BATTLE","BE","BEAR","BEAT","BEAUTIFUL","BECAUSE","BECOME","BED","BEDROOM","BEFORE","BEGIN","BEGINNING","BEHAVIOUR","BEHIND","BELIEF","BELIEVE","BELONG","BELOW","BENEATH","BENEFIT","BESIDE","BEST","BETTER","BETWEEN","BEYOND","BIG","BILL","BIND","BIRD","BIRTH","BIT","BLACK","BLOCK","BLOOD","BLOODY","BLOW","BLUE","BOARD","BOAT","BODY","BONE","BOOK","BORDER","BOTH","BOTTLE","BOTTOM","BOX","BOY","BRAIN","BRANCH","BREAK","BREATH","BRIDGE","BRIEF","BRIGHT","BRING","BROAD","BROTHER","BUDGET","BUILD","BUILDING","BURN","BUS","BUSINESS","BUSY","BUT","BUY","BY","CABINET","CALL","CAMPAIGN","CAN","CANDIDATE","CAPABLE","CAPACITY","CAPITAL","CAR","CARD","CARE","CAREER","CAREFUL","CAREFULLY","CARRY","CASE","CASH","CAT","CATCH","CATEGORY","CAUSE","CELL","CENTRAL","CENTRE","CENTURY","CERTAIN","CERTAINLY","CHAIN","CHAIR","CHAIRMAN","CHALLENGE","CHANCE","CHANGE","CHANNEL","CHAPTER","CHARACTER","CHARACTERISTIC","CHARGE","CHEAP","CHECK","CHEMICAL","CHIEF","CHILD","CHOICE","CHOOSE","CHURCH","CIRCLE","CIRCUMSTANCE","CITIZEN","CITY","CIVIL","CLAIM","CLASS","CLEAN","CLEAR","CLEARLY","CLIENT","CLIMB","CLOSE","CLOSELY","CLOTHES","CLUB","COAL","CODE","COFFEE","COLD","COLLEAGUE","COLLECT","COLLECTION","COLLEGE","COLOUR","COMBINATION","COMBINE","COME","COMMENT","COMMERCIAL","COMMISSION","COMMIT","COMMITMENT","COMMITTEE","COMMON","COMMUNICATION","COMMUNITY","COMPANY","COMPARE","COMPARISON","COMPETITION","COMPLETE","COMPLETELY","COMPLEX","COMPONENT","COMPUTER","CONCENTRATE","CONCENTRATION","CONCEPT","CONCERN","CONCERNED","CONCLUDE","CONCLUSION","CONDITION","CONDUCT","CONFERENCE","CONFIDENCE","CONFIRM","CONFLICT","CONGRESS","CONNECT","CONNECTION","CONSEQUENCE","CONSERVATIVE","CONSIDER","CONSIDERABLE","CONSIDERATION","CONSIST","CONSTANT","CONSTRUCTION","CONSUMER","CONTACT","CONTAIN","CONTENT","CONTEXT","CONTINUE","CONTRACT","CONTRAST","CONTRIBUTE","CONTRIBUTION","CONTROL","CONVENTION","CONVERSATION","COPY","CORNER","CORPORATE","CORRECT","COS","COST","COULD","COUNCIL","COUNT","COUNTRY","COUNTY","COUPLE","COURSE","COURT","COVER","CREATE","CREATION","CREDIT","CRIME","CRIMINAL","CRISIS","CRITERION","CRITICAL","CRITICISM","CROSS","CROWD","CRY","CULTURAL","CULTURE","CUP","CURRENT","CURRENTLY","CURRICULUM","CUSTOMER","CUT","DAMAGE","DANGER","DANGEROUS","DARK","DATA","DATE","DAUGHTER","DAY","DEAD","DEAL","DEATH","DEBATE","DEBT","DECADE","DECIDE","DECISION","DECLARE","DEEP","DEFENCE","DEFENDANT","DEFINE","DEFINITION","DEGREE","DELIVER","DEMAND","DEMOCRATIC","DEMONSTRATE","DENY","DEPARTMENT","DEPEND","DEPUTY","DERIVE","DESCRIBE","DESCRIPTION","DESIGN","DESIRE","DESK","DESPITE","DESTROY","DETAIL","DETAILED","DETERMINE","DEVELOP","DEVELOPMENT","DEVICE","DIE","DIFFERENCE","DIFFERENT","DIFFICULT","DIFFICULTY","DINNER","DIRECT","DIRECTION","DIRECTLY","DIRECTOR","DISAPPEAR","DISCIPLINE","DISCOVER","DISCUSS","DISCUSSION","DISEASE","DISPLAY","DISTANCE","DISTINCTION","DISTRIBUTION","DISTRICT","DIVIDE","DIVISION","DO","DOCTOR","DOCUMENT","DOG","DOMESTIC","DOOR","DOUBLE","DOUBT","DOWN","DRAW","DRAWING","DREAM","DRESS","DRINK","DRIVE","DRIVER","DROP","DRUG","DRY","DUE","DURING","DUTY","EACH","EAR","EARLY","EARN","EARTH","EASILY","EAST","EASY","EAT","ECONOMIC","ECONOMY","EDGE","EDITOR","EDUCATION","EDUCATIONAL","EFFECT","EFFECTIVE","EFFECTIVELY","EFFORT","EGG","EITHER","ELDERLY","ELECTION","ELEMENT","ELSE","ELSEWHERE","EMERGE","EMPHASIS","EMPLOY","EMPLOYEE","EMPLOYER","EMPLOYMENT","EMPTY","ENABLE","ENCOURAGE","END","ENEMY","ENERGY","ENGINE","ENGINEERING","ENJOY","ENOUGH","ENSURE","ENTER","ENTERPRISE","ENTIRE","ENTIRELY","ENTITLE","ENTRY","ENVIRONMENT","ENVIRONMENTAL","EQUAL","EQUALLY","EQUIPMENT","ERROR","ESCAPE","ESPECIALLY","ESSENTIAL","ESTABLISH","ESTABLISHMENT","ESTATE","ESTIMATE","EVEN","EVENING","EVENT","EVENTUALLY","EVER","EVERY","EVERYBODY","EVERYONE","EVERYTHING","EVIDENCE","EXACTLY","EXAMINATION","EXAMINE","EXAMPLE","EXCELLENT","EXCEPT","EXCHANGE","EXECUTIVE","EXERCISE","EXHIBITION","EXIST","EXISTENCE","EXISTING","EXPECT","EXPECTATION","EXPENDITURE","EXPENSE","EXPENSIVE","EXPERIENCE","EXPERIMENT","EXPERT","EXPLAIN","EXPLANATION","EXPLORE","EXPRESS","EXPRESSION","EXTEND","EXTENT","EXTERNAL","EXTRA","EXTREMELY","EYE","FACE","FACILITY","FACT","FACTOR","FACTORY","FAIL","FAILURE","FAIR","FAIRLY","FAITH","FALL","FAMILIAR","FAMILY","FAMOUS","FAR","FARM","FARMER","FASHION","FAST","FATHER","FAVOUR","FEAR","FEATURE","FEE","FEEL","FEELING","FEMALE","FEW","FIELD","FIGHT","FIGURE","FILE","FILL","FILM","FINAL","FINALLY","FINANCE","FINANCIAL","FIND","FINDING","FINE","FINGER","FINISH","FIRE","FIRM","FIRST","FISH","FIT","FIX","FLAT","FLIGHT","FLOOR","FLOW","FLOWER","FLY","FOCUS","FOLLOW","FOLLOWING","FOOD","FOOT","FOOTBALL","FOR","FORCE","FOREIGN","FOREST","FORGET","FORM","FORMAL","FORMER","FORWARD","FOUNDATION","FREE","FREEDOM","FREQUENTLY","FRESH","FRIEND","FROM","FRONT","FRUIT","FUEL","FULL","FULLY","FUNCTION","FUND","FUNNY","FURTHER","FUTURE","GAIN","GAME","GARDEN","GAS","GATE","GATHER","GENERAL","GENERALLY","GENERATE","GENERATION","GENTLEMAN","GET","GIRL","GIVE","GLASS","GO","GOAL","GOD","GOLD","GOOD","GOVERNMENT","GRANT","GREAT","GREEN","GREY","GROUND","GROUP","GROW","GROWING","GROWTH","GUEST","GUIDE","GUN","HAIR","HALF","HALL","HAND","HANDLE","HANG","HAPPEN","HAPPY","HARD","HARDLY","HATE","HAVE","HE","HEAD","HEALTH","HEAR","HEART","HEAT","HEAVY","HELL","HELP","HENCE","HER","HERE","HERSELF","HIDE","HIGH","HIGHLY","HILL","HIM","HIMSELF","HIS","HISTORICAL","HISTORY","HIT","HOLD","HOLE","HOLIDAY","HOME","HOPE","HORSE","HOSPITAL","HOT","HOTEL","HOUR","HOUSE","HOUSEHOLD","HOUSING","HOW","HOWEVER","HUGE","HUMAN","HURT","HUSBAND","I","IDEA","IDENTIFY","IF","IGNORE","ILLUSTRATE","IMAGE","IMAGINE","IMMEDIATE","IMMEDIATELY","IMPACT","IMPLICATION","IMPLY","IMPORTANCE","IMPORTANT","IMPOSE","IMPOSSIBLE","IMPRESSION","IMPROVE","IMPROVEMENT","IN","INCIDENT","INCLUDE","INCLUDING","INCOME","INCREASE","INCREASED","INCREASINGLY","INDEED","INDEPENDENT","INDEX","INDICATE","INDIVIDUAL","INDUSTRIAL","INDUSTRY","INFLUENCE","INFORM","INFORMATION","INITIAL","INITIATIVE","INJURY","INSIDE","INSIST","INSTANCE","INSTEAD","INSTITUTE","INSTITUTION","INSTRUCTION","INSTRUMENT","INSURANCE","INTEND","INTENTION","INTEREST","INTERESTED","INTERESTING","INTERNAL","INTERNATIONAL","INTERPRETATION","INTERVIEW","INTO","INTRODUCE","INTRODUCTION","INVESTIGATE","INVESTIGATION","INVESTMENT","INVITE","INVOLVE","IRON","IS","ISLAND","ISSUE","IT","ITEM","ITS","ITSELF","JOB","JOIN","JOINT","JOURNEY","JUDGE","JUMP","JUST","JUSTICE","KEEP","KEY","KID","KILL","KIND","KING","KITCHEN","KNEE","KNOW","KNOWLEDGE","LABOUR","LACK","LADY","LAND","LANGUAGE","LARGE","LARGELY","LAST","LATE","LATER","LATTER","LAUGH","LAUNCH","LAW","LAWYER","LAY","LEAD","LEADER","LEADERSHIP","LEADING","LEAF","LEAGUE","LEAN","LEARN","LEAST","LEAVE","LEFT","LEG","LEGAL","LEGISLATION","LENGTH","LESS","LET","LETTER","LEVEL","LIABILITY","LIBERAL","LIBRARY","LIE","LIFE","LIFT","LIGHT","LIKE","LIKELY","LIMIT","LIMITED","LINE","LINK","LIP","LIST","LISTEN","LITERATURE","LITTLE","LIVE","LIVING","LOAN","LOCAL","LOCATION","LONG","LOOK","LORD","LOSE","LOSS","LOT","LOVE","LOVELY","LOW","LUNCH","MACHINE","MAGAZINE","MAIN","MAINLY","MAINTAIN","MAJOR","MAJORITY","MAKE","MALE","MAN","MANAGE","MANAGEMENT","MANAGER","MANNER","MANY","MAP","MARK","MARKET","MARRIAGE","MARRIED","MARRY","MASS","MASTER","MATCH","MATERIAL","MATTER","MAY","MAYBE","ME","MEAL","MEAN","MEANING","MEANS","MEANWHILE","MEASURE","MECHANISM","MEDIA","MEDICAL","MEET","MEETING","MEMBER","MEMBERSHIP","MEMORY","MENTAL","MENTION","MERELY","MESSAGE","METAL","METHOD","MIDDLE","MIGHT","MILE","MILITARY","MILK","MIND","MINE","MINISTER","MINISTRY","MINUTE","MISS","MISTAKE","MODEL","MODERN","MODULE","MOMENT","MONEY","MONTH","MORE","MORNING","MOST","MOTHER","MOTION","MOTOR","MOUNTAIN","MOUTH","MOVE","MOVEMENT","MUCH","MURDER","MUSEUM","MUSIC","MUST","MY","MYSELF","NAME","NARROW","NATION","NATIONAL","NATURAL","NATURE","NEAR","NEARLY","NECESSARILY","NECESSARY","NECK","NEED","NEGOTIATION","NEIGHBOUR","NEITHER","NETWORK","NEVER","NEVERTHELESS","NEW","NEWS","NEWSPAPER","NEXT","NICE","NIGHT","NO","NOBODY","NOD","NOISE","NONE","NOR","NORMAL","NORMALLY","NORTH","NORTHERN","NOSE","NOT","NOTE","NOTHING","NOTICE","NOTION","NOW","NUCLEAR","NUMBER","NURSE","OBJECT","OBJECTIVE","OBSERVATION","OBSERVE","OBTAIN","OBVIOUS","OBVIOUSLY","OCCASION","OCCUR","ODD","OF","OFF","OFFENCE","OFFER","OFFICE","OFFICER","OFFICIAL","OFTEN","OIL","OKAY","OLD","ON","ONCE","ONE","ONLY","ONTO","OPEN","OPERATE","OPERATION","OPINION","OPPORTUNITY","OPPOSITION","OPTION","OR","ORDER","ORDINARY","ORGANISATION","ORGANISE","ORGANIZATION","ORIGIN","ORIGINAL","OTHER","OTHERWISE","OUGHT","OUR","OURSELVES","OUT","OUTCOME","OUTPUT","OUTSIDE","OVER","OVERALL","OWN","OWNER","PACKAGE","PAGE","PAIN","PAINT","PAINTING","PAIR","PANEL","PAPER","PARENT","PARK","PARLIAMENT","PART","PARTICULAR","PARTICULARLY","PARTLY","PARTNER","PARTY","PASS","PASSAGE","PAST","PATH","PATIENT","PATTERN","PAY","PAYMENT","PEACE","PENSION","PEOPLE","PER","PERCENT","PERFECT","PERFORM","PERFORMANCE","PERHAPS","PERIOD","PERMANENT","PERSON","PERSONAL","PERSUADE","PHASE","PHONE","PHOTOGRAPH","PHYSICAL","PICK","PICTURE","PIECE","PLACE","PLAN","PLANNING","PLANT","PLASTIC","PLATE","PLAY","PLAYER","PLEASE","PLEASURE","PLENTY","PLUS","POCKET","POINT","POLICE","POLICY","POLITICAL","POLITICS","POOL","POOR","POPULAR","POPULATION","POSITION","POSITIVE","POSSIBILITY","POSSIBLE","POSSIBLY","POST","POTENTIAL","POUND","POWER","POWERFUL","PRACTICAL","PRACTICE","PREFER","PREPARE","PRESENCE","PRESENT","PRESIDENT","PRESS","PRESSURE","PRETTY","PREVENT","PREVIOUS","PREVIOUSLY","PRICE","PRIMARY","PRIME","PRINCIPLE","PRIORITY","PRISON","PRISONER","PRIVATE","PROBABLY","PROBLEM","PROCEDURE","PROCESS","PRODUCE","PRODUCT","PRODUCTION","PROFESSIONAL","PROFIT","PROGRAM","PROGRAMME","PROGRESS","PROJECT","PROMISE","PROMOTE","PROPER","PROPERLY","PROPERTY","PROPORTION","PROPOSE","PROPOSAL","PROSPECT","PROTECT","PROTECTION","PROVE","PROVIDE","PROVIDED","PROVISION","PUB","PUBLIC","PUBLICATION","PUBLISH","PULL","PUPIL","PURPOSE","PUSH","PUT","QUALITY","QUARTER","QUESTION","QUICK","QUICKLY","QUIET","QUITE","RACE","RADIO","RAILWAY","RAIN","RAISE","RANGE","RAPIDLY","RARE","RATE","RATHER","REACH","REACTION","READ","READER","READING","READY","REAL","REALISE","REALITY","REALIZE","REALLY","REASON","REASONABLE","RECALL","RECEIVE","RECENT","RECENTLY","RECOGNISE","RECOGNITION","RECOGNIZE","RECOMMEND","RECORD","RECOVER","RED","REDUCE","REDUCTION","REFER","REFERENCE","REFLECT","REFORM","REFUSE","REGARD","REGION","REGIONAL","REGULAR","REGULATION","REJECT","RELATE","RELATION","RELATIONSHIP","RELATIVE","RELATIVELY","RELEASE","RELEVANT","RELIEF","RELIGION","RELIGIOUS","RELY","REMAIN","REMEMBER","REMIND","REMOVE","REPEAT","REPLACE","REPLY","REPORT","REPRESENT","REPRESENTATION","REPRESENTATIVE","REQUEST","REQUIRE","REQUIREMENT","RESEARCH","RESOURCE","RESPECT","RESPOND","RESPONSE","RESPONSIBILITY","RESPONSIBLE","REST","RESTAURANT","RESULT","RETAIN","RETURN","REVEAL","REVENUE","REVIEW","REVOLUTION","RICH","RIDE","RIGHT","RING","RISE","RISK","RIVER","ROAD","ROCK","ROLE","ROLL","ROOF","ROOM","ROUND","ROUTE","ROW","ROYAL","RULE","RUN","RURAL","SAFE","SAFETY","SALE","SAME","SAMPLE","SATISFY","SAVE","SAY","SCALE","SCENE","SCHEME","SCHOOL","SCIENCE","SCIENTIFIC","SCIENTIST","SCORE","SCREEN","SEA","SEARCH","SEASON","SEAT","SECOND","SECONDARY","SECRETARY","SECTION","SECTOR","SECURE","SECURITY","SEE","SEEK","SEEM","SELECT","SELECTION","SELL","SEND","SENIOR","SENSE","SENTENCE","SEPARATE","SEQUENCE","SERIES","SERIOUS","SERIOUSLY","SERVANT","SERVE","SERVICE","SESSION","SET","SETTLE","SETTLEMENT","SEVERAL","SEVERE","SEX","SEXUAL","SHAKE","SHALL","SHAPE","SHARE","SHE","SHEET","SHIP","SHOE","SHOOT","SHOP","SHORT","SHOT","SHOULD","SHOULDER","SHOUT","SHOW","SHUT","SIDE","SIGHT","SIGN","SIGNAL","SIGNIFICANCE","SIGNIFICANT","SILENCE","SIMILAR","SIMPLE","SIMPLY","SINCE","SING","SINGLE","SIR","SISTER","SIT","SITE","SITUATION","SIZE","SKILL","SKIN","SKY","SLEEP","SLIGHTLY","SLIP","SLOW","SLOWLY","SMALL","SMILE","SO","SOCIAL","SOCIETY","SOFT","SOFTWARE","SOIL","SOLDIER","SOLICITOR","SOLUTION","SOME","SOMEBODY","SOMEONE","SOMETHING","SOMETIMES","SOMEWHAT","SOMEWHERE","SON","SONG","SOON","SORRY","SORT","SOUND","SOURCE","SOUTH","SOUTHERN","SPACE","SPEAK","SPEAKER","SPECIAL","SPECIES","SPECIFIC","SPEECH","SPEED","SPEND","SPIRIT","SPORT","SPOT","SPREAD","SPRING","STAFF","STAGE","STAND","STANDARD","STAR","START","STATE","STATEMENT","STATION","STATUS","STAY","STEAL","STEP","STICK","STILL","STOCK","STONE","STOP","STORE","STORY","STRAIGHT","STRANGE","STRATEGY","STREET","STRENGTH","STRIKE","STRONG","STRONGLY","STRUCTURE","STUDENT","STUDIO","STUDY","STUFF","STYLE","SUBJECT","SUBSTANTIAL","SUCCEED","SUCCESS","SUCCESSFUL","SUCH","SUDDENLY","SUFFER","SUFFICIENT","SUGGEST","SUGGESTION","SUITABLE","SUM","SUMMER","SUN","SUPPLY","SUPPORT","SUPPOSE","SURE","SURELY","SURFACE","SURPRISE","SURROUND","SURVEY","SURVIVE","SWITCH","SYSTEM","TABLE","TAKE","TALK","TALL","TAPE","TARGET","TASK","TAX","TEA","TEACH","TEACHER","TEACHING","TEAM","TEAR","TECHNICAL","TECHNIQUE","TECHNOLOGY","TELEPHONE","TELEVISION","TELL","TEMPERATURE","TEND","TERM","TERMS","TERRIBLE","TEST","TEXT","THAN","THANK","THANKS","THAT","THE","THEATRE","THEIR","THEM","THEME","THEMSELVES","THEN","THEORY","THERE","THEREFORE","THESE","THEY","THIN","THING","THINK","THIS","THOSE","THOUGH","THOUGHT","THREAT","THREATEN","THROUGH","THROUGHOUT","THROW","THUS","TICKET","TIME","TINY","TITLE","TO","TODAY","TOGETHER","TOMORROW","TONE","TONIGHT","TOO","TOOL","TOOTH","TOP","TOTAL","TOTALLY","TOUCH","TOUR","TOWARDS","TOWN","TRACK","TRADE","TRADITION","TRADITIONAL","TRAFFIC","TRAIN","TRAINING","TRANSFER","TRANSPORT","TRAVEL","TREAT","TREATMENT","TREATY","TREE","TREND","TRIAL","TRIP","TROOP","TROUBLE","TRUE","TRUST","TRUTH","TRY","TURN","TWICE","TYPE","TYPICAL","UNABLE","UNDER","UNDERSTAND","UNDERSTANDING","UNDERTAKE","UNEMPLOYMENT","UNFORTUNATELY","UNION","UNIT","UNITED","UNIVERSITY","UNLESS","UNLIKELY","UNTIL","UP","UPON","UPPER","URBAN","US","USE","USED","USEFUL","USER","USUAL","USUALLY","VALUE","VARIATION","VARIETY","VARIOUS","VARY","VAST","VEHICLE","VERSION","VERY","VIA","VICTIM","VICTORY","VIDEO","VIEW","VILLAGE","VIOLENCE","VISION","VISIT","VISITOR","VITAL","VOICE","VOLUME","VOTE","WAGE","WAIT","WALK","WALL","WANT","WAR","WARM","WARN","WASH","WATCH","WATER","WAVE","WAY","WE","WEAK","WEAPON","WEAR","WEATHER","WEEK","WEEKEND","WEIGHT","WELCOME","WELFARE","WELL","WEST","WESTERN","WHAT","WHATEVER","WHEN","WHERE","WHEREAS","WHETHER","WHICH","WHILE","WHILST","WHITE","WHO","WHOLE","WHOM","WHOSE","WHY","WIDE","WIDELY","WIFE","WILD","WILL","WIN","WIND","WINDOW","WINE","WING","WINNER","WINTER","WISH","WITH","WITHDRAW","WITHIN","WITHOUT","WOMAN","WONDER","WONDERFUL","WOOD","WORD","WORK","WORKER","WORKING","WORKS","WORLD","WORRY","WORTH","WOULD","WRITE","WRITER","WRITING","WRONG","YARD","YEAH","YEAR","YES","YESTERDAY","YET","YOU","YOUNG","YOUR","YOURSELF","YOUTH"
+];
+```
+
+## --seed-contents--
+
+```js
+function anagramicSquares(words) {
+
+ return true;
+}
+
+// Only change code above this line
+const testWords1 = [
+"DAMAGE","DANGER","DANGEROUS","DARK","DATA","DATE","DAUGHTER","DAY","DEAD","DEAL","DEATH","DEBATE","DEBT","DECADE","DECIDE","DECISION","DECLARE","DEEP","DEFENCE","DEFENDANT","DEFINE","DEFINITION","DEGREE","DELIVER","DEMAND","DEMOCRATIC","DEMONSTRATE","DENY","DEPARTMENT","DEPEND","DEPUTY","DERIVE","DESCRIBE","DESCRIPTION","DESIGN","DESIRE","DESK","DESPITE","DESTROY","DETAIL","DETAILED","DETERMINE","DEVELOP","DEVELOPMENT","DEVICE","DIE","DIFFERENCE","DIFFERENT","DIFFICULT","DIFFICULTY","DINNER","DIRECT","DIRECTION","DIRECTLY","DIRECTOR","DISAPPEAR","DISCIPLINE","DISCOVER","DISCUSS","DISCUSSION","DISEASE","DISPLAY","DISTANCE","DISTINCTION","DISTRIBUTION","DISTRICT","DIVIDE","DIVISION","DO","DOCTOR","DOCUMENT","DOG","DOMESTIC","DOOR","DOUBLE","DOUBT","DOWN","DRAW","DRAWING","DREAM","DRESS","DRINK","DRIVE","DRIVER","DROP","DRUG","DRY","DUE","DURING","DUTY","LABOUR","LACK","LADY","LAND","LANGUAGE","LARGE","LARGELY","LAST","LATE","LATER","LATTER","LAUGH","LAUNCH","LAW","LAWYER","LAY","LEAD","LEADER","LEADERSHIP","LEADING","LEAF","LEAGUE","LEAN","LEARN","LEAST","LEAVE","LEFT","LEG","LEGAL","LEGISLATION","LENGTH","LESS","LET","LETTER","LEVEL","LIABILITY","LIBERAL","LIBRARY","LIE","LIFE","LIFT","LIGHT","LIKE","LIKELY","LIMIT","LIMITED","LINE","LINK","LIP","LIST","LISTEN","LITERATURE","LITTLE","LIVE","LIVING","LOAN","LOCAL","LOCATION","LONG","LOOK","LORD","LOSE","LOSS","LOT","LOVE","LOVELY","LOW","LUNCH"
+];
+
+anagramicSquares(testWords1);
+```
+
+# --solutions--
+
+```js
+function anagramicSquares(words) {
+ // Based on https://www.mathblog.dk/project-euler-98-anagrams-square-numbers/
+ function findMaximumSquare(squares, word1, word2) {
+ let maximumSquare = 0;
+
+ for (let i = 0; i < squares.length; i++) {
+ const length = squares[i].toString().length;
+
+ if (length < word1.length) {
+ continue;
+ }
+ if (length > word1.length) {
+ break;
+ }
+
+ const word1Square = squares[i];
+ const letterToDigit = mapLettersToDigits(word1, word1Square);
+
+ const noProperMappingExist = Object.keys(letterToDigit).length === 0;
+ if (noProperMappingExist) {
+ continue;
+ }
+
+ const word2Square = getNumberFromMapping(word2, letterToDigit);
+ if (word2Square === 0) {
+ continue;
+ }
+
+ const doesWord2SquareExist = squares.indexOf(word2Square) !== -1;
+ if (doesWord2SquareExist) {
+ const pairMaximum = Math.max(word1Square, word2Square);
+ maximumSquare = Math.max(maximumSquare, pairMaximum);
+ }
+ }
+ return maximumSquare;
+ }
+
+ function getNumberFromMapping(word, letterToDigit) {
+ const wouldNumberHaveLeadingZero = letterToDigit[word[0]] === 0;
+ if (wouldNumberHaveLeadingZero) {
+ return 0;
+ }
+
+ let number = 0;
+ for (let i = 0; i < word.length; i++) {
+ number = number * 10 + letterToDigit[word[i]];
+ }
+ return number;
+ }
+
+ function mapLettersToDigits(word, square) {
+ const letterToDigit = {};
+ for (let j = word.length - 1; j >= 0; j--) {
+ const curDigit = square % 10;
+ square = Math.floor(square / 10);
+
+ const curLetter = word[j];
+
+ const isLetterRepeated = letterToDigit.hasOwnProperty(curLetter);
+ if (isLetterRepeated) {
+ const isLetterUsedForTheSameDigit =
+ letterToDigit[curLetter] === curDigit;
+ if (isLetterUsedForTheSameDigit) {
+ continue;
+ }
+
+ return {};
+ }
+
+ const isDigitUsed = Object.values(letterToDigit).indexOf(curDigit) !== -1;
+ if (isDigitUsed) {
+ return {};
+ }
+
+ letterToDigit[curLetter] = curDigit;
+ }
+ return letterToDigit;
+ }
+
+ function groupWordsWithSameLetters(words) {
+ const lettersToWords = {};
+ for (let i = 0; i < words.length; i++) {
+ const word = words[i];
+ const sortedLetters = word.split('').sort().join('');
+ if (!lettersToWords.hasOwnProperty(sortedLetters)) {
+ lettersToWords[sortedLetters] = [];
+ }
+ lettersToWords[sortedLetters].push(word);
+ }
+ return lettersToWords;
+ }
+
+ const lettersToWords = groupWordsWithSameLetters(words);
+
+ const anagrams = Object.keys(lettersToWords).filter(
+ letters => lettersToWords[letters].length > 1
+ );
+ const lengthOfLongestAnagram = anagrams
+ .map(anagram => anagram.length)
+ .sort((a, b) => b - a)[0];
+
+ const squares = [];
+ const numberLimit = (10 ** lengthOfLongestAnagram) ** 0.5;
+ for (let number = 2; number < numberLimit; number++) {
+ const square = number ** 2;
+ squares.push(square);
+ }
+
+ let largestSquare = 0;
+ for (let i = 0; i < anagrams.length; i++) {
+ const curWords = lettersToWords[anagrams[i]];
+
+ for (let j = 0; j < curWords.length; j++) {
+ for (let k = j + 1; k < curWords.length; k++) {
+ const squareValue = findMaximumSquare(
+ squares,
+ curWords[j],
+ curWords[k]
+ );
+ if (squareValue > largestSquare) {
+ largestSquare = squareValue;
+ }
+ }
+ }
+ }
+
+ return largestSquare;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-99-largest-exponential.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-99-largest-exponential.md
new file mode 100644
index 00000000000..f836a312396
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-99-largest-exponential.md
@@ -0,0 +1,83 @@
+---
+id: 5900f3d01000cf542c50fee2
+title: 'Завдання 99: Найбільша експонента'
+challengeType: 5
+forumTopicId: 302216
+dashedName: problem-99-largest-exponential
+---
+
+# --description--
+
+Порівняння двох чисел, записаних у формі індексу, як $2^{11}$ і $3^7$, не важко, так як будь-який калькулятор підтвердить, що $2^{11} = 2048 < 3^7 = 2187$.
+
+Однак, підтвердження порівняння двох чисел $632382^{518061} < 519432^{525806}$ буде набагато важче, оскільки обидва числа містять більше трьох мільйонів цифр.
+
+Використовуючи 2D `baseExp` масив пар основа/показник ступеня, визначте пару з найбільшим числовим значенням.
+
+# --hints--
+
+`largestExponential(testArray1)` має повернути масив.
+
+```js
+assert(Array.isArray(largestExponential(_testArray1)));
+```
+
+`largestExponential(testArray1)` має вивести `[840237, 507276]`.
+
+```js
+assert.deepEqual(largestExponential(_testArray1), [840237, 507276]);
+```
+
+`largestExponential(testArray2)` має вивести `[895447, 504922]`.
+
+```js
+assert.deepEqual(largestExponential(_testArray2), [895447, 504922]);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const _testArray1 = [
+ [492798,527927],[30125,670983],[895603,504906],[450785,531539],[840237,507276],[380711,538522],[63577,625673],[76801,615157],[502694,527123]
+];
+const _testArray2 = [
+ [519432,525806],[632382,518061],[78864,613712],[466580,530130],[780495,510032],[525895,525320],[15991,714883],[960290,502358],[760018,511029],[166800,575487],[210884,564478],[555151,523163],[681146,515199],[563395,522587],[738250,512126],[923525,503780],[595148,520429],[177108,572629],[750923,511482],[440902,532446],[881418,505504],[422489,534197],[979858,501616],[685893,514935],[747477,511661],[167214,575367],[234140,559696],[940238,503122],[728969,512609],[232083,560102],[900971,504694],[688801,514772],[189664,569402],[891022,505104],[445689,531996],[119570,591871],[821453,508118],[371084,539600],[911745,504251],[623655,518600],[144361,582486],[352442,541775],[420726,534367],[295298,549387],[6530,787777],[468397,529976],[672336,515696],[431861,533289],[84228,610150],[805376,508857],[444409,532117],[33833,663511],[381850,538396],[402931,536157],[92901,604930],[304825,548004],[731917,512452],[753734,511344],[51894,637373],[151578,580103],[295075,549421],[303590,548183],[333594,544123],[683952,515042],[60090,628880],[951420,502692],[28335,674991],[714940,513349],[343858,542826],[549279,523586],[804571,508887],[260653,554881],[291399,549966],[402342,536213],[408889,535550],[40328,652524],[375856,539061],[768907,510590],[165993,575715],[976327,501755],[898500,504795],[360404,540830],[478714,529095],[694144,514472],[488726,528258],[841380,507226],[328012,544839],[22389,690868],[604053,519852],[329514,544641],[772965,510390],[492798,527927],[30125,670983],[895603,504906],[450785,531539],[840237,507276],[380711,538522],[63577,625673],[76801,615157],[502694,527123],[597706,520257],[310484,547206],[944468,502959],[121283,591152],[451131,531507],[566499,522367],[425373,533918],[40240,652665],[39130,654392],[714926,513355],[469219,529903],[806929,508783],[287970,550487],[92189,605332],[103841,599094],[671839,515725],[452048,531421],[987837,501323],[935192,503321],[88585,607450],[613883,519216],[144551,582413],[647359,517155],[213902,563816],[184120,570789],[258126,555322],[502546,527130],[407655,535678],[401528,536306],[477490,529193],[841085,507237],[732831,512408],[833000,507595],[904694,504542],[581435,521348],[455545,531110],[873558,505829],[94916,603796],[720176,513068],[545034,523891],[246348,557409],[556452,523079],[832015,507634],[173663,573564],[502634,527125],[250732,556611],[569786,522139],[216919,563178],[521815,525623],[92304,605270],[164446,576167],[753413,511364],[11410,740712],[448845,531712],[925072,503725],[564888,522477],[7062,780812],[641155,517535],[738878,512100],[636204,517828],[372540,539436],[443162,532237],[571192,522042],[655350,516680],[299741,548735],[581914,521307],[965471,502156],[513441,526277],[808682,508700],[237589,559034],[543300,524025],[804712,508889],[247511,557192],[543486,524008],[504383,526992],[326529,545039],[792493,509458],[86033,609017],[126554,589005],[579379,521481],[948026,502823],[404777,535969],[265767,554022],[266876,553840],[46631,643714],[492397,527958],[856106,506581],[795757,509305],[748946,511584],[294694,549480],[409781,535463],[775887,510253],[543747,523991],[210592,564536],[517119,525990],[520253,525751],[247926,557124],[592141,520626],[346580,542492],[544969,523902],[506501,526817],[244520,557738],[144745,582349],[69274,620858],[292620,549784],[926027,503687],[736320,512225],[515528,526113],[407549,535688],[848089,506927],[24141,685711],[9224,757964],[980684,501586],[175259,573121],[489160,528216],[878970,505604],[969546,502002],[525207,525365],[690461,514675],[156510,578551],[659778,516426],[468739,529945],[765252,510770],[76703,615230],[165151,575959],[29779,671736],[928865,503569],[577538,521605],[927555,503618],[185377,570477],[974756,501809],[800130,509093],[217016,563153],[365709,540216],[774508,510320],[588716,520851],[631673,518104],[954076,502590],[777828,510161],[990659,501222],[597799,520254],[786905,509727],[512547,526348],[756449,511212],[869787,505988],[653747,516779],[84623,609900],[839698,507295],[30159,670909],[797275,509234],[678136,515373],[897144,504851],[989554,501263],[413292,535106],[55297,633667],[788650,509637],[486748,528417],[150724,580377],[56434,632490],[77207,614869],[588631,520859],[611619,519367],[100006,601055],[528924,525093],[190225,569257],[851155,506789],[682593,515114],[613043,519275],[514673,526183],[877634,505655],[878905,505602],[1926,914951],[613245,519259],[152481,579816],[841774,507203],[71060,619442],[865335,506175],[90244,606469],[302156,548388],[399059,536557],[478465,529113],[558601,522925],[69132,620966],[267663,553700],[988276,501310],[378354,538787],[529909,525014],[161733,576968],[758541,511109],[823425,508024],[149821,580667],[269258,553438],[481152,528891],[120871,591322],[972322,501901],[981350,501567],[676129,515483],[950860,502717],[119000,592114],[392252,537272],[191618,568919],[946699,502874],[289555,550247],[799322,509139],[703886,513942],[194812,568143],[261823,554685],[203052,566221],[217330,563093],[734748,512313],[391759,537328],[807052,508777],[564467,522510],[59186,629748],[113447,594545],[518063,525916],[905944,504492],[613922,519213],[439093,532607],[445946,531981],[230530,560399],[297887,549007],[459029,530797],[403692,536075],[855118,506616],[963127,502245],[841711,507208],[407411,535699],[924729,503735],[914823,504132],[333725,544101],[176345,572832],[912507,504225],[411273,535308],[259774,555036],[632853,518038],[119723,591801],[163902,576321],[22691,689944],[402427,536212],[175769,572988],[837260,507402],[603432,519893],[313679,546767],[538165,524394],[549026,523608],[61083,627945],[898345,504798],[992556,501153],[369999,539727],[32847,665404],[891292,505088],[152715,579732],[824104,507997],[234057,559711],[730507,512532],[960529,502340],[388395,537687],[958170,502437],[57105,631806],[186025,570311],[993043,501133],[576770,521664],[215319,563513],[927342,503628],[521353,525666],[39563,653705],[752516,511408],[110755,595770],[309749,547305],[374379,539224],[919184,503952],[990652,501226],[647780,517135],[187177,570017],[168938,574877],[649558,517023],[278126,552016],[162039,576868],[658512,516499],[498115,527486],[896583,504868],[561170,522740],[747772,511647],[775093,510294],[652081,516882],[724905,512824],[499707,527365],[47388,642755],[646668,517204],[571700,522007],[180430,571747],[710015,513617],[435522,532941],[98137,602041],[759176,511070],[486124,528467],[526942,525236],[878921,505604],[408313,535602],[926980,503640],[882353,505459],[566887,522345],[3326,853312],[911981,504248],[416309,534800],[392991,537199],[622829,518651],[148647,581055],[496483,527624],[666314,516044],[48562,641293],[672618,515684],[443676,532187],[274065,552661],[265386,554079],[347668,542358],[31816,667448],[181575,571446],[961289,502320],[365689,540214],[987950,501317],[932299,503440],[27388,677243],[746701,511701],[492258,527969],[147823,581323],[57918,630985],[838849,507333],[678038,515375],[27852,676130],[850241,506828],[818403,508253],[131717,587014],[850216,506834],[904848,504529],[189758,569380],[392845,537217],[470876,529761],[925353,503711],[285431,550877],[454098,531234],[823910,508003],[318493,546112],[766067,510730],[261277,554775],[421530,534289],[694130,514478],[120439,591498],[213308,563949],[854063,506662],[365255,540263],[165437,575872],[662240,516281],[289970,550181],[847977,506933],[546083,523816],[413252,535113],[975829,501767],[361540,540701],[235522,559435],[224643,561577],[736350,512229],[328303,544808],[35022,661330],[307838,547578],[474366,529458],[873755,505819],[73978,617220],[827387,507845],[670830,515791],[326511,545034],[309909,547285],[400970,536363],[884827,505352],[718307,513175],[28462,674699],[599384,520150],[253565,556111],[284009,551093],[343403,542876],[446557,531921],[992372,501160],[961601,502308],[696629,514342],[919537,503945],[894709,504944],[892201,505051],[358160,541097],[448503,531745],[832156,507636],[920045,503924],[926137,503675],[416754,534757],[254422,555966],[92498,605151],[826833,507873],[660716,516371],[689335,514746],[160045,577467],[814642,508425],[969939,501993],[242856,558047],[76302,615517],[472083,529653],[587101,520964],[99066,601543],[498005,527503],[709800,513624],[708000,513716],[20171,698134],[285020,550936],[266564,553891],[981563,501557],[846502,506991],[334,1190800],[209268,564829],[9844,752610],[996519,501007],[410059,535426],[432931,533188],[848012,506929],[966803,502110],[983434,501486],[160700,577267],[504374,526989],[832061,507640],[392825,537214],[443842,532165],[440352,532492],[745125,511776],[13718,726392],[661753,516312],[70500,619875],[436952,532814],[424724,533973],[21954,692224],[262490,554567],[716622,513264],[907584,504425],[60086,628882],[837123,507412],[971345,501940],[947162,502855],[139920,584021],[68330,621624],[666452,516038],[731446,512481],[953350,502619],[183157,571042],[845400,507045],[651548,516910],[20399,697344],[861779,506331],[629771,518229],[801706,509026],[189207,569512],[737501,512168],[719272,513115],[479285,529045],[136046,585401],[896746,504860],[891735,505067],[684771,514999],[865309,506184],[379066,538702],[503117,527090],[621780,518717],[209518,564775],[677135,515423],[987500,501340],[197049,567613],[329315,544673],[236756,559196],[357092,541226],[520440,525733],[213471,563911],[956852,502490],[702223,514032],[404943,535955],[178880,572152],[689477,514734],[691351,514630],[866669,506128],[370561,539656],[739805,512051],[71060,619441],[624861,518534],[261660,554714],[366137,540160],[166054,575698],[601878,519990],[153445,579501],[279899,551729],[379166,538691],[423209,534125],[675310,515526],[145641,582050],[691353,514627],[917468,504026],[284778,550976],[81040,612235],[161699,576978],[616394,519057],[767490,510661],[156896,578431],[427408,533714],[254849,555884],[737217,512182],[897133,504851],[203815,566051],[270822,553189],[135854,585475],[778805,510111],[784373,509847],[305426,547921],[733418,512375],[732087,512448],[540668,524215],[702898,513996],[628057,518328],[640280,517587],[422405,534204],[10604,746569],[746038,511733],[839808,507293],[457417,530938],[479030,529064],[341758,543090],[620223,518824],[251661,556451],[561790,522696],[497733,527521],[724201,512863],[489217,528217],[415623,534867],[624610,518548],[847541,506953],[432295,533249],[400391,536421],[961158,502319],[139173,584284],[421225,534315],[579083,521501],[74274,617000],[701142,514087],[374465,539219],[217814,562985],[358972,540995],[88629,607424],[288597,550389],[285819,550812],[538400,524385],[809930,508645],[738326,512126],[955461,502535],[163829,576343],[826475,507891],[376488,538987],[102234,599905],[114650,594002],[52815,636341],[434037,533082],[804744,508880],[98385,601905],[856620,506559],[220057,562517],[844734,507078],[150677,580387],[558697,522917],[621751,518719],[207067,565321],[135297,585677],[932968,503404],[604456,519822],[579728,521462],[244138,557813],[706487,513800],[711627,513523],[853833,506674],[497220,527562],[59428,629511],[564845,522486],[623621,518603],[242689,558077],[125091,589591],[363819,540432],[686453,514901],[656813,516594],[489901,528155],[386380,537905],[542819,524052],[243987,557841],[693412,514514],[488484,528271],[896331,504881],[336730,543721],[728298,512647],[604215,519840],[153729,579413],[595687,520398],[540360,524240],[245779,557511],[924873,503730],[509628,526577],[528523,525122],[3509,847707],[522756,525555],[895447,504922],[44840,646067],[45860,644715],[463487,530404],[398164,536654],[894483,504959],[619415,518874],[966306,502129],[990922,501212],[835756,507474],[548881,523618],[453578,531282],[474993,529410],[80085,612879],[737091,512193],[50789,638638],[979768,501620],[792018,509483],[665001,516122],[86552,608694],[462772,530469],[589233,520821],[891694,505072],[592605,520594],[209645,564741],[42531,649269],[554376,523226],[803814,508929],[334157,544042],[175836,572970],[868379,506051],[658166,516520],[278203,551995],[966198,502126],[627162,518387],[296774,549165],[311803,547027],[843797,507118],[702304,514032],[563875,522553],[33103,664910],[191932,568841],[543514,524006],[506835,526794],[868368,506052],[847025,506971],[678623,515342],[876139,505726],[571997,521984],[598632,520198],[213590,563892],[625404,518497],[726508,512738],[689426,514738],[332495,544264],[411366,535302],[242546,558110],[315209,546555],[797544,509219],[93889,604371],[858879,506454],[124906,589666],[449072,531693],[235960,559345],[642403,517454],[720567,513047],[705534,513858],[603692,519870],[488137,528302],[157370,578285],[63515,625730],[666326,516041],[619226,518883],[443613,532186],[597717,520257],[96225,603069],[86940,608450],[40725,651929],[460976,530625],[268875,553508],[270671,553214],[363254,540500],[384248,538137],[762889,510892],[377941,538833],[278878,551890],[176615,572755],[860008,506412],[944392,502967],[608395,519571],[225283,561450],[45095,645728],[333798,544090],[625733,518476],[995584,501037],[506135,526853],[238050,558952],[557943,522972],[530978,524938],[634244,517949],[177168,572616],[85200,609541],[953043,502630],[523661,525484],[999295,500902],[840803,507246],[961490,502312],[471747,529685],[380705,538523],[911180,504275],[334149,544046],[478992,529065],[325789,545133],[335884,543826],[426976,533760],[749007,511582],[667067,516000],[607586,519623],[674054,515599],[188534,569675],[565185,522464],[172090,573988],[87592,608052],[907432,504424],[8912,760841],[928318,503590],[757917,511138],[718693,513153],[315141,546566],[728326,512645],[353492,541647],[638429,517695],[628892,518280],[877286,505672],[620895,518778],[385878,537959],[423311,534113],[633501,517997],[884833,505360],[883402,505416],[999665,500894],[708395,513697],[548142,523667],[756491,511205],[987352,501340],[766520,510705],[591775,520647],[833758,507563],[843890,507108],[925551,503698],[74816,616598],[646942,517187],[354923,541481],[256291,555638],[634470,517942],[930904,503494],[134221,586071],[282663,551304],[986070,501394],[123636,590176],[123678,590164],[481717,528841],[423076,534137],[866246,506145],[93313,604697],[783632,509880],[317066,546304],[502977,527103],[141272,583545],[71708,618938],[617748,518975],[581190,521362],[193824,568382],[682368,515131],[352956,541712],[351375,541905],[505362,526909],[905165,504518],[128645,588188],[267143,553787],[158409,577965],[482776,528754],[628896,518282],[485233,528547],[563606,522574],[111001,595655],[115920,593445],[365510,540237],[959724,502374],[938763,503184],[930044,503520],[970959,501956],[913658,504176],[68117,621790],[989729,501253],[567697,522288],[820427,508163],[54236,634794],[291557,549938],[124961,589646],[403177,536130],[405421,535899],[410233,535417],[815111,508403],[213176,563974],[83099,610879],[998588,500934],[513640,526263],[129817,587733],[1820,921851],[287584,550539],[299160,548820],[860621,506386],[529258,525059],[586297,521017],[953406,502616],[441234,532410],[986217,501386],[781938,509957],[461247,530595],[735424,512277],[146623,581722],[839838,507288],[510667,526494],[935085,503327],[737523,512167],[303455,548204],[992779,501145],[60240,628739],[939095,503174],[794368,509370],[501825,527189],[459028,530798],[884641,505363],[512287,526364],[835165,507499],[307723,547590],[160587,577304],[735043,512300],[493289,527887],[110717,595785],[306480,547772],[318593,546089],[179810,571911],[200531,566799],[314999,546580],[197020,567622],[301465,548487],[237808,559000],[131944,586923],[882527,505449],[468117,530003],[711319,513541],[156240,578628],[965452,502162],[992756,501148],[437959,532715],[739938,512046],[614249,519196],[391496,537356],[62746,626418],[688215,514806],[75501,616091],[883573,505412],[558824,522910],[759371,511061],[173913,573489],[891351,505089],[727464,512693],[164833,576051],[812317,508529],[540320,524243],[698061,514257],[69149,620952],[471673,529694],[159092,577753],[428134,533653],[89997,606608],[711061,513557],[779403,510081],[203327,566155],[798176,509187],[667688,515963],[636120,517833],[137410,584913],[217615,563034],[556887,523038],[667229,515991],[672276,515708],[325361,545187],[172115,573985],[13846,725685]
+];
+```
+
+## --seed-contents--
+
+```js
+function largestExponential(baseExp) {
+
+ return true;
+}
+
+// Only change code above this line
+
+const testArray1 = [
+ [492798,527927],[30125,670983],[895603,504906],[450785,531539],[840237,507276],[380711,538522],[63577,625673],[76801,615157],[502694,527123]
+];
+
+largestExponential(testArray1);
+```
+
+# --solutions--
+
+```js
+function largestExponential(baseExp) {
+ let maximum = 0;
+ let indexOfMaximum = 0;
+ for (let i = 1; i < baseExp.length; i++) {
+ const curValue = Math.log(baseExp[i][0]) * baseExp[i][1];
+ if (curValue > maximum) {
+ maximum = curValue;
+ indexOfMaximum = i;
+ }
+ }
+
+ return baseExp[indexOfMaximum];
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/100-doors.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/100-doors.md
new file mode 100644
index 00000000000..8f3fe802d89
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/100-doors.md
@@ -0,0 +1,67 @@
+---
+id: 594810f028c0303b75339acb
+title: 100 дверей
+challengeType: 5
+forumTopicId: 302217
+dashedName: 100-doors
+---
+
+# --description--
+
+Перед початком закриті усі 100 дверей у ряді. Ви створюєте 100 проходів біля дверей. При першому проходженні завітайте до кожних дверей та "переключіть" їх (якщо двері зачинені, то відчиніть їх; якщо ж відчинені - зачиніть). Удруге відвідайте кожні другі двері (тобто двері №2, №4, №6,...) і переключіть їх. У третій раз зайдіть до кожної третьої двері (тобто №3, №6, №9,...) тощо, поки ви не відвідаєте сотих дверей.
+
+# --instructions--
+
+Реалізуйте функцію, щоб визначити стан дверей після останнього проходження. Поверніть кінцевий результат в масив тільки з тими номерами дверей, які включені в масив, якщо ті відчинені.
+
+# --hints--
+
+`getFinalOpenedDoors` має бути функцією.
+
+```js
+assert(typeof getFinalOpenedDoors === 'function');
+```
+
+`getFinalOpenedDoors` має повернути масив.
+
+```js
+assert(Array.isArray(getFinalOpenedDoors(100)));
+```
+
+`getFinalOpenedDoors` має досягти правильного результату.
+
+```js
+assert.deepEqual(getFinalOpenedDoors(100), solution);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const solution = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100];
+```
+
+## --seed-contents--
+
+```js
+function getFinalOpenedDoors(numDoors) {
+
+}
+```
+
+# --solutions--
+
+```js
+function getFinalOpenedDoors(numDoors) {
+ // this is the final pattern (always squares).
+ // thus, the most efficient solution simply returns an array of squares up to numDoors).
+ const finalState = [];
+ let i = 1;
+ while (Math.pow(i, 2) <= numDoors) {
+ finalState.push(Math.pow(i, 2));
+ i++;
+ }
+ return finalState;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/24-game.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/24-game.md
new file mode 100644
index 00000000000..13db84a3d60
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/24-game.md
@@ -0,0 +1,203 @@
+---
+id: 5951e88f64ebf159166a1176
+title: Гра 24
+challengeType: 5
+forumTopicId: 302218
+dashedName: 24-game
+---
+
+# --description--
+
+[ Гра 24](https://en.wikipedia.org/wiki/24_Game) тестує можливість людини обчислювати в умі.
+
+Мета гри - впорядкувати чотири числа так, щоб при обчислюванні, результат дорівнював 24
+
+# --instructions--
+
+Реалізуйте функцію, яка бере за аргумент рядок з чотирьох цифр, причому кожна цифра від 1 до 9 (включно) з дозволеними повторами, що повертає арифметичний вираз, що буде дорівнювати 24. Якщо ж такого рішення не існує, то поверніть "рішення не існує".
+
+**Правила:**
+
+ Дозволені тільки такі оператори/функції: множення, ділення, додавання, віднімання.
+ Для збереження остачі при діленні, слід використовувати арифметику з плаваючою комою, раціональну арифметику тощо.
+ Формування багаторозрядних чисел з даних чисел не допускається. (Отже, відповідь 12 + 12 з даними 1, 2, 2 і 1 неправильна).
+ Порядок цифр, коли він даний, не має зберігатися.
+
+
+| Приклад вхідний | Приклад вихідний |
+| ------------------------- | ------------------------- |
+| solve24("4878"); | (7-8/8)\*4 |
+| solve24("1234"); | 3\*1\*4\*2 |
+| solve24("6789"); | (6\*8)/(9-7) |
+| solve24("1127"); | (1+7)\*(2+1) |
+
+# --hints--
+
+`solve24` має бути функцією.
+
+```js
+assert(typeof solve24 === 'function');
+```
+
+`solve24("4878")` має повернути `(7-8/8)*4` чи `4*(7-8/8)`
+
+```js
+assert(include(answers[0], removeParentheses(solve24(testCases[0]))));
+```
+
+`solve24("1234")` повинен повернути будь-яке розташування `1*2*3*4`
+
+```js
+assert(include(answers[1], removeParentheses(solve24(testCases[1]))));
+```
+
+`solve24("6789")` повинен повернути `(6*8)/(9-7)` чи `(8*6)/(9-7)`
+
+```js
+assert(include(answers[2], removeParentheses(solve24(testCases[2]))));
+```
+
+`solve24("1127")` має повернути перестановку `(1+7)*(1+2)`
+
+```js
+assert(include(answers[3], removeParentheses(solve24(testCases[3]))));
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const testCases = [
+ '4878',
+ '1234',
+ '6789',
+ '1127'
+];
+
+const answers = [
+ ['(7-8/8)*4', '4*(7-8/8)', '(4-8+7)*8', '(4+7-8)*8', '(7+4-8)*8', '(7-8+4)*8', '8*(4-8+7)', '8*(4+7-8)', '8*(7+4-8)', '8*(7-8+4)'],
+ ['1*2*3*4', '1*2*4*3', '1*3*2*4', '1*3*4*2', '1*4*2*3', '1*4*3*2', '2*1*3*4', '2*1*4*3', '2*3*1*4', '2*3*4*1', '2*4*3*1', '2*4*1*3', '3*1*2*4', '3*1*4*2', '3*2*1*4', '3*2*4*1', '3*4*1*2', '3*4*2*1', '4*1*2*3', '4*1*3*2', '4*2*1*3', '4*2*3*1', '4*3*1*2', '4*3*2*1', '(1+2+3)*4', '(1+3+2)*4', '(2+1+3)*4', '(2+3+1)*4', '(3+1+2)*4', '(3+2+1)*4', '4*(1+2+3)', '4*(2+1+3)', '4*(2+3+1)', '4*(3+1+2)', '4*(3+2+1)'],
+ ['(6*8)/(9-7)', '(8*6)/(9-7)', '6*8/(9-7)', '8*6/(9-7)'],
+ ['(1+7)*(2+1)', '(1+7)*(1+2)', '(1+2)*(1+7)', '(1+2)*(7+1)', '(2+1)*(1+7)', '(7+1)*(2+1)']
+];
+
+function include(ansArr, res) {
+ const index = ansArr.indexOf(res);
+ return index >= 0;
+}
+
+//The main method for detecting single parentheses
+function removeParentheses(ans) {
+ for (let i = 0; i < ans.length; i++) {
+ if (!isNaN(ans[i])) {
+ ans = removeParenthesesHelper(ans, i);
+ }
+ }
+ return ans;
+}
+
+//Helper to remove left and right parantheses
+function removeParenthesesHelper(ans, i) {
+ while (i > 0 && i < ans.length - 1) {
+ if (ans[i - 1] === '(' && ans[i + 1] === ')') {
+ //Paranthesis detected. Remove them.
+ ans = replaceChar(ans, '', i - 1);
+ ans = replaceChar(ans, '', i);
+ i--;
+ } else {
+ return ans;
+ }
+ }
+ return ans;
+}
+
+//Replace a character at a given index for the provided character
+function replaceChar(origString, replaceChar, index) {
+ let firstPart = origString.substr(0, index);
+ let lastPart = origString.substr(index + 1);
+ let newString = firstPart + replaceChar + lastPart;
+ return newString;
+}
+```
+
+## --seed-contents--
+
+```js
+function solve24 (numStr) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function solve24(numStr) {
+ const digitsArr = numStr.split('');
+ const answers = [];
+
+ const digitPermutations = [];
+ const operatorPermutations = [];
+
+ function generateDigitPermutations (digits, permutations = []) {
+ if (digits.length === 0) {
+ digitPermutations.push(permutations);
+ }
+ else {
+ for (let i = 0; i < digits.length; i++) {
+ const curr = digits.slice();
+ const next = curr.splice(i, 1);
+ generateDigitPermutations(curr.slice(), permutations.concat(next));
+ }
+ }
+ }
+
+ function generateOperatorPermutations (permutations = []) {
+ const operators = ['+', '-', '*', '/'];
+ if (permutations.length === 3) {
+ operatorPermutations.push(permutations);
+ }
+ else {
+ for (let i = 0; i < operators.length; i++) {
+ const curr = permutations.slice();
+ curr.push(operators[i]);
+ generateOperatorPermutations(curr);
+ }
+ }
+ }
+
+ generateDigitPermutations(digitsArr);
+ generateOperatorPermutations();
+
+ interleave();
+
+ return answers[0];
+
+ function interleave () {
+ for (let i = 0; i < digitPermutations.length; i++) {
+ for (let j = 0; j < operatorPermutations.length; j++) {
+ const d = digitPermutations[i];
+ const o = operatorPermutations[j];
+ const perm = [
+ `${d[0]}${o[0]}${d[1]}${o[1]}${d[2]}${o[2]}${d[3]}`,
+ `(${d[0]}${o[0]}${d[1]})${o[1]}${d[2]}${o[2]}${d[3]}`,
+ `${d[0]}${o[0]}(${d[1]}${o[1]}${d[2]})${o[2]}${d[3]}`,
+ `${d[0]}${o[0]}${d[1]}${o[1]}(${d[2]}${o[2]}${d[3]})`,
+ `${d[0]}${o[0]}(${d[1]}${o[1]}${d[2]}${o[2]}${d[3]})`,
+ `(${d[0]}${o[0]}${d[1]}${o[1]}${d[2]})${o[2]}${d[3]}`,
+ `(${d[0]}${o[0]}${d[1]})${o[1]}(${d[2]}${o[2]}${d[3]})`
+ ];
+
+ perm.forEach(combination => {
+ const res = eval(combination);
+
+ if (res === 24) {
+ return answers.push(combination);
+ }
+ });
+ }
+ }
+ }
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/9-billion-names-of-god-the-integer.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/9-billion-names-of-god-the-integer.md
new file mode 100644
index 00000000000..1e50f6c9f8f
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/9-billion-names-of-god-the-integer.md
@@ -0,0 +1,116 @@
+---
+id: 5949b579404977fbaefcd736
+title: Ціле число "9 мільярдів імен Бога"
+challengeType: 5
+forumTopicId: 302219
+dashedName: 9-billion-names-of-god-the-integer
+---
+
+# --description--
+
+Це завдання є варіацією [оповідання Артура Кларка](https://en.wikipedia.org/wiki/The Nine Billion Names of God#Plot_summary "wp: The Nine Billion Names of God#Plot_summary").
+
+(Той хто розв'язує завдання, має знати про наслідки виконання даного завдання.)
+
+Детальніше про те, що означає "name"(ім'я):
+
+
+ Ціле число 1 має 1 ім'я "1".
+ Ціле число 2 має 2 ім'я "1+1" і "2".
+ Ціле число 3 має 3 ім'я "1+1+1", "2+1" і "3".
+ Ціле число 4 має 5 імен "1+1+1+1", "2+1+1", "2+2", "3+1", "4".
+ Ціле число 5 має 7 імен "1+1+1+1+1", "2+1+1+1", "2+2+1", "3+1+1", "3+2", "4+1", "5".
+
+
+Це можна візуалізувати наступним чином:
+
+ 1
+ 1 1
+ 1 1 1
+ 1 2 1 1
+ 1 2 2 1 1
+1 3 3 2 1 1
+
+
+Де рядки $n$ відповідають цілому числу $n$ і кожна колонка $C$ у рядку $m$ зліва направо відповідає кількості імен, які починаються з $C$.
+
+Зауважте, що сума $n$-го рядку $P(n)$ - це функція розбиття цілого числа.
+
+# --instructions--
+
+Використовуйте функцію, що повертає суму $n$-го рядка.
+
+# --hints--
+
+`numberOfNames` має бути функцією.
+
+```js
+assert(typeof numberOfNames === 'function');
+```
+
+`numberOfNames(5)` має дорівнювати 7.
+
+```js
+assert.equal(numberOfNames(5), 7);
+```
+
+`numberOfNames(12)` має дорівнювати 77.
+
+```js
+assert.equal(numberOfNames(12), 77);
+```
+
+`numberOfNames(18)` має дорівнювати 385.
+
+```js
+assert.equal(numberOfNames(18), 385);
+```
+
+`numberOfNames(23)` має дорівнювати 1255.
+
+```js
+assert.equal(numberOfNames(23), 1255);
+```
+
+`numberOfNames(42)` має дорівнювати 53174.
+
+```js
+assert.equal(numberOfNames(42), 53174);
+```
+
+`numberOfNames(123)` має дорівнювати 2552338241.
+
+```js
+assert.equal(numberOfNames(123), 2552338241);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function numberOfNames(num) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function numberOfNames(num) {
+ const cache = [
+ [1]
+ ];
+ for (let l = cache.length; l < num + 1; l++) {
+ let Aa;
+ let Mi;
+ const r = [0];
+ for (let x = 1; x < l + 1; x++) {
+ r.push(r[r.length - 1] + (Aa = cache[l - x < 0 ? cache.length - (l - x) : l - x])[(Mi = Math.min(x, l - x)) < 0 ? Aa.length - Mi : Mi]);
+ }
+ cache.push(r);
+ }
+ return cache[num][cache[num].length - 1];
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/abc-problem.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/abc-problem.md
new file mode 100644
index 00000000000..fa283da9974
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/abc-problem.md
@@ -0,0 +1,136 @@
+---
+id: 594810f028c0303b75339acc
+title: Проблема ABC
+challengeType: 5
+forumTopicId: 302220
+dashedName: abc-problem
+---
+
+# --description--
+
+Вам дано набір кубиків ABC (наприклад, дитячі кубики з алфавітом). Існує 20 блоків з двома літерами на кожному кубику. Завершений алфавіт гарантовано є на всіх сторонах кубиків. Зразок кубиків:
+
+(B O)
+(X K)
+(D Q)
+(C P)
+(N A)
+(G T)
+(R E)
+(T G)
+(Q D)
+(F S)
+(J W)
+(H U)
+(V I)
+(A N)
+(O B)
+(E R)
+(F S)
+(L Y)
+(P C)
+(Z M)
+
+
+# --instructions--
+
+Реалізуйте функцію, яка бере рядок (слово) та визначає, чи можна написати слово з даного набору кубиків.
+
+Правила, які треба добре запам'ятати:
+
+
+ Після використання букви на кубику, цей кубик не можна використати знову.
+ Функція має бути чутливою до регістру.
+
+
+# --hints--
+
+`canMakeWord` має бути функцією.
+
+```js
+assert(typeof canMakeWord === 'function');
+```
+
+`canMakeWord` повинен повернути логічний тип даних.
+
+```js
+assert(typeof canMakeWord('hi') === 'boolean');
+```
+
+`canMakeWord("bark")` має повернути true.
+
+```js
+assert(canMakeWord(words[0]));
+```
+
+`canMakeWord("BooK")` має повернути false.
+
+```js
+assert(!canMakeWord(words[1]));
+```
+
+`canMakeWord("TReAT")` має повернути true.
+
+```js
+assert(canMakeWord(words[2]));
+```
+
+`canMakeWord("COMMON")` має повернути false.
+
+```js
+assert(!canMakeWord(words[3]));
+```
+
+`canMakeWord("squAD")` має повернути true.
+
+```js
+assert(canMakeWord(words[4]));
+```
+
+`canMakeWord("conFUSE")` має повернути true.
+
+```js
+assert(canMakeWord(words[5]));
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const words = ['bark', 'BooK', 'TReAT', 'COMMON', 'squAD', 'conFUSE'];
+```
+
+## --seed-contents--
+
+```js
+function canMakeWord(word) {
+
+}
+```
+
+# --solutions--
+
+```js
+function canMakeWord(word) {
+ const characters = 'BO XK DQ CP NA GT RE TG QD FS JW HU VI AN OB ER FS LY PC ZM';
+ const blocks = characters.split(' ').map(pair => pair.split(''));
+
+ const letters = [...word.toUpperCase()];
+ let length = letters.length;
+ const copy = new Set(blocks);
+
+ letters.forEach(letter => {
+ for (let block of copy) {
+ const index = block.indexOf(letter);
+
+ if (index !== -1) {
+ length--;
+ copy.delete(block);
+ break;
+ }
+ }
+ });
+ return !length;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/abundant-deficient-and-perfect-number-classifications.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/abundant-deficient-and-perfect-number-classifications.md
new file mode 100644
index 00000000000..9573b2e28a0
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/abundant-deficient-and-perfect-number-classifications.md
@@ -0,0 +1,95 @@
+---
+id: 594810f028c0303b75339acd
+title: 'Класифікації надлишкових, недостатніх та досконалих чисел'
+challengeType: 5
+forumTopicId: 302221
+dashedName: abundant-deficient-and-perfect-number-classifications
+---
+
+# --description--
+
+Ці три класифікації додатних цілих чисел визначені на основі їхніх власних дільників.
+
+Нехай $P(n)$ буде сумою дільників `n`, де всі власні дільники являються додатними цілими числами `n`, на відміну від `n`.
+
+Якщо `P(n) < n`, то `n` являється `deficient`
+
+Якщо `P(n) === n`, тоді `n` являється `perfect`
+
+Якщо `P(n) > n`, тоді `n` являється `abundant`
+
+**Приклад**: `6` має власний дільник `1`, `2` та `3`. `1 + 2 + 3 = 6`, тому `6` являється досконалим числом.
+
+# --instructions--
+
+Реалізуйте функцію, яка вираховує скільки цілих чисел від `1` до `num` (включно) є в кожному з трьох класів. Виведіть результат як масив у наступному форматі `[deficient, perfect, abundant]`.
+
+# --hints--
+
+`getDPA` має бути функцією.
+
+```js
+assert(typeof getDPA === 'function');
+```
+
+`getDPA(5000)` має повернути масив.
+
+```js
+assert(Array.isArray(getDPA(5000)));
+```
+
+`getDPA(5000)` повернений масив має мати довжину `3`.
+
+```js
+assert(getDPA(5000).length === 3);
+```
+
+`getDPA(5000)` має повернути `[3758, 3, 1239]`.
+
+```js
+assert.deepEqual(getDPA(5000), [3758, 3, 1239]);
+```
+
+`getDPA(10000)` має повернути `[7508, 4, 2488]`.
+
+```js
+assert.deepEqual(getDPA(10000), [7508, 4, 2488]);
+```
+
+`getDPA(20000)` має повернути `[15043, 4, 4953]`.
+
+```js
+assert.deepEqual(getDPA(20000), [15043, 4, 4953]);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function getDPA(num) {
+
+}
+```
+
+# --solutions--
+
+```js
+function getDPA(num) {
+ const dpa = [1, 0, 0];
+ for (let n = 2; n <= num; n += 1) {
+ let ds = 1;
+ const e = Math.sqrt(n);
+ for (let d = 2; d < e; d += 1) {
+ if (n % d === 0) {
+ ds += d + (n / d);
+ }
+ }
+ if (n % e === 0) {
+ ds += e;
+ }
+ dpa[ds < n ? 0 : ds === n ? 1 : 2] += 1;
+ }
+ return dpa;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/accumulator-factory.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/accumulator-factory.md
new file mode 100644
index 00000000000..64a98eb480c
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/accumulator-factory.md
@@ -0,0 +1,79 @@
+---
+id: 594810f028c0303b75339ace
+title: Акумуляторна фабрика
+challengeType: 5
+forumTopicId: 302222
+dashedName: accumulator-factory
+---
+
+# --description--
+
+Проблема, спричинена [Paul Graham](https://en.wikipedia.org/wiki/Paul_Graham_(programmer)) полягає у створенні функції, яка приймає один (числовий) аргумент, і яка повертає іншу функцію, тобто акумулятор. Повернена акумуляторна функція в свою чергу також бере один числовий аргумент, і повертає суму усіх числових значень, прийнятих до цього часу до цього акумулятора (включаючи початкове значення, передане при створенні акумулятора).
+
+# --instructions--
+
+Створіть функцію, яка приймає число $n$ і генерує акумуляторні функції, які повертають суму кожного числа, яке до них додадуть.
+
+**Правила:**
+
+Не використовуйте глобальні змінні.
+
+**Підказка:**
+
+Закриття економить зовнішній стан.
+
+# --hints--
+
+`accumulator` має бути функцією.
+
+```js
+assert(typeof accumulator === 'function');
+```
+
+`accumulator(0)` має відображати функцію.
+
+```js
+assert(typeof accumulator(0) === 'function');
+```
+
+`accumulator(0)(2)` має відображати число.
+
+```js
+assert(typeof accumulator(0)(2) === 'number');
+```
+
+Перехід у значеннях 3, -4, 1.5 і 5 має видати 5,5.
+
+```js
+assert(testFn(5) === 5.5);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const testFn = typeof accumulator(3) === 'function' && accumulator(3);
+if (testFn) {
+ testFn(-4);
+ testFn(1.5);
+}
+```
+
+## --seed-contents--
+
+```js
+function accumulator(sum) {
+
+}
+```
+
+# --solutions--
+
+```js
+function accumulator(sum) {
+ return function(n) {
+ return sum += n;
+ };
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/ackermann-function.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/ackermann-function.md
new file mode 100644
index 00000000000..11893489070
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/ackermann-function.md
@@ -0,0 +1,71 @@
+---
+id: 594810f028c0303b75339acf
+title: Функція Акермана
+challengeType: 5
+forumTopicId: 302223
+dashedName: ackermann-function
+---
+
+# --description--
+
+Функція Акермана є класичним прикладом рекурсивної функції, особливо тому, що вона не є примітивною рекурсивною функцією. Вона дуже швидко зростає у значенні, зростає також і дерево викликів.
+
+Функція Акермана зазвичай визначається наступним чином:
+
+$A(m, n) = \\begin{cases} n+1 & \\mbox{if } m = 0 \\\\ A(m-1, 1) & \\mbox{if } m > 0 \\mbox{ and } n = 0 \\\\ A(m-1, A(m, n-1)) & \\mbox{if } m > 0 \\mbox{ and } n > 0. \\end{cases}$
+
+Її аргументи ніколи не є від'ємними, і вона завжди закінчується.
+
+# --instructions--
+
+Напишіть функцію, що повертає значення $A(m, n)$. Довільна точність є бажаною (оскільки функція зростає так швидко), але не є обов'язковою.
+
+# --hints--
+
+`ack` має бути функцією.
+
+```js
+assert(typeof ack === 'function');
+```
+
+`ack(0, 0)` повинен повернутися як 1.
+
+```js
+assert(ack(0, 0) === 1);
+```
+
+`ack(1, 1)` має повернутися як 3.
+
+```js
+assert(ack(1, 1) === 3);
+```
+
+`ack(2, 5)` повинен повернутися як 13.
+
+```js
+assert(ack(2, 5) === 13);
+```
+
+`ack(3, 3)` повинен повертатися як 61.
+
+```js
+assert(ack(3, 3) === 61);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function ack(m, n) {
+
+}
+```
+
+# --solutions--
+
+```js
+function ack(m, n) {
+ return m === 0 ? n + 1 : ack(m - 1, n === 0 ? 1 : ack(m, n - 1));
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/align-columns.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/align-columns.md
new file mode 100644
index 00000000000..4400d86ff1c
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/align-columns.md
@@ -0,0 +1,189 @@
+---
+id: 594810f028c0303b75339ad0
+title: Вирівнювання стовпців
+challengeType: 5
+forumTopicId: 302224
+dashedName: align-columns
+---
+
+# --description--
+
+Дано масив з багатьма рядками, де поля в рядку зображені одним символом `$`, напишіть програму, яка вирівнює кожен стовпець полів, переконавшись, що слова в кожному стовпці розділені принаймні одним пробілом. Крім того, дозвольте кожному слову у стовпці вирівнюватись ліворуч, праворуч або вирівнюватись по центру стовпця.
+
+# --instructions--
+
+Щоб перевірити свої програми, використовуйте наступний текст:
+
+```js
+const testText = [
+ 'Given$a$text$file$of$many$lines',
+ 'where$fields$within$a$line$',
+ 'are$delineated$by$a$single$"dollar"$character',
+ 'write$a$program',
+ 'that$aligns$each$column$of$fields',
+ 'by$ensuring$that$words$in$each$',
+ 'column$are$separated$by$at$least$one$space.',
+ 'Further,$allow$for$each$word$in$a$column$to$be$either$left$',
+ 'justified,$right$justified',
+ 'or$center$justified$within$its$column.'
+];
+```
+
+**Зауважте, що:**
+
+- Приклади рядків текстів для введення можуть у кінці мати символ долара.
+- Усі стовпці повинні мати однакове вирівнювання.
+- Декілька послідовно розміщених символів пробілу у кінці рядків, є неважливими для цілей завдання.
+- Вихідний текст буде відображатися моношироким шрифтом у звичайному текстовому редакторі або базовому терміналі. Рядки в ньому слід з'єднати, використовуючи новий символ рядка (`\n`).
+- Мінімальний простір між стовпцями слід обчислювати з даного тексту, а не жорстко його кодувати.
+- Не обов'язково додавати розділові символи між стовпцями або навколо них.
+
+Наприклад, один з рядків взятий із `testText`, після вирівнювання праворуч, ліворуч та посередині відповідно:
+
+```js
+' column are separated by at least one space.\n'
+'column are separated by at least one space.\n'
+' column are separated by at least one space.\n'
+```
+
+# --hints--
+
+`formatText` має бути функцією.
+
+```js
+assert(typeof formatText === 'function');
+```
+
+`formatText(testText, 'right')` має створити стовпець із текстом, який буде вирівняний по правій стороні.
+
+```js
+assert.strictEqual(formatText(_testText, 'right'), rightAligned);
+```
+
+`formatText(testText, 'left')` має створити стовпець із текстом, який буде вирівняний по лівій стороні.
+
+```js
+assert.strictEqual(formatText(_testText, 'left'), leftAligned);
+```
+
+`formatText(testText, 'center')` має створити стовпець із текстом, який буде вирівняний по центру.
+
+```js
+assert.strictEqual(formatText(_testText, 'center'), centerAligned);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const _testText = [
+ 'Given$a$text$file$of$many$lines',
+ 'where$fields$within$a$line$',
+ 'are$delineated$by$a$single$"dollar"$character',
+ 'write$a$program',
+ 'that$aligns$each$column$of$fields$',
+ 'by$ensuring$that$words$in$each$',
+ 'column$are$separated$by$at$least$one$space.',
+ 'Further,$allow$for$each$word$in$a$column$to$be$either$left$',
+ 'justified,$right$justified',
+ 'or$center$justified$within$its$column.'
+];
+
+const rightAligned = ' Given a text file of many lines\n' +
+' where fields within a line \n' +
+' are delineated by a single "dollar" character\n' +
+' write a program\n' +
+' that aligns each column of fields \n' +
+' by ensuring that words in each \n' +
+' column are separated by at least one space.\n' +
+' Further, allow for each word in a column to be either left \n' +
+'justified, right justified\n' +
+' or center justified within its column.';
+
+const leftAligned = 'Given a text file of many lines \n' +
+'where fields within a line \n' +
+'are delineated by a single "dollar" character\n' +
+'write a program \n' +
+'that aligns each column of fields \n' +
+'by ensuring that words in each \n' +
+'column are separated by at least one space.\n' +
+'Further, allow for each word in a column to be either left \n' +
+'justified, right justified\n' +
+'or center justified within its column. ';
+
+const centerAligned = ' Given a text file of many lines \n' +
+' where fields within a line \n' +
+' are delineated by a single \"dollar\" character\n' +
+' write a program \n' +
+' that aligns each column of fields \n' +
+' by ensuring that words in each \n' +
+' column are separated by at least one space.\n' +
+' Further, allow for each word in a column to be either left \n' +
+'justified, right justified\n' +
+' or center justified within its column. ';
+```
+
+## --seed-contents--
+
+```js
+function formatText(input, justification) {
+
+}
+
+const testText = [
+ 'Given$a$text$file$of$many$lines',
+ 'where$fields$within$a$line$',
+ 'are$delineated$by$a$single$"dollar"$character',
+ 'write$a$program',
+ 'that$aligns$each$column$of$fields$',
+ 'by$ensuring$that$words$in$each$',
+ 'column$are$separated$by$at$least$one$space.',
+ 'Further,$allow$for$each$word$in$a$column$to$be$either$left$',
+ 'justified,$right$justified',
+ 'or$center$justified$within$its$column.'
+];
+```
+
+# --solutions--
+
+```js
+String.prototype.repeat = function (n) { return new Array(1 + parseInt(n)).join(this); };
+
+function formatText(input, justification) {
+ let x, y, max, cols = 0, diff, left, right;
+ for (x = 0; x < input.length; x++) {
+ input[x] = input[x].split('$');
+ if (input[x].length > cols) {
+ cols = input[x].length;
+ }
+ }
+ for (x = 0; x < cols; x++) {
+ max = 0;
+ for (y = 0; y < input.length; y++) {
+ if (input[y][x] && max < input[y][x].length) {
+ max = input[y][x].length;
+ }
+ }
+ for (y = 0; y < input.length; y++) {
+ if (input[y][x]) {
+ diff = (max - input[y][x].length) / 2;
+ left = ' '.repeat(Math.floor(diff));
+ right = ' '.repeat(Math.ceil(diff));
+ if (justification === 'left') {
+ right += left; left = '';
+ }
+ if (justification === 'right') {
+ left += right; right = '';
+ }
+ input[y][x] = left + input[y][x] + right;
+ }
+ }
+ }
+ for (x = 0; x < input.length; x++) {
+ input[x] = input[x].join(' ');
+ }
+ input = input.join('\n');
+ return input;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/amicable-pairs.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/amicable-pairs.md
new file mode 100644
index 00000000000..63f0a93946f
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/amicable-pairs.md
@@ -0,0 +1,126 @@
+---
+id: 5949b579404977fbaefcd737
+title: Дружні числа
+challengeType: 5
+forumTopicId: 302225
+dashedName: amicable-pairs
+---
+
+# --description--
+
+Цілі числа $N$ та $M$ - це [дружні числа](https://en.wikipedia.org/wiki/Amicable numbers "wp: Amicable numbers") if $N \\neq M$ і сума [власних дільників](https://rosettacode.org/wiki/Proper divisors "Proper divisors") of $N$ ($\\mathrm{sum}(\\mathrm{propDivs}(N))$) $= M$, як і $\\mathrm{sum}(\\mathrm{propDivs}(M)) = N$.
+
+**Приклад:**
+
+**1184** та **1210** - це дружні числа з власними дільниками:
+
+
+ 1, 2, 4, 8, 16, 32, 37, 74, 148, 296, 592 та
+ 1, 2, 5, 10, 11, 22, 55, 110, 121, 242, 605 також.
+
+
+# --instructions--
+
+Порахуйте та покажіть тут дружні числа нижче 20 000 (тут їх вісім).
+
+# --hints--
+
+`amicablePairsUpTo` мають бути функцією.
+
+```js
+assert(typeof amicablePairsUpTo === 'function');
+```
+
+`amicablePairsUpTo(300)` повинен повертатися як `[[220,284]]`.
+
+```js
+assert.deepEqual(amicablePairsUpTo(300), answer300);
+```
+
+`amicablePairsUpTo(3000)` повинен повертатися як `[[220,284],[1184,1210],[2620,2924]]`.
+
+```js
+assert.deepEqual(amicablePairsUpTo(3000), answer3000);
+```
+
+`amicablePairsUpTo(20000)` повинен повертатися як `[[220,284],[1184,1210],[2620,2924],[5020,5564],[6232,6368],[10744,10856],[12285,14595],[17296,18416]]`.
+
+```js
+assert.deepEqual(amicablePairsUpTo(20000), answer20000);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const answer300 = [[220, 284]];
+const answer3000 = [
+ [220, 284],
+ [1184, 1210],
+ [2620, 2924]
+];
+const answer20000 = [
+ [220, 284],
+ [1184, 1210],
+ [2620, 2924],
+ [5020, 5564],
+ [6232, 6368],
+ [10744, 10856],
+ [12285, 14595],
+ [17296, 18416]
+];
+```
+
+## --seed-contents--
+
+```js
+function amicablePairsUpTo(maxNum) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+// amicablePairsUpTo :: Int -> [(Int, Int)]
+function amicablePairsUpTo(maxNum) {
+ return range(1, maxNum)
+ .map(x => properDivisors(x)
+ .reduce((a, b) => a + b, 0))
+ .reduce((a, m, i, lst) => {
+ const n = i + 1;
+
+ return (m > n) && lst[m - 1] === n ?
+ a.concat([
+ [n, m]
+ ]) : a;
+ }, []);
+}
+
+// properDivisors :: Int -> [Int]
+function properDivisors(n) {
+ if (n < 2) return [];
+
+ const rRoot = Math.sqrt(n);
+ const intRoot = Math.floor(rRoot);
+ const blnPerfectSquare = rRoot === intRoot;
+ const lows = range(1, intRoot)
+ .filter(x => (n % x) === 0);
+
+ return lows.concat(lows.slice(1)
+ .map(x => n / x)
+ .reverse()
+ .slice(blnPerfectSquare | 0));
+}
+
+// Int -> Int -> Maybe Int -> [Int]
+function range(m, n, step) {
+ const d = (step || 1) * (n >= m ? 1 : -1);
+
+ return Array.from({
+ length: Math.floor((n - m) / d) + 1
+ }, (_, i) => m + (i * d));
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/averages-mode.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/averages-mode.md
new file mode 100644
index 00000000000..07316d41fe0
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/averages-mode.md
@@ -0,0 +1,79 @@
+---
+id: 594d8d0ab97724821379b1e6
+title: Середні значення/Режим
+challengeType: 5
+forumTopicId: 302226
+dashedName: averagesmode
+---
+
+# --description--
+
+Напишіть програму для пошуку значення [режиму](https://en.wikipedia.org/wiki/Mode (statistics) "wp: Mode (statistics)") колекції.
+
+Випадок, коли колекція є порожньою, можна ігнорувати. Необхідно бути обережним у випадку, коли режим не є унікальним.
+
+Якщо недоцільно або неможливо підтримувати загальну колекцію, по можливості використовуйте вектор (масив). Якщо недоцільно або неможливо підтримувати невизначений тип значення, то використовуйте цілі числа.
+
+# --hints--
+
+`mode` повинен бути функцією.
+
+```js
+assert(typeof mode === 'function');
+```
+
+`mode([1, 3, 6, 6, 6, 6, 7, 7, 12, 12, 17])` повинен дорівнювати `[6]`
+
+```js
+assert.deepEqual(mode(arr1), [6]);
+```
+
+`mode([1, 2, 4, 4, 1])` повинен дорівнювати `[1, 4]`.
+
+```js
+assert.deepEqual(mode(arr2).sort(), [1, 4]);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const arr1 = [1, 3, 6, 6, 6, 6, 7, 7, 12, 12, 17];
+const arr2 = [1, 2, 4, 4, 1];
+```
+
+## --seed-contents--
+
+```js
+function mode(arr) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function mode(arr) {
+ const counter = {};
+ let result = [];
+ let max = 0;
+ // for (const i in arr) {
+ arr.forEach(el => {
+ if (!(el in counter)) {
+ counter[el] = 0;
+ }
+ counter[el]++;
+
+ if (counter[el] === max) {
+ result.push(el);
+ }
+ else if (counter[el] > max) {
+ max = counter[el];
+ result = [el];
+ }
+ });
+ return result;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/averages-pythagorean-means.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/averages-pythagorean-means.md
new file mode 100644
index 00000000000..9a9c943b8dd
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/averages-pythagorean-means.md
@@ -0,0 +1,144 @@
+---
+id: 594d966a1467eb84194f0086
+title: Піфагорові середні
+challengeType: 5
+forumTopicId: 302227
+dashedName: averagespythagorean-means
+---
+
+# --description--
+
+Розрахуйте всі три [ Піфагорових середніх ](https://en.wikipedia.org/wiki/Pythagorean means "wp: Pythagorean means") набору цілих чисел від $1$ до $10$ (включно).
+
+Покажіть, що $A(x_1,\\ldots,x_n) \\geq G(x_1,\\ldots,x_n) \\geq H(x_1,\\ldots,x_n)$ для цього набору цілих чисел.
+
+
+ Найпоширеніший із трьох середніх — середнє арифметичне — сума елементів набору, поділена на їх кількість:
+ $ A(x_1, \ldots, x_n) = \frac{x_1 + \cdots + x_n}{n}$
+ Середнє геометричне — це $n$-й корінь добутку кількості елементів:
+ $ G(x_1, \ldots, x_n) = \sqrt[n]{x_1 \cdots x_n} $
+ Середнє гармонійне — $n$, поділене на суму кожного оберненого елемента набору:
+$ H(x_1, \ldots, x_n) = \frac{n}{\frac{1}{x_1} + \cdots + \frac{1}{x_n}} $
+
+
+# --instructions--
+
+При написанні функції, врахуйте, що вхідні дані — впорядкований масив всіх включених чисел.
+
+Для відповіді, будь ласка, виведіть об'єкт у наступному форматі:
+
+```js
+{
+ values: {
+ Arithmetic: 5.5,
+ Geometric: 4.528728688116765,
+ Harmonic: 3.414171521474055
+ },
+ test: 'is A >= G >= H ? yes'
+}
+```
+
+# --hints--
+
+`pythagoreanMeans` має бути функцією.
+
+```js
+assert(typeof pythagoreanMeans === 'function');
+```
+
+`pythagoreanMeans([1, 2, ..., 10])` має дорівнювати тому ж результату, що й вище.
+
+```js
+assert.deepEqual(pythagoreanMeans(range1), answer1);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const range1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+const answer1 = {
+ values: {
+ Arithmetic: 5.5,
+ Geometric: 4.528728688116765,
+ Harmonic: 3.414171521474055
+ },
+ test: 'is A >= G >= H ? yes'
+};
+```
+
+## --seed-contents--
+
+```js
+function pythagoreanMeans(rangeArr) {
+
+}
+```
+
+# --solutions--
+
+```js
+function pythagoreanMeans(rangeArr) {
+ // arithmeticMean :: [Number] -> Number
+ const arithmeticMean = xs =>
+ foldl((sum, n) => sum + n, 0, xs) / length(xs);
+
+ // geometricMean :: [Number] -> Number
+ const geometricMean = xs =>
+ raise(foldl((product, x) => product * x, 1, xs), 1 / length(xs));
+
+ // harmonicMean :: [Number] -> Number
+ const harmonicMean = xs =>
+ length(xs) / foldl((invSum, n) => invSum + (1 / n), 0, xs);
+
+ // GENERIC FUNCTIONS ------------------------------------------------------
+
+ // A list of functions applied to a list of arguments
+ // <*> :: [(a -> b)] -> [a] -> [b]
+ const ap = (fs, xs) => //
+ Array.prototype.concat(...fs.map(f => //
+ Array.prototype.concat(...xs.map(x => [f(x)]))));
+
+ // foldl :: (b -> a -> b) -> b -> [a] -> b
+ const foldl = (f, a, xs) => xs.reduce(f, a);
+
+ // length :: [a] -> Int
+ const length = xs => xs.length;
+
+ // mapFromList :: [(k, v)] -> Dictionary
+ const mapFromList = kvs =>
+ foldl((a, [k, v]) =>
+ (a[(typeof k === 'string' && k)] = v, a), {}, kvs);
+
+ // raise :: Num -> Int -> Num
+ const raise = (n, e) => Math.pow(n, e);
+/*
+ // show :: a -> String
+ // show :: a -> Int -> String
+ const show = (...x) =>
+ JSON.stringify.apply(
+ null, x.length > 1 ? [x[0], null, x[1]] : x
+ );
+*/
+ // zip :: [a] -> [b] -> [(a,b)]
+ const zip = (xs, ys) =>
+ xs.slice(0, Math.min(xs.length, ys.length))
+ .map((x, i) => [x, ys[i]]);
+
+ // TEST -------------------------------------------------------------------
+ // mean :: Dictionary
+ const mean = mapFromList(zip(
+ ['Arithmetic', 'Geometric', 'Harmonic'],
+ ap([arithmeticMean, geometricMean, harmonicMean], [
+ rangeArr
+ ])
+ ));
+
+ return {
+ values: mean,
+ test: `is A >= G >= H ? ${mean.Arithmetic >= mean.Geometric &&
+ mean.Geometric >= mean.Harmonic ? 'yes' : 'no'}`
+ };
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/averages-root-mean-square.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/averages-root-mean-square.md
new file mode 100644
index 00000000000..abc93c85227
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/averages-root-mean-square.md
@@ -0,0 +1,57 @@
+---
+id: 594da033de4190850b893874
+title: Середнє значення квадратного кореня
+challengeType: 5
+forumTopicId: 302228
+dashedName: averagesroot-mean-square
+---
+
+# --description--
+
+Визначте [ середнє квадратне ](https://en.wikipedia.org/wiki/Root mean square "wp: Root mean square") від 1 до 10 включно.
+
+* середнє квадратне * також відоме своїми ініціалами СК (або ск), а також як **quadratic mean**.
+
+СК вираховується як середнє значення квадратів чисел в квадратних коренях:
+
+$$x\_{\\mathrm{rms}} = \\sqrt {{{x_1}^2 + {x_2}^2 + \\cdots + {x_n}^2} \\over n}. $$
+
+# --hints--
+
+`rms` має бути функцією.
+
+```js
+assert(typeof rms === 'function');
+```
+
+`rms([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])` має дорівнювати `6.2048368229954285`.
+
+```js
+assert.equal(rms(arr1), answer1);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+const answer1 = 6.2048368229954285;
+```
+
+## --seed-contents--
+
+```js
+function rms(arr) {
+
+}
+```
+
+# --solutions--
+
+```js
+function rms(arr) {
+ const sumOfSquares = arr.reduce((s, x) => s + x * x, 0);
+ return Math.sqrt(sumOfSquares / arr.length);
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/babbage-problem.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/babbage-problem.md
new file mode 100644
index 00000000000..cc21c9a8e64
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/babbage-problem.md
@@ -0,0 +1,78 @@
+---
+id: 594db4d0dedb4c06a2a4cefd
+title: Задача Беббіджа
+challengeType: 5
+forumTopicId: 302229
+dashedName: babbage-problem
+---
+
+# --description--
+
+[Чарльз Беббідж](https://en.wikipedia.org/wiki/Charles_Babbage "wp: Charles_Babbage"), дивлячись у майбутнє на завдання, які зможе вирішити його аналітична машина, навів такий приклад:
+
+
+ Яке найменше натуральне число, квадрат якого закінчується цифрами 269,696?
+ Беббідж, лист до лорда Боудена, 1837; див. Hollingdale and Tootill, Електронні комп’ютери , друге видання, 1970, стор. 125.
+
+
+Він думав, що відповідь може бути 99,736, квадрат якого становить 9,947,269,696; але він не міг бути певним.
+
+Завдання полягає в тому, щоб з'ясувати, чи відповідь Беббіджа була правильною.
+
+# --instructions--
+
+Реалізуйте функцію, щоб повернути найменше ціле число, що задовольняє задачу Беббіджа. Якщо Беббідж мав рацію, то поверніть число Беббіджа.
+
+# --hints--
+
+`babbage` має бути функцією.
+
+```js
+assert(typeof babbage === 'function');
+```
+
+`babbage(99736, 269696)` не повинна повертати 99736 (відповідь має бути меншою).
+
+```js
+assert.equal(babbage(babbageAns, endDigits), answer);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const babbageAns = 99736;
+const endDigits = 269696;
+const answer = 25264;
+```
+
+## --seed-contents--
+
+```js
+function babbage(babbageNum, endDigits) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function babbage(babbageAns, endDigits) {
+ const babbageNum = Math.pow(babbageAns, 2);
+ const babbageStartDigits = parseInt(babbageNum.toString().replace('269696', ''));
+ let answer = 99736;
+
+ // count down from this answer and save any sqrt int result. return lowest one
+ for (let i = babbageStartDigits; i >= 0; i--) {
+ const num = parseInt(i.toString().concat('269696'));
+ const result = Math.sqrt(num);
+ if (result === Math.floor(Math.sqrt(num))) {
+ answer = result;
+ }
+ }
+
+ return answer;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/balanced-brackets.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/balanced-brackets.md
new file mode 100644
index 00000000000..93e8e2a7b39
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/balanced-brackets.md
@@ -0,0 +1,188 @@
+---
+id: 594dc6c729e5700999302b45
+title: Збалансовані дужки
+challengeType: 5
+forumTopicId: 302230
+dashedName: balanced-brackets
+---
+
+# --description--
+
+Визначте, чи збалансований згенерований рядок дужок; тобто чи він складається повністю з пар відкритих/закритих дужок (у правильному порядку), і кожна розміщена у відповідному місці.
+
+**Приклади:**
+| Вихідна інформація | Результат |
+| ------------------------- | --------- |
+| \[] | true |
+| ]\[ | false |
+| [][] | true |
+| ]\[] | false |
+| \[]]\[\[] | false |
+| \[\[\[\[]]]] | true |
+
+# --hints--
+
+`isBalanced` має бути функцією.
+
+```js
+assert(typeof isBalanced === 'function');
+```
+
+Функція `isBalanced("[]")` має повернути true.
+
+```js
+assert(isBalanced(testCases[0]));
+```
+
+Функція `isBalanced("]][[[][][][]][")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[1]));
+```
+
+Функція `isBalanced("[][[[[][][[[]]]]]]")` має повернути true.
+
+```js
+assert(isBalanced(testCases[2]));
+```
+
+Функція `isBalanced("][")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[3]));
+```
+
+Функція `isBalanced("[[[]]]][[]")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[4]));
+```
+
+Функція `isBalanced("][[]")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[5]));
+```
+
+Функція `isBalanced("][[][]][[[]]")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[6]));
+```
+
+Функція `isBalanced("[[][]]][")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[7]));
+```
+
+Функція `isBalanced("[[[]]][[]]]][][[")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[8]));
+```
+
+Функція `isBalanced("[]][[]]][[[[][]]")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[9]));
+```
+
+Функція `isBalanced("][]][[][")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[10]));
+```
+
+Функція `isBalanced("[[]][[][]]")` має повернути true.
+
+```js
+assert(isBalanced(testCases[11]));
+```
+
+Функція `isBalanced("[[]]")` має повернути true.
+
+```js
+assert(isBalanced(testCases[12]));
+```
+
+Функція `isBalanced("]][]][[]][[[")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[13]));
+```
+
+Функція `isBalanced("][]][][[")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[14]));
+```
+
+Функція `isBalanced("][][")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[15]));
+```
+
+Функція `isBalanced("[]]]")` має повернути false.
+
+```js
+assert(!isBalanced(testCases[16]));
+```
+
+Функція `isBalanced("")` має повернути true.
+
+```js
+assert(isBalanced(testCases[17]));
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const testCases = [
+ '[]',
+ ']][[[][][][]][',
+ '[][[[[][][[[]]]]]]',
+ '][',
+ '[[[]]]][[]',
+ '][[]',
+ '][[][]][[[]]',
+ '[[][]]][',
+ '[[[]]][[]]]][][[',
+ '[]][[]]][[[[][]]',
+ '][]][[][',
+ '[[]][[][]]',
+ '[[]]',
+ ']][]][[]][[[',
+ '][]][][[',
+ '][][',
+ '[]]]',
+ ''
+];
+```
+
+## --seed-contents--
+
+```js
+function isBalanced(str) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function isBalanced(str) {
+ if (str === '') return true;
+ let a = str;
+ let b;
+ do {
+ b = a;
+ a = a.replace(/\[\]/g, '');
+ } while (a !== b);
+ return !a;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/circles-of-given-radius-through-two-points.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/circles-of-given-radius-through-two-points.md
new file mode 100644
index 00000000000..3cd40accd9a
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/circles-of-given-radius-through-two-points.md
@@ -0,0 +1,150 @@
+---
+id: 5951815dd895584b06884620
+title: Кола з заданим радіусом через дві точки
+challengeType: 5
+forumTopicId: 302231
+dashedName: circles-of-given-radius-through-two-points
+---
+
+# --description--
+
+Якщо відомі дві точки на площині та радіус, зазвичай можна провести два кола заданого радіусу через ці точки.
+
+**Винятки:**
+
+
+ Нульовий радіус вважатиметься таким, що ніколи не описує кола (крім випадків, коли точки збігаються).
+ Якщо точки збігаються, тоді можна описати безкінечне число кіл з точкою їх окружності, якщо радіус кола також не дорівнює нулю, що перетворить коло на точку.
+ Якщо точки утворюють діаметр, то повернеться одне коло.
+ Якщо точки розташовані надто далеко, тоді кола намалювати не можна.
+
+
+# --instructions--
+
+Реалізуйте функцію, яка приймає дві точки і радіус і повертається як два кола через ці точки. Для кожного кола, що утвориться, встановіть координати для центру кожного кола округлені до чотирьох десяткових чисел. Поверніть кожну координату як масив і координати як масив масивів.
+
+**Для складних випадків повертається наступне:**
+
+
+ Якщо точки розташовані на діаметрі, повернеться одна точка. Якщо ж радіус також є нульовим, тоді повернеться "Radius Zero".
+ Якщо точки збігаються, поверніть "Точку збігу. Безкінечні рішення".
+ Якщо точки розташовані далі, ніж діаметр, поверніть "Без перетину. Точки, які віддалені одна від одної, відносно діаметра кола".
+
+
+**Приклади вхідних даних:**
+
+ p1 p2 r
+0.1234, 0.9876 0.8765, 0.2345 2.0
+0.0000, 2.0000 0.0000, 0.0000 1.0
+0.1234, 0.9876 0.1234, 0.9876 2.0
+0.1234, 0.9876 0.8765, 0.2345 0.5
+0.1234, 0.9876 0.1234, 0.9876 0.0
+
+
+# --hints--
+
+`getCircles` має бути функцією.
+
+```js
+assert(typeof getCircles === 'function');
+```
+
+`getCircles([0.1234, 0.9876], [0.8765, 0.2345], 2.0)` повинен повернутися як `[[1.8631, 1.9742], [-0.8632, -0.7521]]`.
+
+```js
+assert.deepEqual(getCircles(...testCases[0]), answers[0]);
+```
+
+`getCircles([0.0000, 2.0000], [0.0000, 0.0000], 1.0)` повинен повернутися як `[0, 1]`
+
+```js
+assert.deepEqual(getCircles(...testCases[1]), answers[1]);
+```
+
+`getCircles([0.1234, 0.9876], [0.1234, 0.9876], 2.0)` має повертатися `Точка збігу. Безкінечні рішення"`
+
+```js
+assert.deepEqual(getCircles(...testCases[2]), answers[2]);
+```
+
+`getCircles([0.1234, 0.9876], [0.8765, 0.2345], 0.5)` має повертатися `Без перетину. Точки, які віддалені одна від одної, відносно діаметра кола"`
+
+```js
+assert.deepEqual(getCircles(...testCases[3]), answers[3]);
+```
+
+`getCircles([0.1234, 0.9876], [0.1234, 0.9876], 0.0)` має повертатися як `Radius Zero`
+
+```js
+assert.deepEqual(getCircles(...testCases[4]), answers[4]);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const testCases = [
+ [[0.1234, 0.9876], [0.8765, 0.2345], 2.0],
+ [[0.0000, 2.0000], [0.0000, 0.0000], 1.0],
+ [[0.1234, 0.9876], [0.1234, 0.9876], 2.0],
+ [[0.1234, 0.9876], [0.8765, 0.2345], 0.5],
+ [[0.1234, 0.9876], [0.1234, 0.9876], 0.0]
+];
+const answers = [
+ [[1.8631, 1.9742], [-0.8632, -0.7521]],
+ [0, 1],
+ 'Coincident point. Infinite solutions',
+ 'No intersection. Points further apart than circle diameter',
+ 'Radius Zero'
+];
+```
+
+## --seed-contents--
+
+```js
+function getCircles(...args) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+const hDist = (p1, p2) => Math.hypot(...p1.map((e, i) => e - p2[i])) / 2;
+const pAng = (p1, p2) => Math.atan(p1.map((e, i) => e - p2[i]).reduce((p, c) => c / p, 1));
+const solveF = (p, r) => t => [parseFloat((r * Math.cos(t) + p[0]).toFixed(4)), parseFloat((r * Math.sin(t) + p[1]).toFixed(4))];
+const diamPoints = (p1, p2) => p1.map((e, i) => parseFloat((e + (p2[i] - e) / 2).toFixed(4)));
+
+function getCircles(...args) {
+ const [p1, p2, s] = args;
+ const solve = solveF(p1, s);
+ const halfDist = hDist(p1, p2);
+
+ let msg = [];
+ switch (Math.sign(s - halfDist)) {
+ case 0:
+ msg = s ? diamPoints(p1, p2) :
+ 'Radius Zero';
+ break;
+ case 1:
+ if (!halfDist) {
+ msg = 'Coincident point. Infinite solutions';
+ }
+ else {
+ const theta = pAng(p1, p2);
+ const theta2 = Math.acos(halfDist / s);
+ [1, -1].map(e => solve(theta + e * theta2)).forEach(
+ e => msg.push(e));
+ }
+ break;
+ case -1:
+ msg = 'No intersection. Points further apart than circle diameter';
+ break;
+ default:
+ msg = 'Reached the default';
+ }
+ return msg;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/closest-pair-problem.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/closest-pair-problem.md
new file mode 100644
index 00000000000..82cce950f60
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/closest-pair-problem.md
@@ -0,0 +1,414 @@
+---
+id: 5951a53863c8a34f02bf1bdc
+title: Задача про найближчу пару
+challengeType: 5
+forumTopicId: 302232
+dashedName: closest-pair-problem
+---
+
+# --description--
+
+Надайте функцію для пошуку двох найближчих точок серед поданого набору точок у двох вимірах.
+
+Найпростіше рішення це $O(n^2)$ алгоритм (який ми можемо назвати *brute-force algorithm*); цей псевдо-код (з використанням індексів) може бути простим:
+
+bruteForceClosestPair of P(1), P(2), ... P(N)
+if N < 2 then
+ return ∞
+else
+ minDistance ← |P(1) - P(2)|
+ minPoints ← { P(1), P(2) }
+ foreach i ∈ [1, N-1]
+ foreach j ∈ [i+1, N]
+ if |P(i) - P(j)| < minDistance then
+ minDistance ← |P(i) - P(j)|
+ minPoints ← { P(i), P(j) }
+ endif
+ endfor
+ endfor
+ return minDistance, minPoints
+endif
+
+
+Кращий алгоритм базується на рекурсивному розподілі та підхопленні, який є псевдо-кодом $O(n\log n)$:
+
+closestPair of (xP, yP)
+ where xP is P(1) .. P(N) sorted by x coordinate, and
+ yP is P(1) .. P(N) sorted by y coordinate (ascending order)
+if N ≤ 3 then
+ return closest points of xP using brute-force algorithm
+else
+ xL ← points of xP from 1 to ⌈N/2⌉
+ xR ← points of xP from ⌈N/2⌉+1 to N
+ xm ← xP(⌈N/2⌉)x
+ yL ← { p ∈ yP : px ≤ xm }
+ yR ← { p ∈ yP : px > xm }
+ (dL, pairL) ← closestPair of (xL, yL)
+ (dR, pairR) ← closestPair of (xR, yR)
+ (dmin, pairMin) ← (dR, pairR)
+ if dL < dR then
+ (dmin, pairMin) ← (dL, pairL)
+ endif
+ yS ← { p ∈ yP : |xm - px | < dmin }
+ nS ← number of points in yS
+ (closest, closestPair) ← (dmin, pairMin)
+ for i from 1 to nS - 1
+ k ← i + 1
+ while k ≤ nS and yS(k)y - yS(i)y < dmin
+ if |yS(k) - yS(i)| < closest then
+ (closest, closestPair) ← (|yS(k) - yS(i)|, {yS(k), yS(i)})
+ endif
+ k ← k + 1
+ endwhile
+ endfor
+ return closest, closestPair
+endif
+
+
+Для вхідних даних, слід очікувати, що аргумент буде масивом з `Point` об'єктами, і `x` та `y` заданими числами. Поверніть об'єкт, що містить ключові пари значень для `distance` та `pair` (пара двох найближчих точок).
+
+Наприклад, `getClosestPair` з вхідним масивом `points`:
+
+```js
+const points = [
+ new Point(1, 2),
+ new Point(3, 3),
+ new Point(2, 2)
+];
+```
+
+Має повернути:
+
+```js
+{
+ distance: 1,
+ pair: [
+ {
+ x: 1,
+ y: 2
+ },
+ {
+ x: 2,
+ y: 2
+ }
+ ]
+}
+```
+
+**Note:** Сортуйте `pair` масиви за їхніми `x` значеннями у зростаючому порядку.
+
+
+# --hints--
+
+`getClosestPair` має бути функцією.
+
+```js
+assert(typeof getClosestPair === 'function');
+```
+
+`getClosestPair(points1).distance` має бути `0.0894096443343775`.
+
+```js
+assert.equal(getClosestPair(points1).distance, answer1.distance);
+```
+
+`getClosestPair(points1).pair` має бути `[ { x: 7.46489, y: 4.6268 }, { x: 7.46911, y: 4.71611 } ]`.
+
+```js
+assert.deepEqual(
+ JSON.parse(JSON.stringify(getClosestPair(points1))).pair,
+ answer1.pair
+);
+```
+
+`getClosestPair(points2).distance` має бути `65.06919393998976`.
+
+```js
+assert.equal(getClosestPair(points2).distance, answer2.distance);
+```
+
+`getClosestPair(points2).pair` має бути `[ { x: 37134, y: 1963 }, { x: 37181, y: 2008 } ]`.
+
+```js
+assert.deepEqual(
+ JSON.parse(JSON.stringify(getClosestPair(points2))).pair,
+ answer2.pair
+);
+```
+
+`getClosestPair(points3).distance` має бути `6754.625082119658`.
+
+```js
+assert.equal(getClosestPair(points3).distance, answer3.distance);
+```
+
+`getClosestPair(points3).pair` має бути `[ { x: 46817, y: 64975 }, { x: 48953, y: 58567 } ]`.
+
+```js
+assert.deepEqual(
+ JSON.parse(JSON.stringify(getClosestPair(points3))).pair,
+ answer3.pair
+);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const points1 = [
+ new Point(0.748501, 4.09624),
+ new Point(3.00302, 5.26164),
+ new Point(3.61878, 9.52232),
+ new Point(7.46911, 4.71611),
+ new Point(5.7819, 2.69367),
+ new Point(2.34709, 8.74782),
+ new Point(2.87169, 5.97774),
+ new Point(6.33101, 0.463131),
+ new Point(7.46489, 4.6268),
+ new Point(1.45428, 0.087596)
+];
+
+const answer1 = {
+ distance: 0.0894096443343775,
+ pair: [
+ {
+ x: 7.46489,
+ y: 4.6268
+ },
+ {
+ x: 7.46911,
+ y: 4.71611
+ }
+ ]
+};
+
+const points2 = [
+ new Point(37100, 13118),
+ new Point(37134, 1963),
+ new Point(37181, 2008),
+ new Point(37276, 21611),
+ new Point(37307, 9320)
+];
+
+const answer2 = {
+ distance: 65.06919393998976,
+ pair: [
+ {
+ x: 37134,
+ y: 1963
+ },
+ {
+ x: 37181,
+ y: 2008
+ }
+ ]
+};
+
+const points3 = [
+ new Point(16910, 54699),
+ new Point(14773, 61107),
+ new Point(95547, 45344),
+ new Point(95951, 17573),
+ new Point(5824, 41072),
+ new Point(8769, 52562),
+ new Point(21182, 41881),
+ new Point(53226, 45749),
+ new Point(68180, 887),
+ new Point(29322, 44017),
+ new Point(46817, 64975),
+ new Point(10501, 483),
+ new Point(57094, 60703),
+ new Point(23318, 35472),
+ new Point(72452, 88070),
+ new Point(67775, 28659),
+ new Point(19450, 20518),
+ new Point(17314, 26927),
+ new Point(98088, 11164),
+ new Point(25050, 56835),
+ new Point(8364, 6892),
+ new Point(37868, 18382),
+ new Point(23723, 7701),
+ new Point(55767, 11569),
+ new Point(70721, 66707),
+ new Point(31863, 9837),
+ new Point(49358, 30795),
+ new Point(13041, 39744),
+ new Point(59635, 26523),
+ new Point(25859, 1292),
+ new Point(1551, 53890),
+ new Point(70316, 94479),
+ new Point(48549, 86338),
+ new Point(46413, 92747),
+ new Point(27186, 50426),
+ new Point(27591, 22655),
+ new Point(10905, 46153),
+ new Point(40408, 84202),
+ new Point(52821, 73520),
+ new Point(84865, 77388),
+ new Point(99819, 32527),
+ new Point(34404, 75657),
+ new Point(78457, 96615),
+ new Point(42140, 5564),
+ new Point(62175, 92342),
+ new Point(54958, 67112),
+ new Point(4092, 19709),
+ new Point(99415, 60298),
+ new Point(51090, 52158),
+ new Point(48953, 58567)
+];
+
+const answer3 = {
+ distance: 6754.625082119658,
+ pair: [
+ {
+ x: 46817,
+ y: 64975
+ },
+ {
+ x: 48953,
+ y: 58567
+ }
+ ]
+}
+```
+
+## --seed-contents--
+
+```js
+const Point = function(x, y) {
+ this.x = x;
+ this.y = y;
+};
+Point.prototype.getX = function() {
+ return this.x;
+};
+Point.prototype.getY = function() {
+ return this.y;
+};
+
+function getClosestPair(pointsArr) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+const Point = function(x, y) {
+ this.x = x;
+ this.y = y;
+};
+Point.prototype.getX = function() {
+ return this.x;
+};
+Point.prototype.getY = function() {
+ return this.y;
+};
+
+const mergeSort = function mergeSort(points, comp) {
+ if(points.length < 2) return points;
+
+ var n = points.length,
+ i = 0,
+ j = 0,
+ leftN = Math.floor(n / 2),
+ rightN = leftN;
+
+ var leftPart = mergeSort( points.slice(0, leftN), comp),
+ rightPart = mergeSort( points.slice(rightN), comp );
+
+ var sortedPart = [];
+
+ while((i < leftPart.length) && (j < rightPart.length)) {
+ if(comp(leftPart[i], rightPart[j]) < 0) {
+ sortedPart.push(leftPart[i]);
+ i += 1;
+ }
+ else {
+ sortedPart.push(rightPart[j]);
+ j += 1;
+ }
+ }
+ while(i < leftPart.length) {
+ sortedPart.push(leftPart[i]);
+ i += 1;
+ }
+ while(j < rightPart.length) {
+ sortedPart.push(rightPart[j]);
+ j += 1;
+ }
+ return sortedPart;
+};
+
+const closestPair = function _closestPair(Px, Py) {
+ if(Px.length < 2) return { distance: Infinity, pair: [ new Point(0, 0), new Point(0, 0) ] };
+ if(Px.length < 3) {
+ //find euclid distance
+ var d = Math.sqrt( Math.pow(Math.abs(Px[1].x - Px[0].x), 2) + Math.pow(Math.abs(Px[1].y - Px[0].y), 2) );
+ return {
+ distance: d,
+ pair: [ Px[0], Px[1] ]
+ };
+ }
+
+ var n = Px.length,
+ leftN = Math.floor(n / 2),
+ rightN = leftN;
+
+ var Xl = Px.slice(0, leftN),
+ Xr = Px.slice(rightN),
+ Xm = Xl[leftN - 1],
+ Yl = [],
+ Yr = [];
+ //separate Py
+ for(var i = 0; i < Py.length; i += 1) {
+ if(Py[i].x <= Xm.x)
+ Yl.push(Py[i]);
+ else
+ Yr.push(Py[i]);
+ }
+
+ var dLeft = _closestPair(Xl, Yl),
+ dRight = _closestPair(Xr, Yr);
+
+ var minDelta = dLeft.distance,
+ closestPair = dLeft.pair;
+ if(dLeft.distance > dRight.distance) {
+ minDelta = dRight.distance;
+ closestPair = dRight.pair;
+ }
+
+ //filter points around Xm within delta (minDelta)
+ var closeY = [];
+ for(i = 0; i < Py.length; i += 1) {
+ if(Math.abs(Py[i].x - Xm.x) < minDelta) closeY.push(Py[i]);
+ }
+ //find min within delta. 8 steps max
+ for(i = 0; i < closeY.length; i += 1) {
+ for(var j = i + 1; j < Math.min( (i + 8), closeY.length ); j += 1) {
+ var d = Math.sqrt( Math.pow(Math.abs(closeY[j].x - closeY[i].x), 2) + Math.pow(Math.abs(closeY[j].y - closeY[i].y), 2) );
+ if(d < minDelta) {
+ minDelta = d;
+ closestPair = [ closeY[i], closeY[j] ]
+ }
+ }
+ }
+
+ return {
+ distance: minDelta,
+ pair: closestPair.sort((pointA, pointB) => pointA.x - pointB.x)
+ };
+};
+
+function getClosestPair(points) {
+ const sortX = function(a, b) { return (a.x < b.x) ? -1 : ((a.x > b.x) ? 1 : 0); }
+ const sortY = function(a, b) { return (a.y < b.y) ? -1 : ((a.y > b.y) ? 1 : 0); }
+
+ const Px = mergeSort(points, sortX);
+ const Py = mergeSort(points, sortY);
+
+ return closestPair(Px, Py);
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/combinations.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/combinations.md
new file mode 100644
index 00000000000..7464bd8b22a
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/combinations.md
@@ -0,0 +1,95 @@
+---
+id: 5958469238c0d8d2632f46db
+title: Комбінації
+challengeType: 5
+forumTopicId: 302233
+dashedName: combinations
+---
+
+# --description--
+
+Маючи невід'ємні цілі числа `m` і `n`, створіть усі розміри `m` комбінацій цілих чисел від `0` (нуля) до `n-1` у сортованому порядку (кожна комбінація сортується і вся таблиця сортується).
+
+**Наприклад:**
+
+`3` комб. `5` дає:
+
+0 1 2
+0 1 3
+0 1 4
+0 2 3
+0 2 4
+0 3 4
+1 2 3
+1 2 4
+1 3 4
+2 3 4
+
+
+# --hints--
+
+`combinations` мають бути функцією.
+
+```js
+assert(typeof combinations === 'function');
+```
+
+Функція `combinations(3, 5)` повинна вертати `[[0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 2, 3], [0, 2, 4], [0, 3, 4], [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]`.
+
+```js
+assert.deepEqual(combinations(testInput1[0], testInput1[1]), testOutput1);
+```
+
+Функція `combinations(4, 6)` повинна вертати `[[0,1,2,3], [0,1,2,4], [0,1,2,5], [0,1,3,4], [0,1,3,5], [0,1,4,5], [0,2,3,4], [0,2,3,5], [0,2,4,5], [0,3,4,5], [1,2,3,4], [1,2,3,5], [1,2,4,5], [1,3,4,5], [2,3,4,5]]`
+
+```js
+assert.deepEqual(combinations(testInput2[0], testInput2[1]), testOutput2);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const testInput1 = [3, 5];
+const testOutput1 = [[0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 2, 3], [0, 2, 4], [0, 3, 4], [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]];
+
+const testInput2 = [4, 6];
+const testOutput2 = [[0, 1, 2, 3], [0, 1, 2, 4], [0, 1, 2, 5], [0, 1, 3, 4], [0, 1, 3, 5], [0, 1, 4, 5], [0, 2, 3, 4], [0, 2, 3, 5], [0, 2, 4, 5], [0, 3, 4, 5], [1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [2, 3, 4, 5]];
+```
+
+## --seed-contents--
+
+```js
+function combinations(m, n) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function combinations(m, n) {
+ const nArr = [...Array(n).keys()];
+
+ return (function generateCombinations (size, numArr) {
+ const ret = [];
+
+ for (let i = 0; i < numArr.length; i++) {
+ if (size === 1) {
+ ret.push([numArr[i]]);
+ }
+ else {
+ const sub = generateCombinations(size - 1, numArr.slice(i + 1, numArr.length));
+ for (let subI = 0; subI < sub.length; subI++) {
+ const next = sub[subI];
+ next.unshift(numArr[i]);
+ ret.push(next);
+ }
+ }
+ }
+ return ret;
+ }(m, nArr));
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/comma-quibbling.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/comma-quibbling.md
new file mode 100644
index 00000000000..7bae9e953c1
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/comma-quibbling.md
@@ -0,0 +1,101 @@
+---
+id: 596e414344c3b2872167f0fe
+title: Comma quibbling (створення рядків значень розділених комою)
+challengeType: 5
+forumTopicId: 302234
+dashedName: comma-quibbling
+---
+
+# --description--
+
+Comma quibbling це завдання вперше встановлене Еріком Ліппертом в його блозі [blog](https://blogs.msdn.com/b/ericlippert/archive/2009/04/15/comma-quibbling.aspx).
+
+# --instructions--
+
+Напишіть функцію для генерації вихідного рядка, який є об'єднанням вхідних слів з списку/послідовності, де:
+
+
+ Введення без слів повертає вихідний рядок лише з двох дужок ("{}")
+ Введення лише одного слова, наприклад ["ABC"], повертає вихідний рядок з слова всередині двох дужок, наприклад "{ABC}"
+ Введення двох слів, наприклад ["ABC", "DEF"], повертає вихідний рядок з двох слів всередині двох дужок з розділяючим словом " and ", наприклад "{ABC and DEF}"
+ Введення трьох і більше слів, наприклад ["ABC", "DEF", "G", "H"], повертає вихідний рядок з усіх слів, крім останнього, розділеного на ", ", а останнє слово розділене допоможіним " and " і всіма дужками; наприклад "{ABC, DEF, G and H}"
+
+
+Перевірте вашу функцію з наступною серією вхідних даних, показуючи ваш вихідний результат тут на сторінці:
+
+
+ [] # (Без вхідних слів).
+ ["ABC"]
+ ["ABC", "DEF"]
+ ["ABC", "DEF", "G", "H"]
+
+
+**Зверніть увагу:** Припустіть, що слова не є порожніми рядками у верхньому регістрі для цього завдання.
+
+# --hints--
+
+`quibble` має бути функцією.
+
+```js
+assert(typeof quibble === 'function');
+```
+
+Функція `quibble(["ABC"])` має повернути рядок.
+
+```js
+assert(typeof quibble(['ABC']) === 'string');
+```
+
+Функція `quibble([])` має повернути "{}".
+
+```js
+assert.equal(quibble(testCases[0]), results[0]);
+```
+
+Функція `quibble(["ABC"])` має повернути "{ABC}".
+
+```js
+assert.equal(quibble(testCases[1]), results[1]);
+```
+
+Функція `quibble(["ABC", "DEF"])` має повернути "{ABC and DEF}".
+
+```js
+assert.equal(quibble(testCases[2]), results[2]);
+```
+
+Функція `quibble(["ABC", "DEF", "G", "H"])` має повернути "{ABC,DEF,G and H}".
+
+```js
+assert.equal(quibble(testCases[3]), results[3]);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const testCases = [[], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]];
+const results = ["{}", "{ABC}", "{ABC and DEF}", "{ABC,DEF,G and H}"];
+```
+
+## --seed-contents--
+
+```js
+function quibble(words) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function quibble(words) {
+ return "{" +
+ words.slice(0, words.length - 1).join(",") +
+ (words.length > 1 ? " and " : "") +
+ (words[words.length - 1] || '') +
+ "}";
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/compare-a-list-of-strings.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/compare-a-list-of-strings.md
new file mode 100644
index 00000000000..cc5af86ed56
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/compare-a-list-of-strings.md
@@ -0,0 +1,132 @@
+---
+id: 596e457071c35c882915b3e4
+title: Порівняйте список рядків
+challengeType: 5
+forumTopicId: 302235
+dashedName: compare-a-list-of-strings
+---
+
+# --description--
+
+Маючи список [list](https://en.wikipedia.org/wiki/List_(abstract_data_type) "wp: List\_(abstract_data_type)") з довільної кількості рядків, реалізуйте функцію для кожної з наступних умов:
+
+
+ перевірте, чи всі вони лексично рівні
+ перевірте, чи кожен рядок лексично менший за той, що після нього (тобто чи список у порядку зростання)
+
+
+# --hints--
+
+`allEqual` має бути функцією.
+
+```js
+assert(typeof allEqual === 'function');
+```
+
+`azSorted` має бути функцією.
+
+```js
+assert(typeof azSorted === 'function');
+```
+
+Функція `allEqual(["AA", "AA", "AA", "AA"])` має повернути true.
+
+```js
+assert(allEqual(testCases[0]));
+```
+
+Функція `azSorted(["AA", "AA", "AA", "AA"])` має повернути false.
+
+```js
+assert(!azSorted(testCases[0]));
+```
+
+Функція `allEqual(["AA", "ACB", "BB", "CC"])` має повернути false.
+
+```js
+assert(!allEqual(testCases[1]));
+```
+
+Функція `azSorted(["AA", "ACB", "BB", "CC"])` має повернути true.
+
+```js
+assert(azSorted(testCases[1]));
+```
+
+Функція `allEqual([])` має повернути true.
+
+```js
+assert(allEqual(testCases[2]));
+```
+
+Функція `azSorted([])` має повернути true.
+
+```js
+assert(azSorted(testCases[2]));
+```
+
+Функція `allEqual(["AA"])` має повернути true.
+
+```js
+assert(allEqual(testCases[3]));
+```
+
+Функція `azSorted(["AA"])` має повернути true.
+
+```js
+assert(azSorted(testCases[3]));
+```
+
+Функція `allEqual(["BB", "AA"])` має повернути false.
+
+```js
+assert(!allEqual(testCases[4]));
+```
+
+Функція `azSorted(["BB", "AA"])` має повернути false.
+
+```js
+assert(!azSorted(testCases[4]));
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const testCases = [['AA', 'AA', 'AA', 'AA'], ['AA', 'ACB', 'BB', 'CC'], [], ['AA'], ['BB', 'AA']];
+```
+
+## --seed-contents--
+
+```js
+function allEqual(arr) {
+
+ return true;
+}
+
+function azSorted(arr) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function allEqual(a) {
+ let out = true;
+ let i = 0;
+ while (++i < a.length) {
+ out = out && (a[i - 1] === a[i]);
+ } return out;
+}
+
+function azSorted(a) {
+ let out = true;
+ let i = 0;
+ while (++i < a.length) {
+ out = out && (a[i - 1] < a[i]);
+ } return out;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/convert-seconds-to-compound-duration.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/convert-seconds-to-compound-duration.md
new file mode 100644
index 00000000000..4194dd54193
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/convert-seconds-to-compound-duration.md
@@ -0,0 +1,128 @@
+---
+id: 596fd036dc1ab896c5db98b1
+title: Конвертувати секунди в одиниці часу
+challengeType: 5
+forumTopicId: 302236
+dashedName: convert-seconds-to-compound-duration
+---
+
+# --description--
+
+Запустити функцію яка:
+
+
+ бере додатнє ціле число, що представляє тривалість в секундах як вхідні дані (наприклад 100), і
+ повертає рядок, котрий показує таку ж тривалість перетворену в тижні, дні, години, хвилини і секунди, як детально описано нижче ( наприклад 1 min, 40 sec).
+
+
+Демонстрація того, що вона передає наступні три тестові випадки:
+
+Тестові випадки
+
+| Вхідне число | Вихідне число |
+| ------------ | ------------------------- |
+| 7259 | 2 hr, 59 sec |
+| 86400 | 1 d |
+| 6000000 | 9 wk, 6 d, 10 hr, 40 min |
+
+Деталі
+
+
+ Варто використовувати наступні п'ять одиниць:
+| Unit | Suffix used in Output | Conversion |
+| ------ | --------------------- | --------------------- |
+| week |!!crwdBlockTags_18_sgaTkcolBdwrc!! | 1 week = 7 days |
+| day |!!crwdBlockTags_19_sgaTkcolBdwrc!! | 1 day = 24 hours |
+| hour |!!crwdBlockTags_20_sgaTkcolBdwrc!! | 1 hour = 60 minutes |
+| minute |!!crwdBlockTags_21_sgaTkcolBdwrc!! | 1 minute = 60 seconds |
+| second |!!crwdBlockTags_22_sgaTkcolBdwrc!! | --- |
+
+
+
+ Однак only містить кількість не нульових значень при виході (наприклад 1 d а не 0 wk, 1 d, 0 hr, 0 min, 0 sec).
+
+
+ Надавати перевагу максимально великим одиницям над меншими одиницями (наприклад повернути 2 min, 10 sec а не 1 min, 70 sec чи 130 sec).
+
+
+ Мімікрійне форматування, показане у тестових випадках ( кількість відсортована від найбільшої одиниці до найменшої і відокремлена комою+пробілом; значення і одиниця всіх значень відділена пробілом).
+
+
+
+# --hints--
+
+`convertSeconds` має бути функцією.
+
+```js
+assert(typeof convertSeconds === 'function');
+```
+
+`convertSeconds(7259)` має повернути `2 hr, 59 sec`.
+
+```js
+assert.equal(convertSeconds(testCases[0]), results[0]);
+```
+
+`convertSeconds(86400)` має повернути `1 d`.
+
+```js
+assert.equal(convertSeconds(testCases[1]), results[1]);
+```
+
+`convertSeconds(6000000)` має повернути `9 wk, 6 d, 10 hr, 40 min`.
+
+```js
+assert.equal(convertSeconds(testCases[2]), results[2]);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const testCases = [7259, 86400, 6000000];
+const results = ['2 hr, 59 sec', '1 d', '9 wk, 6 d, 10 hr, 40 min'];
+```
+
+## --seed-contents--
+
+```js
+function convertSeconds(sec) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function convertSeconds(sec) {
+ const localNames = ['wk', 'd', 'hr', 'min', 'sec'];
+ // compoundDuration :: [String] -> Int -> String
+ const compoundDuration = (labels, intSeconds) =>
+ weekParts(intSeconds)
+ .map((v, i) => [v, labels[i]])
+ .reduce((a, x) =>
+ a.concat(x[0] ? [`${x[0]} ${x[1] || '?'}`] : []), []
+ )
+ .join(', ');
+
+ // weekParts :: Int -> [Int]
+ const weekParts = intSeconds => [0, 7, 24, 60, 60]
+ .reduceRight((a, x) => {
+ const r = a.rem;
+ const mod = x !== 0 ? r % x : r;
+
+ return {
+ rem: (r - mod) / (x || 1),
+ parts: [mod].concat(a.parts)
+ };
+ }, {
+ rem: intSeconds,
+ parts: []
+ })
+ .parts;
+
+ return compoundDuration(localNames, sec);
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/count-occurrences-of-a-substring.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/count-occurrences-of-a-substring.md
new file mode 100644
index 00000000000..582a808ef96
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/count-occurrences-of-a-substring.md
@@ -0,0 +1,79 @@
+---
+id: 596fda99c69f779975a1b67d
+title: Кількість входжень підрядка
+challengeType: 5
+forumTopicId: 302237
+dashedName: count-occurrences-of-a-substring
+---
+
+# --description--
+
+Створіть функцію або покажіть вбудовану функцію, щоб порахувати кількість входжень підрядка, що не перекриваються всередині рядка.
+
+Функція має приймати два аргументи:
+
+
+ перший аргумент, в якому рядок для пошуку, і
+ другий підрядок, який шукають.
+
+
+Вона має повертати ціле число.
+
+Відповідність повинна дати найбільшу кількість співпадінь, які не перекриваються.
+
+Загалом, це означає співпадіння з ліва на право або з права на ліво.
+
+# --hints--
+
+`countSubstring` має бути функцією.
+
+```js
+assert(typeof countSubstring === 'function');
+```
+
+`countSubstring("the three truths", "th")` має повертати `3`.
+
+```js
+assert.equal(countSubstring(testCases[0], searchString[0]), results[0]);
+```
+
+`countSubstring("ababababab", "abab")` має повертати `2`.
+
+```js
+assert.equal(countSubstring(testCases[1], searchString[1]), results[1]);
+```
+
+`countSubstring("abaabba*bbaba*bbab", "a*b")` має повертати `2`.
+
+```js
+assert.equal(countSubstring(testCases[2], searchString[2]), results[2]);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const testCases = ['the three truths', 'ababababab', 'abaabba*bbaba*bbab'];
+const searchString = ['th', 'abab', 'a*b'];
+const results = [3, 2, 2];
+```
+
+## --seed-contents--
+
+```js
+function countSubstring(str, subStr) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function countSubstring(str, subStr) {
+ const escapedSubStr = subStr.replace(/[.+*?^$[\]{}()|/]/g, '\\$&');
+ const matches = str.match(new RegExp(escapedSubStr, 'g'));
+ return matches ? matches.length : 0;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/count-the-coins.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/count-the-coins.md
new file mode 100644
index 00000000000..b6063735be3
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/count-the-coins.md
@@ -0,0 +1,93 @@
+---
+id: 59713bd26bdeb8a594fb9413
+title: Підрахунок монет
+challengeType: 5
+forumTopicId: 302238
+dashedName: count-the-coins
+---
+
+# --description--
+
+У валюті [США](https://en.wikipedia.org/wiki/United_States) існує чотири типи звичайних монет:
+
+
+ четвертаки (25 центів)
+ дайми (10 центів)
+ нікелі (5 центів) та
+ пенні (1 цент)
+
+
+Існує шість способів розміняти 15 центів:
+
+
+ 1 дайм та 1 нікель
+ 1 дайм та 5 пенні
+ 3 нікелі
+ 2 нікелі та 5 пенні
+ 1 нікель та 10 пенні
+ 15 пенні
+
+
+# --instructions--
+
+Створіть функцію, яка буде визначати, скількома способами можна розміняти введену кількість `cents`, що представляє суму американських пенні, використовуючи ці поширені монети.
+
+# --hints--
+
+`countCoins` має бути функцією.
+
+```js
+assert(typeof countCoins === 'function');
+```
+
+`countCoins(15)` має повертати `6`.
+
+```js
+assert.equal(countCoins(15), 6);
+```
+
+`countCoins(85)` має повертати `163`.
+
+```js
+assert.equal(countCoins(85), 163);
+```
+
+`countCoins(100)` має повертати `242`.
+
+```js
+assert.equal(countCoins(100), 242);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function countCoins(cents) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function countCoins(cents) {
+ const operands = [1, 5, 10, 25];
+ const targetsLength = cents + 1;
+ const operandsLength = operands.length;
+ const t = [1];
+
+ for (let a = 0; a < operandsLength; a++) {
+ for (let b = 1; b < targetsLength; b++) {
+ // initialise undefined target
+ t[b] = t[b] ? t[b] : 0;
+
+ // accumulate target + operand ways
+ t[b] += (b < operands[a]) ? 0 : t[b - operands[a]];
+ }
+ }
+
+ return t[targetsLength - 1];
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cramers-rule.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cramers-rule.md
new file mode 100644
index 00000000000..013c6a0bcad
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cramers-rule.md
@@ -0,0 +1,167 @@
+---
+id: 59713da0a428c1a62d7db430
+title: Метод Крамера
+challengeType: 5
+forumTopicId: 302239
+dashedName: cramers-rule
+---
+
+# --description--
+
+В [лінійній алгебрі](https://en.wikipedia.org/wiki/linear algebra "wp: linear algebra"), [методі Кремера](https://en.wikipedia.org/wiki/Cramer's rule "wp: Cramer's rule") є явною формулою для вирішення [ системи лінійних рівнянь](https://en.wikipedia.org/wiki/system of linear equations "wp: system of linear equations") яка має таку ж кількістю невідомих, допустимих рівнянь, коли система має унікальний розв'язок. Вона виражає розв'язок в межах детермінантів коефіцієнтної матриці (квадрата), і матриць, отриманих з неї шляхом заміни одного стовпця вектором правої сторони рівнянь.
+
+Дано
+
+$\\left\\{\\begin{matrix}a_1x + b_1y + c_1z&= {\\color{red}d_1}\\\\a_2x + b_2y + c_2z&= {\\color{red}d_2}\\\\a_3x + b_3y + c_3z&= {\\color{red}d_3}\\end{matrix}\\right.$
+
+яка є у форматі матриці
+
+$\\begin{bmatrix} a_1 & b_1 & c_1 \\\\ a_2 & b_2 & c_2 \\\\ a_3 & b_3 & c_3 \\end{bmatrix}\\begin{bmatrix} x \\\\ y \\\\ z \\end{bmatrix}=\\begin{bmatrix} {\\color{red}d_1} \\\\ {\\color{red}d_2} \\\\ {\\color{red}d_3} \\end{bmatrix}.$
+
+Тоді значення $x, y$ і $z$ можна знайти так:
+
+$x = \\frac{\\begin{vmatrix} {\\color{red}d_1} & b_1 & c_1 \\\\ {\\color{red}d_2} & b_2 & c_2 \\\\ {\\color{red}d_3} & b_3 & c_3 \\end{vmatrix} } { \\begin{vmatrix} a_1 & b_1 & c_1 \\\\ a_2 & b_2 & c_2 \\\\ a_3 & b_3 & c_3 \\end{vmatrix}}, \\quad y = \\frac {\\begin{vmatrix} a_1 & {\\color{red}d_1} & c_1 \\\\ a_2 & {\\color{red}d_2} & c_2 \\\\ a_3 & {\\color{red}d_3} & c_3 \\end{vmatrix}} {\\begin{vmatrix} a_1 & b_1 & c_1 \\\\ a_2 & b_2 & c_2 \\\\ a_3 & b_3 & c_3 \\end{vmatrix}}, \\text{ and }z = \\frac { \\begin{vmatrix} a_1 & b_1 & {\\color{red}d_1} \\\\ a_2 & b_2 & {\\color{red}d_2} \\\\ a_3 & b_3 & {\\color{red}d_3} \\end{vmatrix}} {\\begin{vmatrix} a_1 & b_1 & c_1 \\\\ a_2 & b_2 & c_2 \\\\ a_3 & b_3 & c_3 \\end{vmatrix} }.$
+
+# --instructions--
+
+Враховуючи таку систему рівнянь:
+
+$\\begin{cases} 2w-x+5y+z=-3 \\\\ 3w+2x+2y-6z=-32 \\\\ w+3x+3y-z=-47 \\\\ 5w-2x-3y+3z=49 \\\\ \\end{cases}$
+
+розв'язок для $w$, $x$, $y$ і $z$, використовуючи правило Крамера.
+
+# --hints--
+
+`cramersRule` має бути функцією.
+
+```js
+assert(typeof cramersRule === 'function');
+```
+
+`cramersRule([[2, -1, 5, 1], [3, 2, 2, -6], [1, 3, 3, -1], [5, -2, -3, 3]], [-3, -32, -47, 49])` має повернути `[2, -12, -4, 1]`.
+
+```js
+assert.deepEqual(cramersRule(matrices[0], freeTerms[0]), answers[0]);
+```
+
+`cramersRule([[3, 1, 1], [2, 2, 5], [1, -3, -4]], [3, -1, 2])` має повернути `[1, 1, -1]`.
+
+```js
+assert.deepEqual(cramersRule(matrices[1], freeTerms[1]), answers[1]);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const matrices = [
+ [
+ [2, -1, 5, 1],
+ [3, 2, 2, -6],
+ [1, 3, 3, -1],
+ [5, -2, -3, 3]
+ ],
+ [
+ [3, 1, 1],
+ [2, 2, 5],
+ [1, -3, -4]
+ ]
+];
+const freeTerms = [[-3, -32, -47, 49], [3, -1, 2]];
+
+const answers = [[2, -12, -4, 1], [1, 1, -1]];
+```
+
+## --seed-contents--
+
+```js
+function cramersRule(matrix, freeTerms) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+/**
+ * Compute Cramer's Rule
+ * @param {array} matrix x,y,z, etc. terms
+ * @param {array} freeTerms
+ * @return {array} solution for x,y,z, etc.
+ */
+function cramersRule(matrix, freeTerms) {
+ const det = detr(matrix);
+ const returnArray = [];
+ let i;
+
+ for (i = 0; i < matrix[0].length; i++) {
+ const tmpMatrix = insertInTerms(matrix, freeTerms, i);
+ returnArray.push(detr(tmpMatrix) / det);
+ }
+ return returnArray;
+}
+
+/**
+ * Inserts single dimensional array into
+ * @param {array} matrix multidimensional array to have ins inserted into
+ * @param {array} ins single dimensional array to be inserted vertically into matrix
+ * @param {array} at zero based offset for ins to be inserted into matrix
+ * @return {array} New multidimensional array with ins replacing the at column in matrix
+ */
+function insertInTerms(matrix, ins, at) {
+ const tmpMatrix = clone(matrix);
+ let i;
+ for (i = 0; i < matrix.length; i++) {
+ tmpMatrix[i][at] = ins[i];
+ }
+ return tmpMatrix;
+}
+/**
+ * Compute the determinate of a matrix. No protection, assumes square matrix
+ * function borrowed, and adapted from MIT Licensed numericjs library (www.numericjs.com)
+ * @param {array} m Input Matrix (multidimensional array)
+ * @return {number} result rounded to 2 decimal
+ */
+function detr(m) {
+ let ret = 1;
+ let j;
+ let k;
+ const A = clone(m);
+ const n = m[0].length;
+ let alpha;
+
+ for (j = 0; j < n - 1; j++) {
+ k = j;
+ for (let i = j + 1; i < n; i++) { if (Math.abs(A[i][j]) > Math.abs(A[k][j])) { k = i; } }
+ if (k !== j) {
+ const temp = A[k]; A[k] = A[j]; A[j] = temp;
+ ret *= -1;
+ }
+ const Aj = A[j];
+ for (let i = j + 1; i < n; i++) {
+ const Ai = A[i];
+ alpha = Ai[j] / Aj[j];
+ for (k = j + 1; k < n - 1; k += 2) {
+ const k1 = k + 1;
+ Ai[k] -= Aj[k] * alpha;
+ Ai[k1] -= Aj[k1] * alpha;
+ }
+ if (k !== n) { Ai[k] -= Aj[k] * alpha; }
+ }
+ if (Aj[j] === 0) { return 0; }
+ ret *= Aj[j];
+ }
+ return Math.round(ret * A[j][j] * 100) / 100;
+}
+
+/**
+ * Clone two dimensional Array using ECMAScript 5 map function and EcmaScript 3 slice
+ * @param {array} m Input matrix (multidimensional array) to clone
+ * @return {array} New matrix copy
+ */
+function clone(m) {
+ return m.map(a => a.slice());
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cumulative-standard-deviation.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cumulative-standard-deviation.md
new file mode 100644
index 00000000000..e87bca5e27b
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cumulative-standard-deviation.md
@@ -0,0 +1,101 @@
+---
+id: 5a23c84252665b21eecc7e03
+title: Сукупне стандартне відхилення
+challengeType: 5
+forumTopicId: 302240
+dashedName: cumulative-standard-deviation
+---
+
+# --description--
+
+Напишіть функцію, яка враховує масив чисел як параметр та повертає [стандартне відхилення](https://en.wikipedia.org/wiki/Standard Deviation) послідовності.
+
+# --hints--
+
+`standardDeviation` має бути функцією.
+
+```js
+assert(typeof standardDeviation == 'function');
+```
+
+`standardDeviation([2, 4, 4, 4, 5, 5, 7, 9])` має повернути число.
+
+```js
+assert(typeof standardDeviation([2, 4, 4, 4, 5, 5, 7, 9]) == 'number');
+```
+
+`standardDeviation([2, 4, 4, 4, 5, 5, 7, 9])` має повернути `2`.
+
+```js
+assert.equal(standardDeviation([2, 4, 4, 4, 5, 5, 7, 9]), 2);
+```
+
+`standardDeviation([600, 470, 170, 430, 300])` має повернути `147.323`.
+
+```js
+assert.equal(standardDeviation([600, 470, 170, 430, 300]), 147.323);
+```
+
+`standardDeviation([75, 83, 96, 100, 121, 125])` має повернути `18.239`.
+
+```js
+assert.equal(standardDeviation([75, 83, 96, 100, 121, 125]), 18.239);
+```
+
+`standardDeviation([23, 37, 45, 49, 56, 63, 63, 70, 72, 82])` має повернути `16.87`.
+
+```js
+assert.equal(
+ standardDeviation([23, 37, 45, 49, 56, 63, 63, 70, 72, 82]),
+ 16.87
+);
+```
+
+`standardDeviation([271, 354, 296, 301, 333, 326, 285, 298, 327, 316, 287, 314])` має повернути `22.631`.
+
+```js
+assert.equal(
+ standardDeviation([
+ 271,
+ 354,
+ 296,
+ 301,
+ 333,
+ 326,
+ 285,
+ 298,
+ 327,
+ 316,
+ 287,
+ 314
+ ]),
+ 22.631
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function standardDeviation(arr) {
+
+}
+```
+
+# --solutions--
+
+```js
+function standardDeviation(arr) {
+ var sum = 0,
+ sum_sq = 0,
+ n = arr.length;
+ arr.forEach(function(e) {
+ sum += e;
+ sum_sq += e * e;
+ });
+
+ var std_dev = Math.sqrt(sum_sq / n - Math.pow(sum / n, 2));
+ return Math.round(std_dev * 1000) / 1000;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cusip.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cusip.md
new file mode 100644
index 00000000000..f742d22d5a9
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cusip.md
@@ -0,0 +1,118 @@
+---
+id: 5a23c84252665b21eecc7e05
+title: CUSIP
+challengeType: 5
+forumTopicId: 302241
+dashedName: cusip
+---
+
+# --description--
+
+**CUSIP** - це дев'ятизначний абетково-цифровий код, який ідентифікує північноамериканську фінансову безпеку з метою сприяння очищення і врегулювання фінансових угод. CUSIP був прийнятий як американський національний стандарт відповідно до акредитованих стандартів X9.6.
+
+# --instructions--
+
+Запишіть функцію, яка приймає рядок в якості параметра і перевіряє, чи дійсний рядок CUSIP.
+
+# --hints--
+
+`isCusip` має бути функцією.
+
+```js
+assert(typeof isCusip == 'function');
+```
+
+`isCusip("037833100")` має повертати логічний тип даних.
+
+```js
+assert(typeof isCusip('037833100') == 'boolean');
+```
+
+`isCusip("037833100")` має повертати `true`.
+
+```js
+assert.equal(isCusip('037833100'), true);
+```
+
+`isCusip("17275R102")` має повертати `true`.
+
+```js
+assert.equal(isCusip('17275R102'), true);
+```
+
+`isCusip("38259P50a")` має повертати `false`.
+
+```js
+assert.equal(isCusip('38259P50a'), false);
+```
+
+`isCusip("38259P508")` має повертати `true`.
+
+```js
+assert.equal(isCusip('38259P508'), true);
+```
+
+`isCusip("38259P50#")` має повертати `false`.
+
+```js
+assert.equal(isCusip('38259P50#'), false);
+```
+
+`isCusip("68389X105")` має повертати `true`.
+
+```js
+assert.equal(isCusip('68389X105'), true);
+```
+
+`isCusip("68389X106")` має повертати `false`.
+
+```js
+assert.equal(isCusip('68389X106'), false);
+```
+
+`isCusip("5949181")` має повертати `false`.
+
+```js
+assert.equal(isCusip('5949181'), false);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function isCusip(s) {
+
+}
+```
+
+# --solutions--
+
+```js
+function isCusip(s) {
+ if (s.length != 9) return false;
+ var sum = 0;
+ var ASCII = x => x.charCodeAt(0);
+ for (var i = 0; i < 7; i++) {
+ var c = s.charCodeAt(i);
+
+ var v;
+ if (c >= ASCII('0') && c <= ASCII('9')) {
+ v = c - 48;
+ } else if (c >= ASCII('A') && c <= ASCII('Z')) {
+ v = c - 64; // lower case letters apparently invalid
+ } else if (c == ASCII('*')) {
+ v = 36;
+ } else if (c == ASCII('@')) {
+ v = 37;
+ } else if (c == ASCII('#')) {
+ v = 38;
+ } else {
+ return false;
+ }
+ if (i % 2 == 1) v *= 2; // check if odd as using 0-based indexing
+ sum += Math.floor(v / 10) + (v % 10);
+ }
+ return s.charCodeAt(8) - 48 == (10 - (sum % 10)) % 10;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cut-a-rectangle.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cut-a-rectangle.md
new file mode 100644
index 00000000000..9cd5db7ba31
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/cut-a-rectangle.md
@@ -0,0 +1,203 @@
+---
+id: 5a23c84252665b21eecc7e06
+title: Поділіть прямокутник
+challengeType: 5
+forumTopicId: 302242
+dashedName: cut-a-rectangle
+---
+
+# --description--
+
+Даний прямокутник складається з *m* × *n* квадратів. Якщо *m* та *n* не парні, тоді можливо поділити прямокутник вздовж квадратних країв так, щоб утворилось дві з'єднаних частини однакової форми (після розвороту однієї з частин на 180°). Усі варіанту поділу для прямокутників 2 × 2 та 4 × 3 наведено нижче.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# --instructions--
+
+Запишіть функцію, яка обчислює кількість різних способів поділити прямокутник *m* × *n*.
+
+# --hints--
+
+`cutRectangle` має бути функцією.
+
+```js
+assert(typeof cutRectangle == 'function');
+```
+
+`cutRectangle(2, 2)` має повернути число.
+
+```js
+assert(typeof cutRectangle(2, 2) == 'number');
+```
+
+`cutRectangle(2, 2)` має повернути `2`.
+
+```js
+assert.equal(cutRectangle(2, 2), 2);
+```
+
+`cutRectangle(4, 3)` має повернути `9`.
+
+```js
+assert.equal(cutRectangle(4, 3), 9);
+```
+
+`cutRectangle(4, 4)` має повернути `22`.
+
+```js
+assert.equal(cutRectangle(4, 4), 22);
+```
+
+`cutRectangle(8, 3)` має повернути `53`.
+
+```js
+assert.equal(cutRectangle(8, 3), 53);
+```
+
+`cutRectangle(7, 4)` має повернути `151`.
+
+```js
+assert.equal(cutRectangle(7, 4), 151);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function cutRectangle(w, h) {
+
+}
+```
+
+# --solutions--
+
+```js
+function cutRectangle(w, h) {
+ if (w % 2 == 1 && h % 2 == 1) return;
+
+ var dirs = [[0, -1], [-1, 0], [0, 1], [1, 0]];
+
+ var grid = new Array(h);
+ for (var i = 0; i < grid.length; i++) grid[i] = new Array(w);
+ var stack = [];
+
+ var half = Math.floor((w * h) / 2);
+ var bits = Math.pow(2, half) - 1;
+ var result = 0;
+ for (; bits > 0; bits -= 2) {
+ for (var i = 0; i < half; i++) {
+ var r = Math.floor(i / w);
+ var c = i % w;
+ grid[r][c] = (bits & (1 << i)) != 0 ? 1 : 0;
+ grid[h - r - 1][w - c - 1] = 1 - grid[r][c];
+ }
+
+ stack.push(0);
+ grid[0][0] = 2;
+ var count = 1;
+ while (stack.length != 0) {
+ var pos = stack.pop();
+ var r = Math.floor(pos / w);
+ var c = pos % w;
+
+ for (var dir of dirs) {
+ var nextR = r + dir[0];
+ var nextC = c + dir[1];
+
+ if (nextR >= 0 && nextR < h && nextC >= 0 && nextC < w) {
+ if (grid[nextR][nextC] == 1) {
+ stack.push(nextR * w + nextC);
+ grid[nextR][nextC] = 2;
+ count++;
+ }
+ }
+ }
+ }
+
+ if (count == half) {
+ result++;
+ }
+ }
+
+ return result;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/date-format.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/date-format.md
new file mode 100644
index 00000000000..e210faa3543
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/date-format.md
@@ -0,0 +1,90 @@
+---
+id: 59669d08d75b60482359409f
+title: Формат дати
+challengeType: 5
+forumTopicId: 302243
+dashedName: date-format
+---
+
+# --description--
+
+Поверніть масив з двома рядками поточної дати із нижченаведеними специфікаціями:
+
+- У першому рядку дата повинна бути у порядку: рік, місяць, день, і розділена дефісом (`-`).
+- У першому рядку рік має складатися із 4 цифр.
+- У першому рядку місяць і день не повинні містити нулів на початку.
+- У другому рядку назви днів тижня та місяців не мають бути скороченими.
+- У другому рядку день не має містити нулів на початку.
+
+Приклад кінцевого результату:
+
+```js
+['2007-11-23', 'Friday, November 23, 2007']
+['2021-3-2', 'Tuesday, March 2, 2021']
+```
+
+# --hints--
+
+`getDateFormats` має бути функцією.
+
+```js
+assert(typeof getDateFormats === 'function');
+```
+
+`getDateFormats` має повернути об'єкт.
+
+```js
+assert(typeof getDateFormats() === 'object');
+```
+
+`getDateFormats` повинен повернути масив з 2 елементами.
+
+```js
+assert(getDateFormats().length === 2);
+```
+
+`getDateFormats` має повернути правильну дату в правильному форматі
+
+```js
+assert.deepEqual(getDateFormats(), dates, equalsMessage);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const getDateSolution = () => {
+ const date = new Date();
+ const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
+ const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
+ const fmt1 = `${date.getFullYear()}-${(1 + date.getMonth())}-${date.getDate()}`;
+ const fmt2 = `${weekdays[date.getDay()]}, ${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;
+ return [fmt1, fmt2];
+};
+
+const dates = getDateSolution();
+const equalsMessage = `message: getDataFormats() should return ["${dates[0]}", "${dates[1]}"].`;
+```
+
+## --seed-contents--
+
+```js
+function getDateFormats() {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function getDateFormats() {
+ const date = new Date();
+ const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
+ const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
+ const fmt1 = `${date.getFullYear()}-${(1 + date.getMonth())}-${date.getDate()}`;
+ const fmt2 = `${weekdays[date.getDay()]}, ${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;
+ return [fmt1, fmt2];
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/date-manipulation.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/date-manipulation.md
new file mode 100644
index 00000000000..0ee03f4862a
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/date-manipulation.md
@@ -0,0 +1,109 @@
+---
+id: 5966c21cf732a95f1b67dd28
+title: Зміна дати
+challengeType: 5
+forumTopicId: 302244
+dashedName: date-manipulation
+---
+
+# --description--
+
+Маючи рядок із датою у форматі EST, виведіть задану дату у новий рядок, додавши 12 годин. Часовий пояс має бути збережений.
+
+Приклад заданого формату: `"March 6 2009 7:30pm EST"`
+
+Приклад вихідного формату: `"March 7 2009 7:30am EST"`
+
+# --hints--
+
+`add12Hours` має бути функцією.
+
+```js
+assert(typeof add12Hours === 'function');
+```
+
+`add12Hours(dateString)` має повернути рядок.
+
+```js
+assert(typeof add12Hours('January 17 2017 11:43am EST') === 'string');
+```
+
+`add12Hours("January 17 2017 11:43am EST")` має видати `"January 17 2017 11:43pm EST"`
+
+```js
+assert(
+ add12Hours('January 17 2017 11:43am EST') === 'January 17 2017 11:43pm EST'
+);
+```
+
+Необхідна зміна дня. `add12Hours("March 6 2009 7:30pm EST")` має видати `"March 7 2009 7:30am EST"`
+
+```js
+assert(add12Hours('March 6 2009 7:30pm EST') === 'March 7 2009 7:30am EST');
+```
+
+Необхідна зміна місяця у високосний рік. `add12Hours("February 29 2004 9:15pm EST")` має видати `"March 1 2004 9:15am EST"`
+
+```js
+assert(add12Hours('February 29 2004 9:15pm EST') === 'March 1 2004 9:15am EST');
+```
+
+Необхідна зміна місяця у звичайні роки. `add12Hours("February 28 1999 3:15pm EST")` має видати `"March 1 1999 3:15am EST"`
+
+```js
+assert(add12Hours('February 28 1999 3:15pm EST') === 'March 1 1999 3:15am EST');
+```
+
+Необхідна зміна року. `add12Hours("December 31 2020 1:45pm EST")` має видати `"January 1 2021 1:45am EST"`
+
+```js
+assert(
+ add12Hours('December 31 2020 1:45pm EST') === 'January 1 2021 1:45am EST'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function add12Hours(dateString) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function add12Hours(dateString) {
+ const months = ['January', 'February', 'March', 'April', 'May', 'June',
+ 'July', 'August', 'September', 'October', 'November', 'December'];
+ // Get the parts of the string
+ const parts = dateString.split(' ');
+ const month = months.indexOf(parts[0]);
+ const day = parseInt(parts[1], 10);
+ const year = parseInt(parts[2], 10);
+ const time = parts[3].split(':');
+ let hours = parseInt(time[0], 10);
+ if (time[1].slice(-2) === 'pm') {
+ hours += 12;
+ }
+ const minutes = parseInt(time[1].slice(0, -2), 10);
+
+ // Create a date with given parts, and updated hours
+ const date = new Date();
+ date.setFullYear(year, month, day);
+ date.setHours(hours + 12); // Add 12 hours
+ date.setMinutes(minutes);
+
+ let hoursOutput = date.getHours();
+ let abbreviation = 'am';
+ if (hoursOutput > 12) {
+ hoursOutput -= 12;
+ abbreviation = 'pm';
+ }
+
+ return `${months[date.getMonth()]} ${date.getDate()} ${date.getFullYear()} ${hoursOutput}:${date.getMinutes()}${abbreviation} EST`;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/day-of-the-week.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/day-of-the-week.md
new file mode 100644
index 00000000000..95676ff1753
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/day-of-the-week.md
@@ -0,0 +1,74 @@
+---
+id: 5966f99c45e8976909a85575
+title: День тижня
+challengeType: 5
+forumTopicId: 302245
+dashedName: day-of-the-week
+---
+
+# --description--
+
+Компанія вирішила, що кожного разу, коли Різдво припадатиме на неділю, вони видаватимуть робітникам додаткові оплачувані відпустки, так, щоб разом з іншими державними святами, їм не доводилось працювати наступного тижня (з 25 грудня по 1 січня).
+
+# --instructions--
+
+Напишіть функцію, яка потребує роки початку і кінця відліку, щоб видати масив з усіма роками, коли 25 грудня припадає на неділю.
+
+# --hints--
+
+`findXmasSunday` має бути функцією.
+
+```js
+assert(typeof findXmasSunday === 'function');
+```
+
+`findXmasSunday(2000, 2100)` має видати масив.
+
+```js
+assert(typeof findXmasSunday(2000, 2100) === 'object');
+```
+
+`findXmasSunday(1970, 2017)` має видати `[1977, 1983, 1988, 1994, 2005, 2011, 2016]`
+
+```js
+assert.deepEqual(findXmasSunday(1970, 2017), firstSolution);
+```
+
+`findXmasSunday(2008, 2121)` має видати `[2011, 2016, 2022, 2033, 2039, 2044, 2050, 2061, 2067, 2072, 2078, 2089, 2095, 2101, 2107, 2112, 2118]`
+
+```js
+assert.deepEqual(findXmasSunday(2008, 2121), secondSolution);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const firstSolution = [1977, 1983, 1988, 1994, 2005, 2011, 2016];
+const secondSolution = [2011, 2016, 2022, 2033, 2039, 2044, 2050, 2061, 2067, 2072, 2078, 2089, 2095, 2101, 2107, 2112, 2118];
+```
+
+## --seed-contents--
+
+```js
+function findXmasSunday(start, end) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function findXmasSunday(start, end) {
+ const xmasSunday = [];
+ for (let year = start; year <= end; year++) {
+ const xmas = new Date(year, 11, 25);
+ if (xmas.getDay() === 0) {
+ xmasSunday.push(year);
+ }
+ }
+ return xmasSunday;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/deal-cards-for-freecell.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/deal-cards-for-freecell.md
new file mode 100644
index 00000000000..4e2d04de151
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/deal-cards-for-freecell.md
@@ -0,0 +1,210 @@
+---
+id: 59694356a6e7011f7f1c5f4e
+title: Роздати карти для FreeCell
+challengeType: 5
+forumTopicId: 302246
+dashedName: deal-cards-for-freecell
+---
+
+# --description--
+
+*FreeCell* - це гра в пасьянс, представлена Полем Альфілем для системи PLATO у 1978. Джим Хорн, представник Microsoft, змінив її ім'я на FreeCell та реалізував гру для системи [DOS](https://rosettacode.org/wiki/DOS "DOS"), а згодом і для [Windows](https://rosettacode.org/wiki/Windows "Windows"). Ця версія представила 32000 нумерованих роздач.
+
+Як тільки гра стала популярною, Джим Хорн розкрив її алгоритм, що дало початок реалізації нових версій FreeCell, які відтворювали роздачі Microsoft. Нумерація роздач сягала від 1 до 32000. Нові версії від Microsoft мають близько 1 мільйону роздач, нумерованих від 1 до 1000000; а деякі варіації дозволяють нумерацію і поза межами цього діапазону.
+
+Алгоритм використовує цей [лінійний конгурентний генератор](https://rosettacode.org/wiki/linear congruential generator "linear congruential generator") від Microsoft C:
+
+
+ $state_{n + 1} \equiv 214013 \times state_n + 2531011 \pmod{2^{31}}$
+ $rand_n = state_n \div 2^{16}$
+ $rand_n$ знаходиться у діапазоні від 0 до 32767.
+
+
+Після алгоритму:
+
+
+ Введіть загальну кількість роздач у RNG (random number generator).
+ Створіть масив з 52 карт: туз трефи, туз бубни, туз чирви, туз піки, двійка трефи, двійка бубни і т.д. по усім рангам: Туз, 2, 3, 4, 5, 6, 7, 8, 9, 10, Валет, Дама, Король. Індекси масивів від 0 до 51, з тузом трефи на 0 та королем піки на 51.
+ Поки масив не стане пустим:
+ Оберіть випадкову карту із індексом ≡ наступне випадкове число (довжина масиву модулів).
+
+ Поміняйте цю випадкову картку на останню карту масиву.
+ Видаліть цю випадкову карту із масиву. (Довжина масиву зменшується на 1.)
+ Роздайте цю випадкову карту.
+
+ Роздайте усі 52 карти, лицем догори, на 8 стовпчиків. Перші 8 карт на 8 стовпчиків, наступні 8 карт на перші 8 карт, і так далі.
+
+
+**Наприклад:**
+
+**Порядок роздачі карт**
+
+ 1 2 3 4 5 6 7 8
+ 9 10 11 12 13 14 15 16
+17 18 19 20 21 22 23 24
+25 26 27 28 29 30 31 32
+33 34 35 36 37 38 39 40
+41 42 43 44 45 46 47 48
+49 50 51 52
+
+**Гра #1**
+
+```js
+[
+ ['JD', '2D', '9H', 'JC', '5D', '7H', '7C', '5H'],
+ ['KD', 'KC', '9S', '5S', 'AD', 'QC', 'KH', '3H'],
+ ['2S', 'KS', '9D', 'QD', 'JS', 'AS', 'AH', '3C'],
+ ['4C', '5C', 'TS', 'QH', '4H', 'AC', '4D', '7S'],
+ ['3S', 'TD', '4S', 'TH', '8H', '2C', 'JH', '7D'],
+ ['6D', '8S', '8D', 'QS', '6C', '3D', '8C', 'TC'],
+ ['6S', '9C', '2H', '6H']
+]
+```
+
+**Гра #617**
+
+```js
+[
+ ['7D', 'AD', '5C', '3S', '5S', '8C', '2D', 'AH'],
+ ['TD', '7S', 'QD', 'AC', '6D', '8H', 'AS', 'KH'],
+ ['TH', 'QC', '3H', '9D', '6S', '8D', '3D', 'TC'],
+ ['KD', '5H', '9S', '3C', '8S', '7H', '4D', 'JS'],
+ ['4C', 'QS', '9C', '9H', '7C', '6H', '2C', '2S'],
+ ['4S', 'TS', '2H', '5D', 'JC', '6C', 'JH', 'QH'],
+ ['JD', 'KS', 'KC', '4H']
+]
+```
+
+# --instructions--
+
+Напишіть функцію, щоб дізнатись номер роздачі та роздати карти в такому ж порядку, як у алгоритмі. Функція має видати двовимірний масив, що представляє собою дошку FreeCell.
+
+Роздачі також можна перевірити у [ рішеннях до 1000000 FreeCell ігор](https://freecellgamesolutions.com/). (Знайдіть відеорішення, що покаже початкову роздачу.)
+
+# --hints--
+
+`dealFreeCell` має бути функцією.
+
+```js
+assert(typeof dealFreeCell === 'function');
+```
+
+`dealFreeCell(seed)` має видати об'єкт.
+
+```js
+assert(typeof dealFreeCell(1) === 'object');
+```
+
+`dealFreeCell(seed)` має видати масив довжиною 7.
+
+```js
+assert(dealFreeCell(1).length === 7);
+```
+
+`dealFreeCell(1)` має видати масив ідентичний до прикладу "Гра #1"
+
+```js
+assert.deepEqual(dealFreeCell(1), game1);
+```
+
+`dealFreeCell(617)` має видати масив ідентичний до прикладу "Гра #617"
+
+```js
+assert.deepEqual(dealFreeCell(617), game617);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const replaceThis = 3;
+const game1 = [
+ ['JD', '2D', '9H', 'JC', '5D', '7H', '7C', '5H'],
+ ['KD', 'KC', '9S', '5S', 'AD', 'QC', 'KH', '3H'],
+ ['2S', 'KS', '9D', 'QD', 'JS', 'AS', 'AH', '3C'],
+ ['4C', '5C', 'TS', 'QH', '4H', 'AC', '4D', '7S'],
+ ['3S', 'TD', '4S', 'TH', '8H', '2C', 'JH', '7D'],
+ ['6D', '8S', '8D', 'QS', '6C', '3D', '8C', 'TC'],
+ ['6S', '9C', '2H', '6H']
+];
+const game617 = [
+ ['7D', 'AD', '5C', '3S', '5S', '8C', '2D', 'AH'],
+ ['TD', '7S', 'QD', 'AC', '6D', '8H', 'AS', 'KH'],
+ ['TH', 'QC', '3H', '9D', '6S', '8D', '3D', 'TC'],
+ ['KD', '5H', '9S', '3C', '8S', '7H', '4D', 'JS'],
+ ['4C', 'QS', '9C', '9H', '7C', '6H', '2C', '2S'],
+ ['4S', 'TS', '2H', '5D', 'JC', '6C', 'JH', 'QH'],
+ ['JD', 'KS', 'KC', '4H']
+];
+```
+
+## --seed-contents--
+
+```js
+function dealFreeCell(seed) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+// RNG
+function FreeCellRNG(seed) {
+ return {
+ lastNum: seed,
+ next() {
+ this.lastNum = ((214013 * this.lastNum) + 2531011) % (Math.pow(2, 31));
+ return this.lastNum >> 16;
+ }
+ };
+}
+// Get cards
+function getDeck() {
+ const ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K'];
+ const suits = ['C', 'D', 'H', 'S'];
+ const cards = [];
+ for (let i = 0; i < ranks.length; i += 1) {
+ for (let j = 0; j < suits.length; j += 1) {
+ cards.push(`${ranks[i]}${suits[j]}`);
+ }
+ }
+ return cards;
+}
+function dealFreeCell(seed) {
+ const rng = FreeCellRNG(seed);
+ const deck = getDeck();
+
+ const deltCards = [[], [], [], [], [], [], []];
+ let currentColumn = 0;
+ let currentRow = 0;
+
+ let rand;
+ let temp;
+ let card;
+ while (deck.length > 0) {
+ // Choose a random card
+ rand = rng.next() % deck.length;
+
+ // Swap this random card with the last card in the array
+ temp = deck[deck.length - 1];
+ deck[deck.length - 1] = deck[rand];
+ deck[rand] = temp;
+
+ // Remove this card from the array
+ card = deck.pop();
+
+ // Deal this card
+ deltCards[currentRow].push(card);
+ currentColumn += 1;
+ if (currentColumn === 8) {
+ currentColumn = 0;
+ currentRow += 1;
+ }
+ }
+
+ return deltCards;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/deepcopy.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/deepcopy.md
new file mode 100644
index 00000000000..4a8e3a77d51
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/deepcopy.md
@@ -0,0 +1,85 @@
+---
+id: 596a8888ab7c01048de257d5
+title: Deepcopy (Глибоке копіювання)
+challengeType: 5
+forumTopicId: 302247
+dashedName: deepcopy
+---
+
+# --description--
+
+Напишіть функцію, що повертає глибоку копію заданого об'єкта. Копія не повинна бути такою самою, як заданий об'єкт.
+
+Це завдання не буде перевірятися для:
+
+
+ Об'єктів з властивостями, що є функціями
+ Date об'єкти або об'єкти з властивостями (які є Date об'єктами)
+ Регулярні вирази або об'єкти з властивостями (які є регулярними виразами)
+ Прототип копіювання
+
+
+# --hints--
+
+`deepcopy` має бути функцією.
+
+```js
+assert(typeof deepcopy === 'function');
+```
+
+`deepcopy({test: "test"})` має повертати об'єкт.
+
+```js
+assert(typeof deepcopy(obj1) === 'object');
+```
+
+`deepcopy` не має повертати той самий об'єкт, який був заданий.
+
+```js
+assert(deepcopy(obj2) != obj2);
+```
+
+Під час переходу об'єкта, який містить масив, `deepcopy` має повертати глибоку копію об'єкта.
+
+```js
+assert.deepEqual(deepcopy(obj2), obj2);
+```
+
+Під час переходу об'єкта, який містить інший об'єкт, `deepcopy` має повертати глибоку копію об'єкта.
+
+```js
+assert.deepEqual(deepcopy(obj3), obj3);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const obj1 = { test: 'test' };
+const obj2 = {
+ t: 'test',
+ a: ['an', 'array']
+};
+const obj3 = {
+ t: 'try',
+ o: obj2
+};
+```
+
+## --seed-contents--
+
+```js
+function deepcopy(obj) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function deepcopy(obj) {
+ return JSON.parse(JSON.stringify(obj));
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/define-a-primitive-data-type.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/define-a-primitive-data-type.md
new file mode 100644
index 00000000000..b2107c1d406
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/define-a-primitive-data-type.md
@@ -0,0 +1,132 @@
+---
+id: 597089c87eec450c68aa1643
+title: Визначення примітивного типу даних
+challengeType: 5
+forumTopicId: 302248
+dashedName: define-a-primitive-data-type
+---
+
+# --description--
+
+Визначте тип, що поводитися як ціле число, але має найменше допустиме значення 1 та найбільше допустиме значення 10.
+
+Обробка помилок:
+
+
+ Якщо ви спробуєте створити Num зі значенням поза діапазоном 1 - 10, він повинен видати TypeError з повідомленням про виникнення помилки 'Out of range'.
+ Якщо ви спробуєте створити Num зі значенням, що не є числом, воно має видати TypeError з повідомленням про виникнення помилки 'Not a Number'.
+
+
+# --hints--
+
+`Num` має бути функцією.
+
+```js
+assert(typeof Num === 'function');
+```
+
+`new Num(4)` має повертати об'єкт.
+
+```js
+assert(typeof new Num(4) === 'object');
+```
+
+`new Num('test')` має видавати помилку TypeError з повідомленням 'Not a Number'.
+
+```js
+assert.throws(() => new Num('test'), TypeError);
+```
+
+`new Num(0)` має видавати помилку TypeError з повідомленням 'Out of range'.
+
+```js
+assert.throws(() => new Num(0), TypeError);
+```
+
+`new Num(-5)` має видавати помилку TypeError з повідомленням 'Out of range'.
+
+```js
+assert.throws(() => new Num(-5), TypeError);
+```
+
+`new Num(10)` має видавати помилку TypeError з повідомленням 'Out of range'.
+
+```js
+assert.throws(() => new Num(11), TypeError);
+```
+
+`new Num(20)` має видавати помилку TypeError з повідомленням 'Out of range'.
+
+```js
+assert.throws(() => new Num(20), TypeError);
+```
+
+`new Num(3) + new Num(4)` має дорівнювати 7.
+
+```js
+assert.equal(new Num(3) + new Num(4), 7);
+```
+
+`new Num(3) - new Num(4)` має дорівнювати -1.
+
+```js
+assert.equal(new Num(3) - new Num(4), -1);
+```
+
+`new Num(3) * new Num(4)` має дорівнювати 12.
+
+```js
+assert.equal(new Num(3) * new Num(4), 12);
+```
+
+`new Num(3) / new Num(4)` має дорівнювати 0.75.
+
+```js
+assert.equal(new Num(3) / new Num(4), 0.75);
+```
+
+`new Num(3) < new Num(4)` має бути правдою.
+
+```js
+assert(new Num(3) < new Num(4));
+```
+
+`new Num(3) > new Num(4)` має бути помилкою.
+
+```js
+assert(!(new Num(3) > new Num(4)));
+```
+
+`(new Num(5)).toString()` має повертати '5'
+
+```js
+assert.equal(new Num(5).toString(), '5');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function Num(n) {
+
+ return n;
+}
+```
+
+# --solutions--
+
+```js
+function Num(n) {
+ if (isNaN(n)) {
+ throw new TypeError('Not a Number');
+ }
+ if (n < 1 || n > 10) {
+ throw new TypeError('Out of range');
+ }
+
+ this._value = +n;
+}
+Num.prototype.valueOf = function() { return this._value; };
+Num.prototype.toString = function () { return this._value.toString(); };
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/department-numbers.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/department-numbers.md
new file mode 100644
index 00000000000..81f540ac1bf
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/department-numbers.md
@@ -0,0 +1,126 @@
+---
+id: 59f40b17e79dbf1ab720ed7a
+title: Номери відділів
+challengeType: 5
+forumTopicId: 302249
+dashedName: department-numbers
+---
+
+# --description--
+
+Існує добре організоване місто, яке вирішило призначити номер для кожного з їх відділів:
+
+
+ Відділ поліції
+ Санітарний відділ
+ Пожежний відділ
+
+
+Кожен відділ може мати номер від 1 до 7 (включно).
+
+Номери кожного з відділу мають бути унікальними (тобто бути відмінними одне від одного) та щоб в сумі було до номера 12.
+
+Шеф поліції не любить непарних чисел і хоче мати парне число для свого відділу.
+
+# --instructions--
+
+Напишіть програму, яка виводить всі дійсні комбінації у вигляді масиву.
+
+```js
+[2, 3, 7] [2, 4, 6] [2, 6, 4]
+[2, 7, 3] [4, 1, 7] [4, 2, 6]
+[4, 3, 5] [4, 5, 3] [4, 6, 2]
+[4, 7, 1] [6, 1, 5] [6, 2, 4]
+[6, 4, 2] [6, 5, 1]
+```
+
+# --hints--
+
+`combinations` мають бути функцією.
+
+```js
+assert(typeof combinations === 'function');
+```
+
+`combinations([1, 2, 3], 6)` повинні повернути масив.
+
+```js
+assert(Array.isArray(combinations([1, 2, 3], 6)));
+```
+
+`combinations([1, 2, 3, 4, 5, 6, 7], 12)` мають повернутися як рядок довжиною 14.
+
+```js
+assert(combinations(nums, total).length === len);
+```
+
+`combinations([1, 2, 3, 4, 5, 6, 7], 12)` повинен повертати всі дійсні комбінації.
+
+```js
+assert.deepEqual(combinations(nums, total), result);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const nums = [1, 2, 3, 4, 5, 6, 7];
+const total = 12;
+const len = 14;
+const result = [
+ [2, 3, 7],
+ [2, 4, 6],
+ [2, 6, 4],
+ [2, 7, 3],
+ [4, 1, 7],
+ [4, 2, 6],
+ [4, 3, 5],
+ [4, 5, 3],
+ [4, 6, 2],
+ [4, 7, 1],
+ [6, 1, 5],
+ [6, 2, 4],
+ [6, 4, 2],
+ [6, 5, 1]
+];
+```
+
+## --seed-contents--
+
+```js
+function combinations(possibleNumbers, total) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+function combinations(possibleNumbers, total) {
+ let firstNumber;
+ let secondNumber;
+ let thridNumber;
+ const allCombinations = [];
+
+ for (let i = 0; i < possibleNumbers.length; i += 1) {
+ firstNumber = possibleNumbers[i];
+
+ if (firstNumber % 2 === 0) {
+ for (let j = 0; j < possibleNumbers.length; j += 1) {
+ secondNumber = possibleNumbers[j];
+
+ if (j !== i && firstNumber + secondNumber <= total) {
+ thridNumber = total - firstNumber - secondNumber;
+
+ if (thridNumber !== firstNumber && thridNumber !== secondNumber && possibleNumbers.includes(thridNumber)) {
+ allCombinations.push([firstNumber, secondNumber, thridNumber]);
+ }
+ }
+ }
+ }
+ }
+ return allCombinations;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/discordian-date.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/discordian-date.md
new file mode 100644
index 00000000000..f2ac9575015
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/discordian-date.md
@@ -0,0 +1,195 @@
+---
+id: 59f4eafba0343628bb682785
+title: Дискордіанський календар
+challengeType: 5
+forumTopicId: 302250
+dashedName: discordian-date
+---
+
+# --description--
+
+Перетворіть дану дату з [Григоріанського календаря ](https://en.wikipedia.org/wiki/Gregorian calendar "wp: Gregorian calendar") в [Дискордіанський календар](https://en.wikipedia.org/wiki/Discordian calendar "wp: Discordian calendar").
+
+# --hints--
+
+`discordianDate` має бути функцією.
+
+```js
+assert(typeof discordianDate === 'function');
+```
+
+`discordianDate(new Date(2010, 6, 22))` повинен повернутися як `"Pungenday, the 57th day of Confusion in the YOLD 3176"`.
+
+```js
+assert(
+ discordianDate(new Date(2010, 6, 22)) ===
+ 'Pungenday, the 57th day of Confusion in the YOLD 3176'
+);
+```
+
+`discordianDate(new Date(2012, 1, 28))` повинен повертатися як `"Prickle-Prickle, the 59th day of Chaos in the YOLD 3178"`.
+
+```js
+assert(
+ discordianDate(new Date(2012, 1, 28)) ===
+ 'Prickle-Prickle, the 59th day of Chaos in the YOLD 3178'
+);
+```
+
+`discordianDate(new Date(2012, 1, 29))` повинен повертатися як `"Setting Orange, the 60th day of Chaos in the YOLD 3178. Святкуйте St. Tib\'s Day!"`.
+
+```js
+assert(
+ discordianDate(new Date(2012, 1, 29)) ===
+ "Setting Orange, the 60th day of Chaos in the YOLD 3178. Celebrate St. Tib's Day!"
+);
+```
+
+`discordianDate(new Date(2012, 2, 1))` повинен повертатися як `"Setting Orange, the 60th day of Chaos in the YOLD 3178"`.
+
+```js
+assert(
+ discordianDate(new Date(2012, 2, 1)) ===
+ 'Setting Orange, the 60th day of Chaos in the YOLD 3178'
+);
+```
+
+`discordianDate(new Date(2010, 0, 5))` повинен повертатися як `"Setting Orange, the 5th day of Chaos in the YOLD 3176. Відсвяткуйте Mungday!"`.
+
+```js
+assert(
+ discordianDate(new Date(2010, 0, 5)) ===
+ 'Setting Orange, the 5th day of Chaos in the YOLD 3176. Celebrate Mungday!'
+);
+```
+
+`discordianDate(new Date(2011, 4, 3))` повинен повертатися як `"Pungenday, the 50th day of Discord in the YOLD 3177. Відсвяткуйте Discoflux!"`.
+
+```js
+assert(
+ discordianDate(new Date(2011, 4, 3)) ===
+ 'Pungenday, the 50th day of Discord in the YOLD 3177. Celebrate Discoflux!'
+);
+```
+
+`discordianDate(new Date(2015, 9, 19))` повинен повертатися як `"Boomtime, the 73rd day of Bureaucracy in the YOLD 3181"`.
+
+```js
+assert(
+ discordianDate(new Date(2015, 9, 19)) ===
+ 'Boomtime, the 73rd day of Bureaucracy in the YOLD 3181'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function discordianDate(date) {
+
+ return true;
+}
+```
+
+# --solutions--
+
+```js
+/**
+ * All Hail Discordia! - this script prints Discordian date using system date.
+ *
+ * lang: JavaScript
+ * author: jklu
+ * contributors: JamesMcGuigan
+ *
+ * source: https://rosettacode.org/wiki/Discordian_date#JavaScript
+ */
+const seasons = [
+ 'Chaos', 'Discord', 'Confusion',
+ 'Bureaucracy', 'The Aftermath'
+];
+const weekday = [
+ 'Sweetmorn', 'Boomtime', 'Pungenday',
+ 'Prickle-Prickle', 'Setting Orange'
+];
+
+const apostle = [
+ 'Mungday', 'Mojoday', 'Syaday',
+ 'Zaraday', 'Maladay'
+];
+
+const holiday = [
+ 'Chaoflux', 'Discoflux', 'Confuflux',
+ 'Bureflux', 'Afflux'
+];
+
+
+Date.prototype.isLeapYear = function() {
+ const year = this.getFullYear();
+ if ((year & 3) !== 0) { return false; }
+ return ((year % 100) !== 0 || (year % 400) === 0);
+};
+
+// Get Day of Year
+Date.prototype.getDOY = function() {
+ const dayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
+ const mn = this.getMonth();
+ const dn = this.getDate();
+ let dayOfYear = dayCount[mn] + dn;
+ if (mn > 1 && this.isLeapYear()) { dayOfYear += 1; }
+ return dayOfYear;
+};
+
+Date.prototype.isToday = function() {
+ const today = new Date();
+ return this.getDate() === today.getDate()
+ && this.getMonth() === today.getMonth()
+ && this.getFullYear() === today.getFullYear()
+ ;
+};
+
+function discordianDate(date) {
+ if (!date) { date = new Date(); }
+
+ const y = date.getFullYear();
+ const yold = y + 1166;
+ let dayOfYear = date.getDOY();
+ let celebrateHoliday = null;
+
+ if (date.isLeapYear()) {
+ if (dayOfYear === 60) {
+ celebrateHoliday = 'St. Tib\'s Day';
+ }
+ else if (dayOfYear > 60) {
+ dayOfYear--;
+ }
+ }
+ dayOfYear--;
+
+ const divDay = Math.floor(dayOfYear / 73);
+
+ const seasonDay = (dayOfYear % 73) + 1;
+ if (seasonDay === 5) {
+ celebrateHoliday = apostle[divDay];
+ }
+ if (seasonDay === 50) {
+ celebrateHoliday = holiday[divDay];
+ }
+
+ const season = seasons[divDay];
+ const dayOfWeek = weekday[dayOfYear % 5];
+
+ const nth = (seasonDay % 10 === 1) ? 'st'
+ : (seasonDay % 10 === 2) ? 'nd'
+ : (seasonDay % 10 === 3) ? 'rd'
+ : 'th';
+
+ return ''
+ + dayOfWeek
+ + ', the ' + seasonDay + nth
+ + ' day of ' + season
+ + ' in the YOLD ' + yold
+ + (celebrateHoliday ? '. Celebrate ' + celebrateHoliday + '!' : '')
+ ;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/dot-product.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/dot-product.md
new file mode 100644
index 00000000000..fd3f25cf6ad
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/dot-product.md
@@ -0,0 +1,75 @@
+---
+id: 5a23c84252665b21eecc7e1e
+title: Скалярний добуток
+challengeType: 5
+forumTopicId: 302251
+dashedName: dot-product
+---
+
+# --description--
+
+Створіть функцію, щоб обчислити **[скалярний добуток](https://en.wikipedia.org/wiki/Dot product)**, також відомий як **скалярний продукт** двох векторів.
+
+# --hints--
+
+`dotProduct` має бути функцією.
+
+```js
+assert(typeof dotProduct == 'function');
+```
+
+`dotProduct([1, 3, -5], [4, -2, -1])` має повертатись як число.
+
+```js
+assert(typeof dotProduct([1, 3, -5], [4, -2, -1]) == 'number');
+```
+
+`dotProduct([1, 3, -5], [4, -2, -1])` має повернути `3`.
+
+```js
+assert.equal(dotProduct([1, 3, -5], [4, -2, -1]), 3);
+```
+
+`dotProduct([1, 2, 3, 4, 5], [6, 7, 8, 9, 10])` має повернути `130`.
+
+```js
+assert.equal(dotProduct([1, 2, 3, 4, 5], [6, 7, 8, 9, 10]), 130);
+```
+
+`dotProduct([5, 4, 3, 2], [7, 8, 9, 6])` має повернути `106`.
+
+```js
+assert.equal(dotProduct([5, 4, 3, 2], [7, 8, 9, 6]), 106);
+```
+
+`dotProduct([-5, 4, -3, 2], [-7, -8, 9, -6])` має повернути `-36`.
+
+```js
+assert.equal(dotProduct([-5, 4, -3, 2], [-7, -8, 9, -6]), -36);
+```
+
+`dotProduct([17, 27, 34, 43, 15], [62, 73, 48, 95, 110])` має повернути `10392`.
+
+```js
+assert.equal(dotProduct([17, 27, 34, 43, 15], [62, 73, 48, 95, 110]), 10392);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function dotProduct(ary1, ary2) {
+
+}
+```
+
+# --solutions--
+
+```js
+function dotProduct(ary1, ary2) {
+ var dotprod = 0;
+ for (var i = 0; i < ary1.length; i++) dotprod += ary1[i] * ary2[i];
+ return dotprod;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/element-wise-operations.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/element-wise-operations.md
new file mode 100644
index 00000000000..1e599d1e3d6
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/element-wise-operations.md
@@ -0,0 +1,214 @@
+---
+id: 599c333915e0ea32d04d4bec
+title: Операції Element-wise
+challengeType: 5
+forumTopicId: 302252
+dashedName: element-wise-operations
+---
+
+# --description--
+
+Виконайте основні операції element-wise matrix-matrix і scalar-matrix.
+
+**Виконайте:**
+
+
+ додавання
+ віднімання
+ множення
+ ділення
+ піднесення до степеня
+
+
+Перший параметр буде виконувати операцію "m_add" для додавання матриці та "s_add" для скалярного додавання. Другий і третій параметри будуть матрицями, на яких повинні виконуватися дії.
+
+# --hints--
+
+`operation` має бути функцією.
+
+```js
+assert(typeof operation === 'function');
+```
+
+`operation("m_add",[[1,2],[3,4]],[[1,2],[3,4]])` має повернути `[[2,4],[6,8]]`.
+
+```js
+assert.deepEqual(
+ operation(
+ 'm_add',
+ [
+ [1, 2],
+ [3, 4]
+ ],
+ [
+ [1, 2],
+ [3, 4]
+ ]
+ ),
+ [
+ [2, 4],
+ [6, 8]
+ ]
+);
+```
+
+`operation("s_add",[[1,2],[3,4]],2)` має повернути `[[3,4],[5,6]]`.
+
+```js
+assert.deepEqual(
+ operation(
+ 's_add',
+ [
+ [1, 2],
+ [3, 4]
+ ],
+ 2
+ ),
+ [
+ [3, 4],
+ [5, 6]
+ ]
+);
+```
+
+`operation("m_sub",[[1,2],[3,4]],[[1,2],[3,4]])` має повернути `[[0,0],[0,0]]`.
+
+```js
+assert.deepEqual(
+ operation(
+ 'm_sub',
+ [
+ [1, 2],
+ [3, 4]
+ ],
+ [
+ [1, 2],
+ [3, 4]
+ ]
+ ),
+ [
+ [0, 0],
+ [0, 0]
+ ]
+);
+```
+
+`operation("m_mult",[[1,2],[3,4]],[[1,2],[3,4]])` має повернути `[[1,4],[9,16]]`.
+
+```js
+assert.deepEqual(
+ operation(
+ 'm_mult',
+ [
+ [1, 2],
+ [3, 4]
+ ],
+ [
+ [1, 2],
+ [3, 4]
+ ]
+ ),
+ [
+ [1, 4],
+ [9, 16]
+ ]
+);
+```
+
+`operation("m_div",[[1,2],[3,4]],[[1,2],[3,4]])` має повернути `[[1,1],[1,1]]`.
+
+```js
+assert.deepEqual(
+ operation(
+ 'm_div',
+ [
+ [1, 2],
+ [3, 4]
+ ],
+ [
+ [1, 2],
+ [3, 4]
+ ]
+ ),
+ [
+ [1, 1],
+ [1, 1]
+ ]
+);
+```
+
+`operation("m_exp",[[1,2],[3,4]],[[1,2],[3,4]])` має повернути `[[1,4],[27,256]]`.
+
+```js
+assert.deepEqual(
+ operation(
+ 'm_exp',
+ [
+ [1, 2],
+ [3, 4]
+ ],
+ [
+ [1, 2],
+ [3, 4]
+ ]
+ ),
+ [
+ [1, 4],
+ [27, 256]
+ ]
+);
+```
+
+`operation("m_add",[[1,2,3,4],[5,6,7,8]],[[9,10,11,12],[13,14,15,16]])` має повернути `[[10,12,14,16],[18,20,22,24]]`.
+
+```js
+assert.deepEqual(
+ operation(
+ 'm_add',
+ [
+ [1, 2, 3, 4],
+ [5, 6, 7, 8]
+ ],
+ [
+ [9, 10, 11, 12],
+ [13, 14, 15, 16]
+ ]
+ ),
+ [
+ [10, 12, 14, 16],
+ [18, 20, 22, 24]
+ ]
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function operation(op, arr1, arr2) {
+
+}
+```
+
+# --solutions--
+
+```js
+function operation(op, arr1, arr2) {
+ const ops = {
+ add: ((a, b) => a + b),
+ sub: ((a, b) => a - b),
+ mult: ((a, b) => a * b),
+ div: ((a, b) => a / b),
+ exp: ((a, b) => Math.pow(a, b))
+ };
+ const ifm = op.startsWith('m');
+ const doOp = ops[op.substring(2)];
+ for (let i = 0; i < arr1.length; i++) {
+ for (let j = 0; j < arr1[0].length; j++) {
+ arr1[i][j] = doOp(arr1[i][j], (ifm) ? (arr2[i][j]) : (arr2));
+ }
+ }
+ return arr1;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/emirp-primes.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/emirp-primes.md
new file mode 100644
index 00000000000..405381857e3
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/emirp-primes.md
@@ -0,0 +1,138 @@
+---
+id: 599d0ba974141b0f508b37d5
+title: Emirp primes (Прості числа Емірпа)
+challengeType: 5
+forumTopicId: 302253
+dashedName: emirp-primes
+---
+
+# --description--
+
+Emirp (**простий** написаний у зворотному порядку) є простими числами, які при зміні (у їх десятковому представленні) є різними простими числами.
+
+# --instructions--
+
+Напишіть функцію, яка:
+
+
+ Показує перші n прості числа.
+ Показує прості числа в діапазоні.
+ Показує кількість простих чисел у діапазоні.
+ Показує nth простого числа.
+
+
+Функція повинна приймати два параметри. Перший отримає `n` або діапазон у вигляді масиву. Другий отримає логічний тип, що вказує, чи повертається функція emirps у вигляді масиву або окремого числа (кількість простих чисел у діапазоні або просте число nth ). Відповідно до параметрів функція повинна повертати масив або число.
+
+# --hints--
+
+`emirps` має бути функцією.
+
+```js
+assert(typeof emirps === 'function');
+```
+
+`emirps(20,true)` повинен повертатися як `[13,17,31,37,71,73,79,97,107,113,149,157,167,179,199,311,337,347,359,389]`
+
+```js
+assert.deepEqual(emirps(20, true), [
+ 13,
+ 17,
+ 31,
+ 37,
+ 71,
+ 73,
+ 79,
+ 97,
+ 107,
+ 113,
+ 149,
+ 157,
+ 167,
+ 179,
+ 199,
+ 311,
+ 337,
+ 347,
+ 359,
+ 389
+]);
+```
+
+`emirps(1000)` повинен повертатися як `70529`
+
+```js
+assert.deepEqual(emirps(1000), 70529);
+```
+
+`emirps([7700,8000],true)` повинен повертатися як `[7717,7757,7817,7841,7867,7879,7901,7927,7949,7951,7963]`
+
+```js
+assert.deepEqual(emirps([7700, 8000], true), [
+ 7717,
+ 7757,
+ 7817,
+ 7841,
+ 7867,
+ 7879,
+ 7901,
+ 7927,
+ 7949,
+ 7951,
+ 7963
+]);
+```
+
+`emirps([7700,8000],false)` повинен повертатися як `11`
+
+```js
+assert.deepEqual(emirps([7700, 8000], false), 11);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function emirps(n) {
+
+}
+```
+
+# --solutions--
+
+```js
+function emirps(num, showEmirps)
+{
+ const is_prime = function(n)
+ {
+ if (!(n % 2) || !(n % 3)) return false;
+ let p = 1;
+ while (p * p < n)
+ { if (n % (p += 4) == 0 || n % (p += 2) == 0)
+ { return false; } }
+ return true;
+ };
+ const is_emirp = function(n) {
+ const r = parseInt(n.toString().split('').reverse().join(''));
+ return r != n && is_prime(n) && is_prime(r);
+ };
+
+ let i,
+ arr = [];
+ if (typeof num === 'number') {
+ for (i = 0; arr.length < num; i++) if (is_emirp(i)) arr.push(i);
+ // first x emirps
+ if (showEmirps) return arr;
+ // xth emirp
+ return arr.pop();
+ }
+
+ if (Array.isArray(num)) {
+ for (i = num[0]; i <= num[1]; i++) if (is_emirp(i)) arr.push(i);
+ // emirps between x .. y
+ if (showEmirps) return arr;
+ // number of emirps between x .. y
+ return arr.length;
+ }
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/entropy.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/entropy.md
new file mode 100644
index 00000000000..ba639e23235
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/entropy.md
@@ -0,0 +1,96 @@
+---
+id: 599d15309e88c813a40baf58
+title: Ентропія
+challengeType: 5
+forumTopicId: 302254
+dashedName: entropy
+---
+
+# --description--
+
+Обчислити інформаційну ентропію заданого вхідного рядка.
+
+Зважаючи на дискретну випадкову змінну $X$, яка є рядком для $N$ "символів" (всіх символів), що складається з $n$ різних символів (n=2 для бінарних), інформаційна ентропія для X в бітах/символах є:
+
+$H_2(X) = -\\sum\_{i=1}^n \\frac{count_i}{N} \\log_2 \\left(\\frac{count_i}{N}\\right)$
+
+де $count_i$ - це підрахунок символу $n_i$.
+
+# --hints--
+
+`entropy` має бути функцією.
+
+```js
+assert(typeof entropy === 'function');
+```
+
+`entropy("0")` має повернути `0`
+
+```js
+assert.equal(entropy('0'), 0);
+```
+
+`entropy("01")` має повернути `1`
+
+```js
+assert.equal(entropy('01'), 1);
+```
+
+`entropy("0123")` має повернути `2`
+
+```js
+assert.equal(entropy('0123'), 2);
+```
+
+`entropy("01234567")` має повернути `3`
+
+```js
+assert.equal(entropy('01234567'), 3);
+```
+
+`entropy("0123456789abcdef")` має повернути `4`
+
+```js
+assert.equal(entropy('0123456789abcdef'), 4);
+```
+
+`entropy("1223334444")` має повернути `1.8464393446710154`
+
+```js
+assert.equal(entropy('1223334444'), 1.8464393446710154);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function entropy(s) {
+
+}
+```
+
+# --solutions--
+
+```js
+function entropy(s) {
+ // Create a dictionary of character frequencies and iterate over it.
+ function process(s, evaluator) {
+ let h = Object.create(null),
+ k;
+ s.split('').forEach(c => {
+ h[c] && h[c]++ || (h[c] = 1); });
+ if (evaluator) for (k in h) evaluator(k, h[k]);
+ return h;
+ }
+ // Measure the entropy of a string in bits per symbol.
+
+ let sum = 0,
+ len = s.length;
+ process(s, (k, f) => {
+ const p = f / len;
+ sum -= p * Math.log(p) / Math.log(2);
+ });
+ return sum;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/equilibrium-index.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/equilibrium-index.md
new file mode 100644
index 00000000000..a3ee62bb08a
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/equilibrium-index.md
@@ -0,0 +1,130 @@
+---
+id: 5987fd532b954e0f21b5d3f6
+title: Індекс рівноваги
+challengeType: 5
+forumTopicId: 302255
+dashedName: equilibrium-index
+---
+
+# --description--
+
+Індекс рівноваги послідовності є індексом, де сума елементів у нижчих індексах дорівнює сумі елементів при більш високих індексах.
+
+До прикладу, у послідовності $A$:
+
+
+ $A_0 = -7$
+ $A_1 = 1$
+ $A_2 = 5$
+ $A_3 = 2$
+ $A_4 = -4$
+ $A_5 = 3$
+ $A_6 = 0$
+
+
+`3` є індексом рівноваги, тому що:
+
+
+ $A_0 + A_1 + A_2 = A_4 + A_5 + A_6$
+
+
+`6` є також індексом рівноваги, тому що:
+
+
+ $A_0 + A_1 + A_2 + A_3 + A_4 + A_5 = 0$
+
+
+(сума нульових елементів дорівнює нулю)
+
+`7` не є індексом рівноваги, оскільки це не є дійсним індексом послідовності $A$.
+
+# --instructions--
+
+Напишіть функцію, яка, за умови послідовності, повертає її показники рівноваги (якщо такі є).
+
+Припустимо, що послідовність може бути дуже довгою.
+
+# --hints--
+
+`equilibrium` має бути функцією.
+
+```js
+assert(typeof equilibrium === 'function');
+```
+
+`equilibrium([-7, 1, 5, 2, -4, 3, 0])` має повертати `[3,6]`.
+
+```js
+assert.deepEqual(equilibrium(equilibriumTests[0]), ans[0]);
+```
+
+`equilibrium([2, 4, 6])` має повертати `[]`.
+
+```js
+assert.deepEqual(equilibrium(equilibriumTests[1]), ans[1]);
+```
+
+`equilibrium([2, 9, 2])` має повертати `[1]`.
+
+```js
+assert.deepEqual(equilibrium(equilibriumTests[2]), ans[2]);
+```
+
+`equilibrium([1, -1, 1, -1, 1, -1, 1])` має повертати `[0,1,2,3,4,5,6]`.
+
+```js
+assert.deepEqual(equilibrium(equilibriumTests[3]), ans[3]);
+```
+
+`equilibrium([1])` має повертати `[0]`.
+
+```js
+assert.deepEqual(equilibrium(equilibriumTests[4]), ans[4]);
+```
+
+`equilibrium([])` має повертати `[]`.
+
+```js
+assert.deepEqual(equilibrium(equilibriumTests[5]), ans[5]);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+const equilibriumTests =
+ [[-7, 1, 5, 2, -4, 3, 0], // 3, 6
+ [2, 4, 6], // empty
+ [2, 9, 2], // 1
+ [1, -1, 1, -1, 1, -1, 1], // 0,1,2,3,4,5,6
+ [1], // 0
+ [] // empty
+ ];
+const ans = [[3, 6], [], [1], [0, 1, 2, 3, 4, 5, 6], [0], []];
+```
+
+## --seed-contents--
+
+```js
+function equilibrium(a) {
+
+}
+```
+
+# --solutions--
+
+```js
+function equilibrium(a) {
+ let N = a.length,
+ i,
+ l = [],
+ r = [],
+ e = [];
+ for (l[0] = a[0], r[N - 1] = a[N - 1], i = 1; i < N; i++)
+ { l[i] = l[i - 1] + a[i], r[N - i - 1] = r[N - i] + a[N - i - 1]; }
+ for (i = 0; i < N; i++)
+ { if (l[i] === r[i]) e.push(i); }
+ return e;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/ethiopian-multiplication.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/ethiopian-multiplication.md
new file mode 100644
index 00000000000..21f0fdeb639
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/ethiopian-multiplication.md
@@ -0,0 +1,156 @@
+---
+id: 599d1566a02b571412643b84
+title: Ефіопське множення
+challengeType: 5
+forumTopicId: 302257
+dashedName: ethiopian-multiplication
+---
+
+# --description--
+
+Ефіопське множення - це метод множення цілих чисел за допомогою лише додавання, подвоєння та ділення на два.
+
+**Метод:**
+
+
+ Візьміть два числа, щоб помножити і записати їх зверху двох стовпчиків
+ У лівому стовпчику діліть на два останнє число кілька разів, відкидаючи будь-які остачі, і записуйте результат нижче в цей самий стовпчик, поки не запишете значення 1
+ У правій колонці множте на два останнє число повторювано і запишіть результат нижче. зупиніться, коли ви вписали число в тому ж рядку, де лівий стовпчик показує 1
+ Перегляньте отриману таблицю, і відкиньте будь-який рядок, де значення в лівому стовпчику - парне
+ Підсумуйте значення в правому стовпчику так, щоб отримати результат множення двох початкових цифр
+
+
+** Наприклад:** `17 × 34`
+
+17 34
+
+
+Ділимо перший стовпчик:
+
+17 34
+8
+4
+2
+1
+
+
+Множимо на два другий стовпчик:
+
+17 34
+8 68
+4 136
+2 272
+1 544
+
+
+Закреслюємо рядки, в яких перша комірка парна:
+
+17 34
+8 68
+4 136
+2 272
+1 544
+
+
+Підсумовуємо решту цифр в правому стовпчику:
+
+
+
+17 34
+8 --
+4 ---
+2 ---
+1 544
+ ====
+ 578
+
+
+
+
+Отже `17` помножене `34`, за ефіопським методом - `578`.
+
+# --instructions--
+
+Завданням полягає в тому, щоб визначити три іменовані функції, методи, процедури, підпрограми:
+
+
+ від одиниці до половини цілого числа,
+ від одиниці до подвійного цілого, і
+ від одиниці до моменту, коли ціле число є парним
+
+
+Використовуйте ці функції, щоб створити функцію, яка виконує ефіопське множення.
+
+
+
+# --hints--
+
+`eth_mult` має бути функцією.
+
+```js
+assert(typeof eth_mult === 'function');
+```
+
+`eth_mult(17,34)` має повертати `578`.
+
+```js
+assert.equal(eth_mult(17, 34), 578);
+```
+
+`eth_mult(23,46)` має повертати `1058`.
+
+```js
+assert.equal(eth_mult(23, 46), 1058);
+```
+
+`eth_mult(12,27)` має повертати `324`.
+
+```js
+assert.equal(eth_mult(12, 27), 324);
+```
+
+`eth_mult(56,98)` має повертати `5488`.
+
+```js
+assert.equal(eth_mult(56, 98), 5488);
+```
+
+`eth_mult(63,74)` має повертати `4662`.
+
+```js
+assert.equal(eth_mult(63, 74), 4662);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function eth_mult(a, b) {
+
+}
+```
+
+# --solutions--
+
+```js
+function eth_mult(a, b) {
+ let sum = 0; a = [a]; b = [b];
+
+ let half = a => a / 2,
+ double = a => a * 2,
+ is_even = a => a % 2 == 0;
+
+ while (a[0] !== 1) {
+ a.unshift(Math.floor(half(a[0])));
+ b.unshift(double(b[0]));
+ }
+
+ for (let i = a.length - 1; i > 0; i -= 1) {
+ if (!is_even(a[i])) {
+ sum += b[i];
+ }
+ }
+ return sum + b[0];
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/euler-method.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/euler-method.md
new file mode 100644
index 00000000000..9cba4e9b1ea
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/euler-method.md
@@ -0,0 +1,152 @@
+---
+id: 59880443fb36441083c6c20e
+title: Метод Ейлера
+challengeType: 5
+forumTopicId: 302258
+dashedName: euler-method
+---
+
+# --description--
+
+Метод Ейлера чисельно наближує рішення звичайних рівнянь першого порядку (ODE) з заданим початковим значенням. Це явний метод вирішення проблем із початковими значеннями (IVP), описаний у [цій статті](https://www.freecodecamp.org/news/eulers-method-explained-with-examples/ "news: Euler's Method Explained with Examples").
+
+ODE повинен бути наданий за такою формою:
+
+
+ $\frac{dy(t)}{dt} = f(t,y(t))$
+
+
+з початковим значенням
+
+
+
+Щоб отримати числове рішення, ми заміняємо похідну на LHS з скінченним наближенням до різниці:
+
+
+ $\frac{dy(t)}{dt} \approx \frac{y(t+h)-y(t)}{h}$
+
+
+тоді вирішіть для $y(t+h)$:
+
+
+ $y(t+h) \approx y(t) + h \, \frac{dy(t)}{dt}$
+
+
+що є тим самим, як і
+
+
+ $y(t+h) \approx y(t) + h \, f(t,y(t))$
+
+
+Тоді, правило повторного рішення:
+
+
+ $y_{n+1} = y_n + h \, f(t_n, y_n)$
+
+
+де $h$ - розмір кроку, найбільш відповідний параметр для точності рішення. Менший розмір кроку збільшує точність, але й обчислювальні витрати, тому вони завжди повинні бути підібрані вручну відповідно до завдань.
+
+**Приклад: Закон Ньютона**
+
+Закон Ньютона описує як об’єкт початкової температури $T(t_0) = T_0$ охолоджується в умовах температури $T_R$:
+
+
+ $\frac{dT(t)}{dt} = -k \, \Delta T$
+
+
+або
+
+
+ $\frac{dT(t)}{dt} = -k \, (T(t) - T_R)$
+
+
+Він каже, що швидкість охолодження $\\frac{dT(t)}{dt}$ $ об'єктів пропорційна поточній різниці температури $\\Delta T = (T(t) - T_R)$ в навколишнє середовище.
+
+Аналітичне рішення, яке ми будемо порівняти з числовим наближенням, є
+
+
+ $T(t) = T_R + (T_0 - T_R) \; e^{-k t}$
+
+
+# --instructions--
+
+Реалізуйте розпорядок методу Ейлера та використовуйте його для рішення заданого прикладу закону Ньютона про три різні розміри кроку:
+
+
+
+та порівняти з аналітичним рішенням.
+
+**Початкові значення:**
+
+
+ початкова температура $T_0$ має бути 100 °C
+ температура кімнати $T_R$ має бути 20 °C
+ охолодження константи $k$ має буде 0.07
+ інтервал обчислення повинен бути від 0 s до 100 s
+
+
+Перший параметр функції - це початковий час, другий параметр - початкова температура, третій - минулий час і четвертий параметр - крок розміру.
+
+# --hints--
+
+`eulersMethod` має бути функцією.
+
+```js
+assert(typeof eulersMethod === 'function');
+```
+
+`eulersMethod(0, 100, 100, 2)` має повернути число.
+
+```js
+assert(typeof eulersMethod(0, 100, 100, 2) === 'number');
+```
+
+`eulersMethod(0, 100, 100, 2)` має повернути 20.0424631833732.
+
+```js
+assert.equal(eulersMethod(0, 100, 100, 2), 20.0424631833732);
+```
+
+`eulersMethod(0, 100, 100, 5)` має повернути 20.01449963666907.
+
+```js
+assert.equal(eulersMethod(0, 100, 100, 5), 20.01449963666907);
+```
+
+`eulersMethod(0, 100, 100, 10)` має повернути 20.000472392.
+
+```js
+assert.equal(eulersMethod(0, 100, 100, 10), 20.000472392);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function eulersMethod(x1, y1, x2, h) {
+
+}
+```
+
+# --solutions--
+
+```js
+function eulersMethod(x1, y1, x2, h) {
+ let x = x1;
+ let y = y1;
+
+ while ((x < x2 && x1 < x2) || (x > x2 && x1 > x2)) {
+ y += h * (-0.07 * (y - 20));
+ x += h;
+ }
+
+ return y;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/evaluate-binomial-coefficients.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/evaluate-binomial-coefficients.md
new file mode 100644
index 00000000000..df13df3169c
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/evaluate-binomial-coefficients.md
@@ -0,0 +1,74 @@
+---
+id: 598de241872ef8353c58a7a2
+title: Оцініть біноміальні коефіцієнти
+challengeType: 5
+forumTopicId: 302259
+dashedName: evaluate-binomial-coefficients
+---
+
+# --description--
+
+Напишіть функцію для обчислення біноміального коефіцієнта для заданих значень n і k.
+
+Рекомендується така формула:
+
+$\\binom{n}{k} = \\frac{n!}{(n-k)!k!} = \\frac{n(n-1)(n-2)\\ldots(n-k+1)}{k(k-1)(k-2)\\ldots 1}$
+
+# --hints--
+
+`binom` має бути функцією.
+
+```js
+assert(typeof binom === 'function');
+```
+
+`binom(5,3)` має повернути число 10.
+
+```js
+assert.equal(binom(5, 3), 10);
+```
+
+`binom(7,2)` має повернути число 21.
+
+```js
+assert.equal(binom(7, 2), 21);
+```
+
+`binom(10,4)` має повернути число 210.
+
+```js
+assert.equal(binom(10, 4), 210);
+```
+
+`binom(6,1)` має повернути число 6.
+
+```js
+assert.equal(binom(6, 1), 6);
+```
+
+`binom(12,8)` має повернути число 495.
+
+```js
+assert.equal(binom(12, 8), 495);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function binom(n, k) {
+
+}
+```
+
+# --solutions--
+
+```js
+function binom(n, k) {
+ let coeff = 1;
+ for (let i = n - k + 1; i <= n; i++) coeff *= i;
+ for (let i = 1; i <= k; i++) coeff /= i;
+ return coeff;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/execute-a-markov-algorithm.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/execute-a-markov-algorithm.md
new file mode 100644
index 00000000000..c1397c07a9c
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/execute-a-markov-algorithm.md
@@ -0,0 +1,246 @@
+---
+id: 59e09e6d412c5939baa02d16
+title: Виконайте алгоритм Маркова
+challengeType: 5
+forumTopicId: 302260
+dashedName: execute-a-markov-algorithm
+---
+
+# --description--
+
+Створіть інтерпретацію для сторінки [алгоритм Маркова](https://en.wikipedia.org/wiki/Markov algorithm "wp: Markov algorithm").
+
+Граматична побудова правил:
+
+[ruleset] ::= (([comment] | [rule]) [newline]+)*
+[comment] ::= # {[будь-який символ]}
+[rule] ::= [pattern] [whitespace] -> [whitespace] [.] [replacement]
+[whitespace] ::= ([tab] | [space]) [[whitespace]]
+
+
+У кожному рядку по одному правилу.
+
+Якщо `.` (крапка) стоїть перед \[replacement], тоді це кінцеве правило, у випадку котрого інтерпретатор повинен зупинити виконання.
+
+Набір правил складається з послідовності певних норм та умовних додатків.
+
+Правила
+
+Використовуйте поточні вправи на початку:
+
+**Правило 1:**
+
+# Цей файл з правилами взято з Вікіпедії:
+#
+http://en.wikipedia.org/wiki/Markov_Algorithm
+A -> яблуко
+B -> мішок
+S -> магазин
+T -> артикль "the"
+магазин -> мій брат
+невикористаний -> .кінцеве правило
+
+
+Зразок тексту `я купив B As у T S.` має повернути речення`я купив мішок яблук у мого брата.`
+
+**Правило 2:**
+
+Перевірка кінцевого правила
+
+# Трохи змінено правила з Вікіпедії
+A -> яблуко
+B -> сумка
+S -> . магазин
+T -> the
+магазин -> мій брат
+ніколи не використовувався -> .кінцева умова
+
+
+Зразок тексту `я купив B As у T S.`повинен згенерувати`я купив мішок яблук у цьому магазині.`
+
+**Правило 3:**
+
+Ці вправи призначені для правильної заміни порядку, вони можуть закрити замінні послідовності, базовані на простих регулярних виразах, якщо символів спеціальних регулярних виразів не оминули.
+
+# BNF правила синтаксичного тестування
+-> яблуко
+WWW -> з
+Bgage -> ->.*
+B -> сумка
+->. -> гроші
+W -> WW
+S -> . магазин
+T ->
+магазин -> мій брат
+ніколи не використовувався -> закінчення правила
+
+
+Зразок тексту `я купив As B W свої Bgage у T S.` повинний перетворитися у `я купив мішок яблук за свої гроші у T магазині.`
+
+**Правило 4:**
+
+Ці тести для правильного порядку сканування правил може ловити підпрограми, що сканують в неправильному порядку. Це реалізує загальний двовимірний механізм множення. (Зверніть увагу, що вхідний вираз повинен бути в підкресленнях у цій реалізації.)
+
+### Унарний механізм множення для тестування виконання алгоритму Маркова
+### За методом Дона Феллоуза.
+Одинарна додаткова система:
+_+1 -> _1+
+1+1 -> 11+
+# Передача для конвертування від поділу множинного до звичайного
+# додаток
+1! -> !1,! -> !+
+_! -> _
+# Одинарне множення шляхом дублювання лівої сторони, часів правої сторони
+1*1 -> x,@y
+1x -> xX
+X, -> 1,1
+X1 -> 1X
+_x -> _X
+,x -> ,X
+y1 -> 1y
+y_ -> _
+# Наступний етап додавання
+1@1 -> x,@y
+1@_ -> @_
+,@_ -> !_
+++ -> +
+# Припинення очищення для додатку:
+_1 -> 1
+1+_ -> 1
+_+_ ->
+
+
+Зразок тексту `_1111*11111_` повинний згенерувати наступне`11111111111111111111`
+
+**Правило 5:**
+
+Проста [Машина Тюрінга](http://en.wikipedia.org/wiki/Turing_machine "link: http://en.wikipedia.org/wiki/Turing_machine"), здійснюючи трьохстановий [busy beaver](http://en.wikipedia.org/wiki/Busy_beaver "link: http://en.wikipedia.org/wiki/Busy_beaver").
+
+Стрічка складається з`0`s та`1`s, станами є `A`, `B`, `C` і `H` (для `H`alt), початкова позиція визначається написанням літери стану перед символом початку. Усі частини початкової стрічки, на яких працює машина, мають вказані у вхідних даних.
+
+Окрім демонстрації того, що алгоритм Маркова є довершенням Тюрінга, він допоміг мені виявити проблему у реалізації C++, котра не була помічною у попередніх правилах.
+
+# Машина Тюрінга: трьохстановий Busy beaver:
+#
+#стан А, символ 0=> пишемо 1, переносимо праворуч, новий стан В
+А0 -> 1B
+# стан А, символ 1=> пишемо 1, переносимо ліворуч, новий стан C
+0A1 -> C01
+1A1 -> C11
+# стан В, символ 0 => пишемо 1, переносимо ліворуч, новий стан А
+0B0 -> A01
+1B0 -> A11
+# стан B, символ 1 => пишемо 1, переносимо праворуч, новий стан В
+B1 -> 1B
+# стан С, символ => 1 пишемо 1, переносимо ліворуч, новий стан В
+0C0 -> B01
+1C0 -> B11
+# стан С, символ => 1 пишемо 1, переносимо ліворуч, зупиняємо
+0C1 -> H01
+1C1 -> H11
+
+
+Цей набір правил повинен перетворитися з `000000A000000` у `00011H1111000`
+
+# --hints--
+
+`markov` повинен бути функцією.
+
+```js
+assert(typeof markov === 'function');
+```
+
+`markov(["A -> apple","B -> bag","S -> shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],"I bought a B of As from T S.")` повинно повертати "я купив мішок яблук у мого брата".
+
+```js
+assert.deepEqual(markov(rules[0], tests[0]), outputs[0]);
+```
+
+`markov(["A -> apple","B -> bag","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],"I bought a B of As from T S.")` має повертати "я купив мішок яблук у цьому магазині".
+
+```js
+assert.deepEqual(markov(rules[1], tests[1]), outputs[1]);
+```
+
+`markov(["A -> apple","WWWW -> with","Bgage -> ->.*","B -> bag","->.* -> money","W -> WW","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],"I bought a B of As W my Bgage from T S.")` має повертати "я купив мішок яблук за мої грошу у цьому магазині".
+
+```js
+assert.deepEqual(markov(rules[2], tests[2]), outputs[2]);
+```
+
+`Марков(["_+1 -> _1+","1+1 -> 11+","1! -> !1",",! -> !+","_! -> _","1*1 -> x,@y","1x -> xX","X, -> 1,1","X1 -> 1X","_x -> _X",", -> ,X","y1 -> 1y","y_ -> _","1@1 -> x,@y","1@_ -> @_",",@_ -> ! ","++ -> +","_1 -> 1","1+_ -> ","_+_ -> "],"_11*11111_")` повинен повернути "11111111111111111111111111111111111111".
+
+```js
+assert.deepEqual(markov(rules[3], tests[3]), outputs[3]);
+```
+
+`markov(["A0 -> 1B","0A1 -> C01","1A1 -> C11","0B0 -> A01","1B0 -> A11","B1 -> 1B","0C0 -> B01","1C0 -> B11","0C1 -> H01","1C1 -> H11"],"")` повинен повернути "00011H1111000".
+
+```js
+assert.deepEqual(markov(rules[4], tests[4]), outputs[4]);
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+
+let rules=[["A -> apple","B -> bag","S -> shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],
+ ["A -> apple","B -> bag","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],
+ ["A -> apple","WWWW -> with","Bgage -> ->.*","B -> bag","->.* -> money","W -> WW","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],
+ ["_+1 -> _1+","1+1 -> 11+","1! -> !1",",! -> !+","_! -> _","1*1 -> x,@y","1x -> xX","X, -> 1,1","X1 -> 1X","_x -> _X",",x -> ,X","y1 -> 1y","y_ -> _","1@1 -> x,@y","1@_ -> @_",",@_ -> !_","++ -> +","_1 -> 1","1+_ -> 1","_+_ -> "],
+ ["A0 -> 1B","0A1 -> C01","1A1 -> C11","0B0 -> A01","1B0 -> A11","B1 -> 1B","0C0 -> B01","1C0 -> B11","0C1 -> H01","1C1 -> H11"]];
+let tests=["I bought a B of As from T S.",
+ "I bought a B of As from T S.",
+ "I bought a B of As W my Bgage from T S.",
+ "_1111*11111_",
+ "000000A000000"];
+let outputs=["I bought a bag of apples from my brother.",
+ "I bought a bag of apples from T shop.",
+ "I bought a bag of apples with my money from T shop.",
+ "11111111111111111111",
+ "00011H1111000"]
+
+```
+
+
+## --seed-contents--
+
+```js
+function markov(rules,test) {
+
+}
+```
+
+# --solutions--
+
+```js
+function markov(rules,test) {
+ let pattern = new RegExp("^([^#]*?)\\s+->\\s+(\\.?)(.*)");
+ let origTest = test;
+
+ let captures = [];
+
+ rules.forEach(function(rule){
+ let m = pattern.exec(rule);
+ for (let j = 0; j < m.length; j++)
+ m[j] = m[j + 1];
+ captures.push(m);
+ });
+
+ test = origTest;
+ let copy = test;
+ for (let j = 0; j < captures.length; j++) {
+ let c = captures[j];
+ test = test.replace(c[0], c[2]);
+ if (c[1]==".")
+ break;
+ if (test!=copy) {
+ j = -1;
+ copy = test;
+ }
+ }
+ return test;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/execute-brain.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/execute-brain.md
new file mode 100644
index 00000000000..72b52c15849
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/execute-brain.md
@@ -0,0 +1,229 @@
+---
+id: 59e0a8df964e4540d5abe599
+title: Execute Brain****
+challengeType: 5
+forumTopicId: 302261
+dashedName: execute-brain
+---
+
+# --description--
+
+Напишіть функцію для запуску Brain\*\*\*\* перекладача. Функція бере рядок як параметр і на виході також виходить рядок. Деталі наведено нижче:
+
+RCBF є набором [Brainf\*\*\*](https://rosettacode.org/wiki/Brainf*** "Brainf\*\*\*") компіляторів та інтерпретаторів, написаних Rosetta code різними мовами.
+
+Нижче наведено посилання на кожну з версій RCBF.
+
+Впровадження потребує чіткого дотримання таких інструкцій:Пропустіть збіг якщо комірка під курсором дорівнює 0</td>
+</tr>
+<tr>
+ <td> ]</td>
+ <td>Поверніться до функції збігу / якщо комірка під курсором не є 0</td>
+</tr>
+</tbody>
+</table>
+
+<p spaces-before="0">Розмір комірки може бути довільним, EOF (<em x-id="3">E</em>nd-<em x-id="3">O</em>-<em x-id="3">F</em>ile) підтримка не є обов’язковою, так само як і наявність обмеженої й необмеженої пам’яті.</p>
+
+<h1 spaces-before="0">--hints--</h1>
+
+<p spaces-before="0"><code>brain(bye) повинен вивести рядок
+
+
+
+```js
+assert(typeof brain(bye) === 'string');
+```
+
+
+`brain ("++++++[>++++++++++<-]>+++++.")` повинен вивести рядок “A”
+
+
+
+```js
+assert.equal(brain('++++++[>++++++++++<-]>+++++.'), 'A');
+```
+
+
+`brain(bye)`повинен вивести `Goodbye, World!\r\n`
+
+
+
+```js
+assert.equal(brain(bye), 'Goodbye, World!\r\n');
+```
+
+
+`brain(hello)`повинен вивести`Hello World!\n`
+
+
+
+```js
+assert.equal(brain(hello), 'Hello World!\n');
+```
+
+
+`brain(fib)`повинен вивести`1, 1, 2, 3, 4, 5, 8, 13, 21, 34, 55, 89`
+
+
+
+```js
+assert.equal(brain(fib), '1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89');
+```
+
+
+
+
+# --seed--
+
+
+
+## --before-user-code--
+
+
+
+```js
+let fib=`+
+
+++
+
++++
+
+++++
+
++>+>>
+
+>>++++
+
++++++++
+
+++++++++
+
++++++++++
+
+++++++++++
+
+++++++>++++
+
+++++++++++++
+
++++++++++++++
+
++++<<<<<<[>[>>
+
+>>>>+>+<<<<<<<-
+
+]>>>>>>>[<<<<<<<
+
++>>>>>>>-]<[>++++
+
+++++++[-<-[>>+>+<<
+
+<-]>>>[<<<+>>>-]+<[
+
+>[-]<[-]]>[<<[>>>+<<
+
+<-]>>[-]]<<]>>>[>>+>+
+
+<<<-]>>>[<<<+>>>-]+<[>
+
+[-]<[-]]>[<<+>>[-]]<<<<
+
+<<<]>>>>>[++++++++++++++
+
++++++++++++++++++++++++++
+
++++++++++.[-]]++++++++++<[
+
+->-<]>+++++++++++++++++++++
+
++++++++++++++++++++++++++++.
+
+[-]<<<<<<<<<<<<[>>>+>+<<<<-]>
+
+>>>[<<<<+>>>>-]<-[>>.>.<<<[-]]
+
+<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+
+
+>-]>[<+>-]<<<-]`;
+let hello='++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.'
+let bye='++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>>>+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++.<+++++++.--------.<<<<<+.<+++.---.';
+```
+
+
+
+
+## --seed-contents--
+
+
+
+```js
+function brain(prog) {
+
+}
+```
+
+
+
+
+# --solutions--
+
+
+
+```js
+function brain(prog){
+ var output="";
+ var code; // formatted code
+ var ip = 0; // current instruction within code
+ var nest = 0; // current bracket nesting (for Out button)
+ var ahead = []; // locations of matching brackets
+
+ var data = [0]; // data array (mod by +, -)
+ var dp = 0; // index into data (mod by <, >)
+
+ var inp = 0; // current input character (fetch with ,)
+ var quit = 0;
+ var commands = {
+ '>':function() { if (++dp >= data.length) data[dp]=0 },
+ '<':function() { if (--dp < 0) quit++ },
+ '+':function() { ++data[dp] },
+ '-':function() { --data[dp] },
+ '[':function() { if (!data[dp]) ip = ahead[ip]; else ++nest },
+ ']':function() { if ( data[dp]) ip = ahead[ip]; else --nest },
+ ',':function() {
+ var c = document.getElementById("input").value.charCodeAt(inp++);
+ data[dp] = isNaN(c) ? 0 : c; // EOF: other options are -1 or no change
+ },
+ '.':function() {
+ output+=String.fromCharCode(data[dp]);
+ /*var s = document.getElementById("output").innerHTML)
+ + String.fromCharCode(data[dp]);
+ s = s.replace(/\n/g," ").replace(/ /g," ");
+ document.getElementById("output").innerHTML = s;*/
+ },
+ };
+
+ let ar=prog.split('');
+ var st = [], back, error = -1;
+ for (ip=0; ip
+ Показувати перші n прості числа
+ Показувати прості числа в діапазоні
+ Показувати число простих чисел у діапазоні
+ Показувати nth просте число
+
+
+Функція повинна мати два параметри. Перший отримає `n` або діапазон у вигляді масиву. Другий отримає логічний тип даних, що вказує, чи повертає функція прості числа у вигляді масиву або одного і того ж числа (кількість простих чисел у діапазоні або nth просте число). Відповідно до параметрів функція має повернути масив.
+
+# --hints--
+
+`primeGenerator` має бути функцією.
+
+```js
+assert(typeof primeGenerator === 'function');
+```
+
+`primeGenerator(20, true)` має повернути `[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]`.
+
+```js
+assert.deepEqual(primeGenerator(20, true), [
+ 2,
+ 3,
+ 5,
+ 7,
+ 11,
+ 13,
+ 17,
+ 19,
+ 23,
+ 29,
+ 31,
+ 37,
+ 41,
+ 43,
+ 47,
+ 53,
+ 59,
+ 61,
+ 67,
+ 71
+]);
+```
+
+`primeGenerator([100, 150], true)` має повернути `[101, 103, 107, 109, 113, 127, 131, 137, 139, 149]`.
+
+```js
+assert.deepEqual(primeGenerator([100, 150], true), [
+ 101,
+ 103,
+ 107,
+ 109,
+ 113,
+ 127,
+ 131,
+ 137,
+ 139,
+ 149
+]);
+```
+
+`primeGenerator([7700, 8000], false)` має повернути `30`.
+
+```js
+assert.equal(primeGenerator([7700, 8000], false), 30);
+```
+
+`primeGenerator(10000, false)` має повернути `104729`.
+
+```js
+assert.equal(primeGenerator(10000, false), 104729);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function primeGenerator(num, showPrimes) {
+
+}
+```
+
+# --solutions--
+
+```js
+function primeGenerator(num, showPrimes) {
+ let i,
+ arr = [];
+
+ function isPrime(num) {
+ // try primes <= 16
+ if (num <= 16) { return (
+ num == 2 || num == 3 || num == 5 || num == 7 || num == 11 || num == 13
+ ); }
+ // cull multiples of 2, 3, 5 or 7
+ if (num % 2 == 0 || num % 3 == 0 || num % 5 == 0 || num % 7 == 0)
+ { return false; }
+ // cull square numbers ending in 1, 3, 7 or 9
+ for (let i = 10; i * i <= num; i += 10) {
+ if (num % (i + 1) == 0) return false;
+ if (num % (i + 3) == 0) return false;
+ if (num % (i + 7) == 0) return false;
+ if (num % (i + 9) == 0) return false;
+ }
+ return true;
+ }
+
+ if (typeof num === 'number') {
+ for (i = 0; arr.length < num; i++) if (isPrime(i)) arr.push(i);
+ // first x primes
+ if (showPrimes) return arr;
+ // xth prime
+ return arr.pop();
+ }
+
+ if (Array.isArray(num)) {
+ for (i = num[0]; i <= num[1]; i++) if (isPrime(i)) arr.push(i);
+ // primes between x .. y
+ if (showPrimes) return arr;
+ // number of primes between x .. y
+ return arr.length;
+ }
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/factorial.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/factorial.md
new file mode 100644
index 00000000000..2d040f209be
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/factorial.md
@@ -0,0 +1,80 @@
+---
+id: 597b2b2a2702b44414742771
+title: Факторіал
+challengeType: 5
+forumTopicId: 302263
+dashedName: factorial
+---
+
+# --description--
+
+Напишіть функцію для повернення факторіалу числа.
+
+Факторіал числа визначається як:
+
+n! = n * (n-1) * (n-2) * ..... * 1
+
+
+Наприклад:
+
+
+ 3! = 3 * 2 * 1 = 6
+ 4! = 4 * 3 * 2 * 1 = 24
+
+
+**Примітка:** `0! = 1`
+
+# --hints--
+
+`factorial` має бути функцією.
+
+```js
+assert(typeof factorial === 'function');
+```
+
+`factorial(2)` має повернути число.
+
+```js
+assert(typeof factorial(2) === 'number');
+```
+
+`factorial(3)` має повернути число 6.
+
+```js
+assert.equal(factorial(3), 6);
+```
+
+`factorial(5)` має повернути число 120.
+
+```js
+assert.equal(factorial(5), 120);
+```
+
+`factorial(10)` має повернути число 3,628,800.
+
+```js
+assert.equal(factorial(10), 3628800);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function factorial(n) {
+
+}
+```
+
+# --solutions--
+
+```js
+function factorial(n) {
+ let sum = 1;
+ while (n > 1) {
+ sum *= n;
+ n--;
+ }
+ return sum;
+}
+```
diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/factors-of-a-mersenne-number.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/factors-of-a-mersenne-number.md
new file mode 100644
index 00000000000..a5ecd1f7ad8
--- /dev/null
+++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/factors-of-a-mersenne-number.md
@@ -0,0 +1,148 @@
+---
+id: 598eea87e5cf4b116c3ff81a
+title: Фактори числа Мерсенна
+challengeType: 5
+forumTopicId: 302264
+dashedName: factors-of-a-mersenne-number
+---
+
+# --description--
+
+Число Мерсенна - це число у вигляді 2P -1.
+
+Якщо `P` є простим, то число Мерсенна може бути простим числом Мерсенна. (Якщо `P` не є простим, число Мерсенна також не є простим.)
+
+У пошуку простих чисел Мерсенна вигідно усунути експоненти, знайшовши невеликий фактор перед початком, потенційно довжину, [тест Лукас-Лемер](https://rosettacode.org/wiki/Lucas-Lehmer test "Lucas-Lehmer test").
+
+Існують дуже ефективні алгоритми визначення, чи число ділиться на 2P -1 (або відповідно, якщо 2P мод (число) = 1).
+
+Деякі мови вже мають вбудовані реалізації цієї операції експонента і моду (так званої modPow або подібні).
+
+Нижче зрозуміло, як реалізувати цей modPow самостійно:
+
+Наприклад, обчислимо 223 мод 47.
+
+Перетворимо експонент 23 у двійковий, ви отримаєте 10111. Починаючи з квадрат = 1, повторно піднести до квадрату.
+
+Видаліть верхній біт степеня, і якщо його 1 помножити на `square` на основу піднесення до степеня (2), потім обчислити квадрат модуль 47.
+
+Використовуйте результат модуля від останнього кроку як початкове значення `square` в наступному кроці:
+
+Видалити необов'язковий
+квадрат, помножений на 2 мод 47
+------------ ------- ---
+1*1 = 1 0111 1*2 = 2
+2*2 = 4 0 111 без 4
+4*4 16 = 1 11 16*2 = 32
+32*32 4*32 1024 1 1024*2 = 2048
+27*2 = 7291 *2 = 1458 1*2 = 1458
+
+
+Починаючи з 2 мод 47 = 1, 47 є фактором 2P -1.
+
+(Щоб побачити це, відніміть 1 від обох сторін: 223 -1 = 0 мод 47)
+
+Оскільки ми показали, що 47 це фактор, 223 -1 не є простим.
+
+Подальші властивості Мерсенного числа дозволяють нам ще більше вдосконалити процес.
+
+Будь-який фактор, `q` з 2P -1 повинен бути у вигляді `2kP+1`, `k` це додатне ціле число або нуль. Крім того, `q` має бути `1` або `7 mod 8`.
+
+Нарешті будь-який потенційний множник `q` має бути [prime](https://rosettacode.org/wiki/Primality by Trial Division "Primality by Trial Division").
+
+Як і в інших алгоритмах пробного ділення, алгоритм припиняється, коли `2kP+1 > sqrt(N)`. Ці в першу чергу тести працюють лише з цифрами Мерсенна, де `P` - це просте число. Наприклад, M4 =15 не дає ніяких чинників, використовуючи ці технології, але фактори в 3 та 5, жоден з яких не відповідає `2kP+1`.
+
+# --instructions--
+
+Використовуючи вказаний метод, знайти коефіцієнт 2р -1.
+
+# --hints--
+
+`check_mersenne` має бути функцією.
+
+```js
+assert(typeof check_mersenne === 'function');
+```
+
+`check_mersenne(3)` має повернути рядок.
+
+```js
+assert(typeof check_mersenne(3) == 'string');
+```
+
+`check_mersenne(3)`повинен повертатися рядок `M3 = 2^3-1 is prime`.
+
+```js
+assert.equal(check_mersenne(3), 'M3 = 2^3-1 is prime');
+```
+
+`check_mersenne(23)` повинен повертатися як рядок `M23 = 2^23-1 is composite with factor 47`.
+
+```js
+assert.equal(check_mersenne(23), 'M23 = 2^23-1 is composite with factor 47');
+```
+
+`check_mersenne(929)` повинен повертати рядок `M929 = 2^929-1 is composite with factor 13007`.
+
+```js
+assert.equal(
+ check_mersenne(929),
+ 'M929 = 2^929-1 is composite with factor 13007'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function check_mersenne(p) {
+
+}
+```
+
+# --solutions--
+
+```js
+function check_mersenne(p){
+ function isPrime(value){
+ for (let i=2; i < value; i++){
+ if (value % i == 0){
+ return false;
+ }
+ if (value % i != 0){
+ return true;
+ }
+ }
+ }
+
+ function trial_factor(base, exp, mod){
+ let square, bits;
+ square = 1;
+ bits = exp.toString(2).split('');
+ for (let i=0,ln=bits.length; iFn of order`n` є рядом повністю скорочених дробів між `0` та `1`, які у нескороченому виді мають знаменники, менші від або такі, які дорівнюють `n` у порядку зростання.
+
+*Ряд Фарея* деколи помилково називають *Серією Фарея*.
+
+Кожен ряд Фарея:
+
+