Задачи
Тук са задачите на курса на едно място. Първо 50 самостоятелни задачи от „Здравей, свят“ до най-кратък път в матрица, всяка с пример и решение на JavaScript, проверено с истински компилатор. После задачите от уроците, по модули: всяка води към урока, където е обяснено нужното.
50 задачи за упражнение
1. Hello World
Изпиши на конзолата текста Hello, World! – програмата няма вход.
Без вход.
Изход Hello, World!Нужното е в урока: Първата програма
Решение
console.log("Hello, World!");2. Поздрави потребителя
Прочети име от един ред и поздрави човека по име във вида „Здравей, <име>!“.
Вход МарияИзход Здравей, Мария!Нужното е в урока: Вход и изход
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const name = await ask("");console.log("Здравей, " + name + "!");rl.close();3. Изписване на възраст
Прочети възрастта на потребителя (цяло число), запази я в променлива и я изпиши в изречение.
Вход 17Изход Ти си на 17 години.Нужното е в урока: Променливи и типове
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const age = Number(await ask(""));console.log("Ти си на " + age + " години.");rl.close();4. Конвертор на единици
Прочети дължина в инчове (може да е дробно число) и я преобразувай в сантиметри: 1 инч = 2.54 см. Изпиши резултата с 2 знака след точката.
Вход 12.5Изход 31.75 смНужното е в урока: Оператори и аритметика
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const inches = Number(await ask(""));console.log((inches * 2.54).toFixed(2) + " см");rl.close();5. Проверка за четност
Прочети цяло число и изпиши дали е четно, или нечетно.
Вход 7Изход 7 е нечетно.Нужното е в урока: Условия
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const number = Number(await ask(""));if (number % 2 === 0) {console.log(number + " е четно.");} else {console.log(number + " е нечетно.");}rl.close();6. Сума на числа
Прочети две цели числа, всяко на отделен ред, и изпиши сумата им.
Вход 1230Изход Сумата е 42.Нужното е в урока: Оператори и аритметика
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const first = Number(await ask(""));const second = Number(await ask(""));console.log("Сумата е " + (first + second) + ".");rl.close();7. Площ на квадрат
Прочети страната на квадрат (цяло число) и изпиши лицето му.
Вход 5Изход Лицето е 25.Нужното е в урока: Оператори и аритметика
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const side = Number(await ask(""));console.log("Лицето е " + side * side + ".");rl.close();8. Обем на сфера
Прочети радиуса r (може да е дробно число) и изпиши обема на сферата V = 4/3 · π · r³ с 2 знака след точката.
Вход 3Изход Обемът е 113.10.Нужното е в урока: Оператори и аритметика
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const r = Number(await ask(""));const volume = (4 / 3) * Math.PI * r ** 3;console.log("Обемът е " + volume.toFixed(2) + ".");rl.close();9. Сравнение на числа
Прочети две цели числа, всяко на отделен ред, и изпиши по-голямото от тях (ако са равни, което и да е).
Вход 815Изход По-голямото е 15.Нужното е в урока: Условия
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const a = Number(await ask(""));const b = Number(await ask(""));if (a > b) {console.log("По-голямото е " + a + ".");} else {console.log("По-голямото е " + b + ".");}rl.close();10. Проверка за триъгълник
Прочети три цели числа, всяко на отделен ред, и провери дали могат да са страни на триъгълник: сборът на всеки две трябва да е по-голям от третото.
Вход 345Изход Могат да образуват триъгълник.Нужното е в урока: Условия
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const a = Number(await ask(""));const b = Number(await ask(""));const c = Number(await ask(""));if (a + b > c && a + c > b && b + c > a) {console.log("Могат да образуват триъгълник.");} else {console.log("Не могат да образуват триъгълник.");}rl.close();11. Класификация по оценка
Прочети оценка от 2 до 6 (може да е дробна) и изпиши словом: от 5.50 – Отличен, от 4.50 – Много добър, от 3.50 – Добър, от 3.00 – Среден, под 3.00 – Слаб.
Вход 4.75Изход Много добърНужното е в урока: Условия
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const grade = Number(await ask(""));if (grade >= 5.5) {console.log("Отличен");} else if (grade >= 4.5) {console.log("Много добър");} else if (grade >= 3.5) {console.log("Добър");} else if (grade >= 3) {console.log("Среден");} else {console.log("Слаб");}rl.close();12. Конвертиране на време
Прочети брой часове (цяло число) и изпиши колко секунди са.
Вход 2Изход 7200 секундиНужното е в урока: Оператори и аритметика
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const hours = Number(await ask(""));console.log(hours * 3600 + " секунди");rl.close();13. Изброяване до N
Прочети цяло число N и изпиши числата от 1 до N, всяко на нов ред.
Вход 5Изход 12345Нужното е в урока: Цикли
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const n = Number(await ask(""));for (let i = 1; i <= n; i++) {console.log(i);}rl.close();14. ASCII стойност
Прочети един символ (първия символ на реда) и изпиши неговия ASCII код, тоест числото, с което компютърът го пази.
Вход AИзход Кодът на A е 65.Нужното е в урока: Низове: работа с текст
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const symbol = (await ask(""))[0];console.log("Кодът на " + symbol + " е " + symbol.charCodeAt(0) + ".");rl.close();15. Квадратно уравнение
Прочети a, b и c, всяко на отделен ред, и реши уравнението ax² + bx + c = 0. При два корена изпиши „x1 = …, x2 = …“ (x1 е с +√D), при един – „x = …“, с 2 знака след точката; ако корени няма или a е 0, кажи го.
Вход 1-32Изход x1 = 2.00, x2 = 1.00Нужното е в урока: Условия
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const a = Number(await ask(""));const b = Number(await ask(""));const c = Number(await ask(""));if (a === 0) {console.log("Това не е квадратно уравнение");} else {const d = b * b - 4 * a * c;if (d > 0) {const x1 = (-b + Math.sqrt(d)) / (2 * a);const x2 = (-b - Math.sqrt(d)) / (2 * a);console.log("x1 = " + x1.toFixed(2) + ", x2 = " + x2.toFixed(2));} else if (d === 0) {console.log("x = " + (-b / (2 * a)).toFixed(2));} else {console.log("Няма реални корени");}}rl.close();16. Положително или отрицателно
Прочети цяло число и изпиши дали е положително, отрицателно, или нула.
Вход -4Изход ОтрицателноНужното е в урока: Условия
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const number = Number(await ask(""));if (number > 0) {console.log("Положително");} else if (number < 0) {console.log("Отрицателно");} else {console.log("Нула");}rl.close();17. Сезони
Прочети номер на месец (1–12) и изпиши сезона: 12, 1, 2 – Зима, 3–5 – Пролет, 6–8 – Лято, 9–11 – Есен. За друго число изпиши „Невалиден месец“.
Вход 4Изход ПролетНужното е в урока: Условия
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const month = Number(await ask(""));if (month < 1 || month > 12) {console.log("Невалиден месец");} else if (month === 12 || month <= 2) {console.log("Зима");} else if (month <= 5) {console.log("Пролет");} else if (month <= 8) {console.log("Лято");} else {console.log("Есен");}rl.close();18. Обратен ред на число
Прочети цяло положително число и изведи числото с цифрите му в обратен ред: от 123 става 321. Нулите, които излизат отпред, изчезват (от 1200 става 21). Вземай последната цифра с % 10 и я махай с деление на 10.
Вход 9071Изход 1709Нужното е в урока: Цикли
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}let n = Number(await ask(""));let reversed = 0;while (n > 0) {reversed = reversed * 10 + (n % 10);n = Math.floor(n / 10);}console.log(reversed);rl.close();19. Температурен конвертор
Прочети температура в градуси по Целзий (може да е дробно число, с точка) и я изведи във Фаренхайт с два знака след точката. Формулата е F = C * 9 / 5 + 32.
Вход 36.6Изход 97.88 °FНужното е в урока: Оператори и аритметика
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const celsius = Number(await ask(""));const fahrenheit = (celsius * 9) / 5 + 32;console.log(`${fahrenheit.toFixed(2)} °F`);rl.close();20. Име с най-много букви
На първия ред е броят на имената n, на следващите n реда по едно име. Изведи името с най-много букви и броя им в скоби; ако две имена са еднакво дълги, изведи първото от тях.
Вход 4МарияАлександраИванКонстантинИзход Александра (10 букви)Нужното е в урока: Низове: работа с текст
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const n = Number(await ask(""));let longest = "";for (let i = 0; i < n; i++) {const name = await ask("");if (name.length > longest.length) {longest = name;}}console.log(`${longest} (${longest.length} букви)`);rl.close();21. Брояч на думи
Прочети един ред текст и изведи колко думи има в него. Думите са разделени с един или повече интервала, така че празните парчета между два интервала не са думи.
Вход Пиша код всеки ден и ставам по-добърИзход 7Нужното е в урока: Низове: работа с текст
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const line = await ask("");const words = line.split(" ").filter((word) => word !== "");console.log(words.length);rl.close();22. Просто число
Прочети цяло число n и провери дали е просто: по-голямо от 1 и се дели само на 1 и на себе си. Достатъчно е да пробваш делителите i, за които i * i <= n.
Вход 91Изход 91 не е простоНужното е в урока: Цикли
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const n = Number(await ask(""));let prime = n > 1;for (let i = 2; i * i <= n; i++) {if (n % i === 0) {prime = false;break;}}if (prime) {console.log(`${n} е просто`);} else {console.log(`${n} не е просто`);}rl.close();23. Ден от седмицата
Прочети число от 1 до 7 и изведи името на деня от седмицата на български, като 1 е понеделник. Имената дръж в масив; за друго число изведи „Няма такъв ден“.
Вход 5Изход ПетъкНужното е в урока: Масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const day = Number(await ask(""));const days = ["Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота", "Неделя"];if (day >= 1 && day <= 7) {console.log(days[day - 1]);} else {console.log("Няма такъв ден");}rl.close();24. Факториел
Прочети цяло число n от 0 до 15 и изведи n! = 1 * 2 * … * n (0! е 1). Още 13! не се побира в int, затова в Java и C# пази произведението в long.
Вход 15Изход 15! = 1307674368000Нужното е в урока: Цикли
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const n = Number(await ask(""));let factorial = 1;for (let i = 2; i <= n; i++) {factorial *= i;}console.log(`${n}! = ${factorial}`);rl.close();25. Валидна дата
Прочети ден, месец и година, всяко на отделен ред, и изведи „Валидна дата“ или „Невалидна дата“. Годината е поне 1, месецът е от 1 до 12, а денят от 1 до броя дни в месеца; февруари има 29 дни във високосна година (делима на 4, но не на 100, освен ако е делима на 400).
Вход 2922100Изход Невалидна датаНужното е в урока: Условия
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const day = Number(await ask(""));const month = Number(await ask(""));const year = Number(await ask(""));const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;let days;if (month === 2) {days = leap ? 29 : 28;} else if (month === 4 || month === 6 || month === 9 || month === 11) {days = 30;} else {days = 31;}if (year >= 1 && month >= 1 && month <= 12 && day >= 1 && day <= days) {console.log("Валидна дата");} else {console.log("Невалидна дата");}rl.close();26. Честота на букви
Прочети един ред текст и изведи колко пъти се среща всяка буква в него, без значение дали е главна или малка. Изведи буквите по азбучен ред, по една на ред във вида „а: 5“; интервалите и препинателните знаци не се броят.
Вход Банан и ананас!Изход а: 5б: 1и: 1н: 4с: 1Нужното е в урока: Map и Set
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const text = (await ask("")).toLowerCase();const counts = new Map();for (const c of text) {if (/\p{L}/u.test(c)) {counts.set(c, (counts.get(c) ?? 0) + 1);}}for (const c of [...counts.keys()].sort()) {console.log(`${c}: ${counts.get(c)}`);}rl.close();27. Минимум и максимум в масив
На първия ред е броят n, на следващите n реда по едно цяло число. Прочети ги в масив и изведи най-малкото и най-голямото, като започнеш от първия елемент и сравняваш с останалите.
Вход 57-31204Изход Най-малко: -3Най-голямо: 12Нужното е в урока: Масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const n = Number(await ask(""));const numbers = [];for (let i = 0; i < n; i++) {numbers.push(Number(await ask("")));}let min = numbers[0];let max = numbers[0];for (let i = 1; i < n; i++) {if (numbers[i] < min) {min = numbers[i];}if (numbers[i] > max) {max = numbers[i];}}console.log(`Най-малко: ${min}`);console.log(`Най-голямо: ${max}`);rl.close();28. Сортиране на масив
На първия ред е броят n, на следващите n реда по едно цяло число. Подреди ги сам във възходящ ред с метода на мехурчето (n - 1 минавания, във всяко разменяш съседи, които са в грешен ред) и ги изведи на един ред, разделени с интервал.
Вход 6529156Изход 1 2 5 5 6 9Нужното е в урока: Масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const n = Number(await ask(""));const numbers = [];for (let i = 0; i < n; i++) {numbers.push(Number(await ask("")));}for (let pass = 0; pass < n - 1; pass++) {for (let i = 0; i < n - 1 - pass; i++) {if (numbers[i] > numbers[i + 1]) {const temp = numbers[i];numbers[i] = numbers[i + 1];numbers[i + 1] = temp;}}}console.log(numbers.join(" "));rl.close();29. Замяна на гласните
Прочети един ред текст и го изведи, като всяка гласна, главна или малка, е заменена със знака *. Гласните са а, е, и, о, у, ъ, ю, я.
Вход Обичам да програмирамИзход *б*ч*м д* пр*гр*м*р*мНужното е в урока: Низове: работа с текст
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const text = await ask("");const vowels = "аеиоуъюя";let result = "";for (const c of text) {if (vowels.includes(c.toLowerCase())) {result += "*";} else {result += c;}}console.log(result);rl.close();30. Сума на цифрите
Прочети цяло неотрицателно число и изведи сумата на цифрите му. Последната цифра е n % 10, а n / 10 я маха (в Python n // 10).
Вход 9875Изход 29Нужното е в урока: Цикли
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}let n = Number(await ask(""));let sum = 0;while (n > 0) {sum += n % 10;n = Math.floor(n / 10);}console.log(sum);rl.close();31. Палиндром
Прочети един ред текст и провери дали е палиндром, тоест чете се еднакво и отзад напред. Главните и малките букви се смятат за еднакви, а интервалите се пропускат. Изведи „Палиндром“ или „Не е палиндром“.
Вход КапакИзход ПалиндромНужното е в урока: Низове: работа с текст
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const text = (await ask("")).toLowerCase().replaceAll(" ", "");let palindrome = true;for (let i = 0; i < text.length / 2; i++) {if (text[i] !== text[text.length - 1 - i]) {palindrome = false;break;}}if (palindrome) {console.log("Палиндром");} else {console.log("Не е палиндром");}rl.close();32. Сигурна парола
Чети пароли, по една на ред, докато дойде сигурна: поне 8 знака, поне една цифра, една главна и една малка буква. За всяка слаба изведи първото неизпълнено правило в този ред („Твърде кратка“, „Няма цифра“, „Няма главна буква“, „Няма малка буква“), а за сигурната „Паролата е приета“ и спри.
Вход kotkakotkamiaukotkamiau7Kotkamiau7Изход Твърде краткаНяма цифраНяма главна букваПаролата е приетаНужното е в урока: Низове: работа с текст
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}while (true) {const password = await ask("");let digit = false;let upper = false;let lower = false;for (const c of password) {if (c >= "0" && c <= "9") {digit = true;} else if (c !== c.toLowerCase()) {upper = true;} else if (c !== c.toUpperCase()) {lower = true;}}if (password.length < 8) {console.log("Твърде кратка");} else if (!digit) {console.log("Няма цифра");} else if (!upper) {console.log("Няма главна буква");} else if (!lower) {console.log("Няма малка буква");} else {console.log("Паролата е приета");break;}}rl.close();33. Обратен масив
На първия ред е броят n, на следващите n реда по едно цяло число. Прочети ги в масив и ги изведи в обратен ред, на един ред, разделени с интервал: обходи масива от последния индекс към нулевия.
Вход 410-273Изход 3 7 -2 10Нужното е в урока: Масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const n = Number(await ask(""));const numbers = [];for (let i = 0; i < n; i++) {numbers.push(Number(await ask("")));}let line = "";for (let i = n - 1; i >= 0; i--) {line += numbers[i];if (i > 0) {line += " ";}}console.log(line);rl.close();34. Брой на елементите
Прочети един ред с думи, разделени с по един интервал, и изведи колко пъти се среща всяка дума, във вида „дума: брой“. Думите излизат в реда, в който са се появили за първи път.
Вход ябълка круша ябълка слива круша ябълкаИзход ябълка: 3круша: 2слива: 1Нужното е в урока: Map и Set
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const line = await ask("");const counts = new Map();for (const word of line.split(" ")) {counts.set(word, (counts.get(word) ?? 0) + 1);}for (const [word, count] of counts) {console.log(`${word}: ${count}`);}rl.close();35. Прости числа
Прочети число N и изведи на един ред, разделени с интервал, всички прости числа от 2 до N.
Вход 30Изход 2 3 5 7 11 13 17 19 23 29Нужното е в урока: Цикли
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const n = Number(await ask(""));const primes = [];for (let i = 2; i <= n; i++) {let prime = true;for (let d = 2; d * d <= i; d++) {if (i % d === 0) {prime = false;break;}}if (prime) {primes.push(i);}}console.log(primes.join(" "));rl.close();36. Средна стойност
На един ред са дадени цели числа, разделени с интервал. Изведи средната им стойност с два знака след точката.
Вход 5 8 12 6Изход Средна стойност: 7.75Нужното е в урока: Масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const parts = (await ask("")).split(" ");let sum = 0;for (let i = 0; i < parts.length; i++) {sum += Number(parts[i]);}const average = sum / parts.length;console.log("Средна стойност: " + average.toFixed(2));rl.close();37. Сортиране по дължина
На един ред са дадени думи, разделени с интервал. Подреди ги по дължина от най-късата към най-дългата (думите с еднаква дължина остават в реда от входа) и ги изведи на един ред.
Вход смокиня киви ябълка дюля крушаИзход киви дюля круша ябълка смокиняНужното е в урока: Низове: работа с текст
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const words = (await ask("")).split(" ");for (let i = 0; i < words.length - 1; i++) {for (let j = 0; j < words.length - 1 - i; j++) {if (words[j].length > words[j + 1].length) {const temp = words[j];words[j] = words[j + 1];words[j + 1] = temp;}}}console.log(words.join(" "));rl.close();38. Брояч на изречения
Прочети един ред текст и изведи колко изречения има в него. Изречението завършва с точка, удивителна или въпросителна; поредица от такива знаци (като „...“ или „?!“) е един край.
Вход Здравей! Как си? Аз съм добре... А ти?!Изход Изречения: 4Нужното е в урока: Низове: работа с текст
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const text = await ask("");const ends = ".!?";let count = 0;for (let i = 0; i < text.length; i++) {const isEnd = ends.includes(text[i]);const nextIsEnd = i + 1 < text.length && ends.includes(text[i + 1]);if (isEnd && !nextIsEnd) {count++;}}console.log("Изречения: " + count);rl.close();39. Числа на Фибоначи
Редицата на Фибоначи започва с 1, 1, а всяко следващо число е сборът на предходните две. Прочети N (от 1 до 50) и изведи N-тото число от редицата.
Вход 40Изход 102334155Нужното е в урока: Цикли
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const n = Number(await ask(""));let previous = 0;let current = 1;for (let i = 1; i < n; i++) {const next = previous + current;previous = current;current = next;}console.log(current);rl.close();40. Намиране на медиана
На един ред са дадени цели числа, разделени с интервал. Изведи медианата им с един знак след точката: средното число след подреждане, а при четен брой числа – средното аритметично на двете средни.
Вход 12 3 7 9 1 8Изход Медиана: 7.5Нужното е в урока: Масиви: push, splice и sort
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const numbers = [];for (const part of (await ask("")).split(" ")) {numbers.push(Number(part));}numbers.sort((a, b) => a - b);const n = numbers.length;let median;if (n % 2 === 1) {median = numbers[Math.floor(n / 2)];} else {median = (numbers[n / 2 - 1] + numbers[n / 2]) / 2;}console.log("Медиана: " + median.toFixed(1));rl.close();41. Графика на символи
Прочети един ред текст. За всеки символ без интервала, в реда на първата му поява, изведи ред „символ | звездички“ с по една звездичка за всяко срещане в текста.
Вход баба баницаИзход б | ***а | ****н | *и | *ц | *Нужното е в урока: Низове: работа с текст
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const text = await ask("");for (let i = 0; i < text.length; i++) {const c = text[i];if (c !== " " && text.indexOf(c) === i) {let count = 0;for (let j = 0; j < text.length; j++) {if (text[j] === c) {count++;}}console.log(c + " | " + "*".repeat(count));}}rl.close();42. Транспониране на матрица
На първия ред са броят редове R и броят колони C, следват R реда с по C числа, разделени с интервал. Изведи транспонираната матрица: C реда с по R числа, където редовете стават колони.
Вход 2 31 2 34 5 6Изход 1 42 53 6Нужното е в урока: Двумерни масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const size = (await ask("")).split(" ");const rows = Number(size[0]);const cols = Number(size[1]);const matrix = [];for (let r = 0; r < rows; r++) {matrix.push((await ask("")).split(" ").map(Number));}for (let c = 0; c < cols; c++) {const line = [];for (let r = 0; r < rows; r++) {line.push(matrix[r][c]);}console.log(line.join(" "));}rl.close();43. Пътища в лабиринт
На първия ред са R и C, следват R реда по C знака: „.“ е свободна клетка, „#“ е стена. Като се движиш само надясно или надолу и не стъпваш на стена, изведи броя на всички пътища от горния ляв до долния десен ъгъл.
Вход 4 5......#.#....#.#....Изход Пътища: 4Нужното е в урока: Рекурсия
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}function countPaths(maze, r, c) {if (r >= maze.length || c >= maze[0].length || maze[r][c] === "#") {return 0;}if (r === maze.length - 1 && c === maze[0].length - 1) {return 1;}return countPaths(maze, r + 1, c) + countPaths(maze, r, c + 1);}const size = (await ask("")).split(" ");const rows = Number(size[0]);const maze = [];for (let r = 0; r < rows; r++) {maze.push(await ask(""));}console.log("Пътища: " + countPaths(maze, 0, 0));rl.close();44. Статистика на оценките
На един ред са дадени оценки от 2 до 6, разделени с интервал. Изведи колко са отличните, много добрите, добрите, средните и слабите, всяка категория на отделен ред.
Вход 6 4 5 6 3 5 2 6 5 4Изход Отличен (6): 3Много добър (5): 3Добър (4): 2Среден (3): 1Слаб (2): 1Нужното е в урока: Масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const names = ["", "", "Слаб", "Среден", "Добър", "Много добър", "Отличен"];const counts = [0, 0, 0, 0, 0, 0, 0];const parts = (await ask("")).split(" ");for (let i = 0; i < parts.length; i++) {counts[Number(parts[i])]++;}for (let grade = 6; grade >= 2; grade--) {console.log(names[grade] + " (" + grade + "): " + counts[grade]);}rl.close();45. Римски цифри
Прочети цяло число от 1 до 3999 и го изведи с римски цифри (I, V, X, L, C, D, M, като 4 е IV, 9 е IX, 40 е XL и т.н.).
Вход 1994Изход MCMXCIVНужното е в урока: Масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}let number = Number(await ask(""));const values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];const symbols = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"];let roman = "";for (let i = 0; i < values.length; i++) {while (number >= values[i]) {roman += symbols[i];number -= values[i];}}console.log(roman);rl.close();46. Симулация на монета
Прочети семе x (от 1 до 2147483646) и брой хвърляния N, всяко на отделен ред. При всяко хвърляне смени x = x * 16807 % 2147483647; четно x е ези (Е), нечетно е тура (Т). Изведи хвърлянията на един ред, после колко пъти се е паднало ези и колко тура.
Вход 4210Изход ЕТТТЕТТЕЕТЕзи: 4Тура: 6Нужното е в урока: Цикли
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}let x = Number(await ask(""));const n = Number(await ask(""));let tosses = "";let heads = 0;for (let i = 0; i < n; i++) {x = x * 16807 % 2147483647;if (x % 2 === 0) {tosses += "Е";heads++;} else {tosses += "Т";}}console.log(tosses);console.log("Ези: " + heads);console.log("Тура: " + (n - heads));rl.close();47. Симетричен масив
На един ред са дадени цели числа, разделени с интервал. Провери дали масивът е симетричен, тоест чете се еднакво отляво надясно и отдясно наляво.
Вход 1 2 3 2 1Изход СиметриченНужното е в урока: Масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const numbers = (await ask("")).split(" ").map(Number);let symmetric = true;for (let i = 0; i < Math.floor(numbers.length / 2); i++) {if (numbers[i] !== numbers[numbers.length - 1 - i]) {symmetric = false;break;}}console.log(symmetric ? "Симетричен" : "Не е симетричен");rl.close();48. Балансирани скоби
Прочети един ред текст и провери дали скобите (), [] и {} в него са балансирани: всяка отваряща има своята затваряща от същия вид и двойките не се пресичат. Другите символи не се броят.
Вход (a + [b) * c]Изход НебалансираниНужното е в урока: Стек, опашка и свързан списък
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const text = await ask("");const opening = "([{";const closing = ")]}";const stack = [];let balanced = true;for (const c of text) {if (opening.includes(c)) {stack.push(c);} else if (closing.includes(c)) {if (stack.length === 0 || opening.indexOf(stack.pop()) !== closing.indexOf(c)) {balanced = false;break;}}}if (balanced && stack.length === 0) {console.log("Балансирани");} else {console.log("Небалансирани");}rl.close();49. Последователност от еднакви елементи
На един ред са дадени цели числа, разделени с интервал. Намери най-дългата поредица от еднакви съседни числа и я изведи на един ред; ако има няколко с еднаква дължина, изведи първата.
Вход 2 1 1 3 3 3 2 2 2 5Изход 3 3 3Нужното е в урока: Масиви
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const numbers = (await ask("")).split(" ").map(Number);let bestValue = numbers[0];let bestLength = 1;let length = 1;for (let i = 1; i < numbers.length; i++) {if (numbers[i] === numbers[i - 1]) {length++;} else {length = 1;}if (length > bestLength) {bestLength = length;bestValue = numbers[i];}}const run = [];for (let i = 0; i < bestLength; i++) {run.push(bestValue);}console.log(run.join(" "));rl.close();50. Най-кратък път в матрица
На първия ред са R и C, следват R реда по C знака: „.“ е свободна клетка, „#“ е стена, „S“ е началото, „E“ е целта. С ходове нагоре, надолу, наляво и надясно изведи най-малкия брой ходове от S до E или „Няма път“, ако E е недостижима.
Вход 5 6S.#....##.#....#..#.#..#...E.#Изход 7Нужното е в урока: Стек, опашка и свързан списък
Решение
import { createInterface } from "node:readline";const rl = createInterface({ input: process.stdin });const lines = rl[Symbol.asyncIterator]();async function ask(question) {process.stdout.write(question);return (await lines.next()).value;}const size = (await ask("")).split(" ");const rows = Number(size[0]);const cols = Number(size[1]);const grid = [];for (let r = 0; r < rows; r++) {grid.push(await ask(""));}const dist = [];const queue = [];for (let r = 0; r < rows; r++) {dist.push([]);for (let c = 0; c < cols; c++) {dist[r].push(-1);if (grid[r][c] === "S") {dist[r][c] = 0;queue.push([r, c]);}}}const dr = [-1, 1, 0, 0];const dc = [0, 0, -1, 1];let answer = "Няма път";while (queue.length > 0) {const [r, c] = queue.shift();if (grid[r][c] === "E") {answer = String(dist[r][c]);break;}for (let d = 0; d < 4; d++) {const nr = r + dr[d];const nc = c + dc[d];if (nr >= 0 && nr < rows && nc >= 0 && nc < cols && grid[nr][nc] !== "#" && dist[nr][nc] === -1) {dist[nr][nc] = dist[r][c] + 1;queue.push([nr, nc]);}}}console.log(answer);rl.close();
Задачите от уроците
Раздел „Задачите от уроците“Основи на езика
- Първата програма: Hello World · Визитка · Рамка
- Променливи и типове: Размяна · Възраст · Карта на хотел
- Вход и изход: Поздрав по име · Сума на две числа · Два текста в един · π с два знака
- Оператори и аритметика: Средно на три числа · Секунди в часове · Обем на сфера · Целзий във Фаренхайт
- Условия: Билет за кино · Мини калкулатор · Квадратно уравнение · Валидна дата
- Цикли: Таблица за умножение · Просто число · Цифрите на число · Познай числото
- Масиви: Сума, четни, нечетни · Обратно · Най-малко, най-голямо, средно
- Масиви: Сортиране · Най-дълга поредица · Статистика на оценките
- Двумерни масиви: Диагонали и редове · Обърни таблицата
- Двумерни масиви: Колко пътя има? · Най-краткият път
- Низове: работа с текст: Името наобратно · Брой думи · Палиндром
- Низове: работа с текст: Сигурна парола
Функции
- Функции: Бележка · Триъгълник
- Параметри и return: Средно аритметично · Просто число · Температури · Калкулатор · Триъгълник с параметър
- Параметри и return
- Стойности по подразбиране: Най-голямото · Среден успех · Ред от бележката · Безплатна доставка
- Рекурсия: Факториел по два начина · Сума на цифрите · Фибоначи · Палиндром
Класове и обекти
- Класове и обекти: Книга · Кола · Количката · Най-скъпото отпред
- Конструктори и this: Човек · Животно · Танцова стъпка
- Методи на обекта
- Методи на обекта
- Капсулация: Човек · Сметка без минус · Животно
- static: общото за всички: Поръчки · Калкулатор · Обмяна
Наследяване и полиморфизъм
- Наследяване: Семейна кола · Студент · Брейк · Електрическа кола
- Полиморфизъм: Приют · Студентът се представя · Купон
- Абстрактни класове без abstract: Лице и обиколка · Животните
- Абстрактни класове без abstract: Превозни средства · Изпълнения
- Интерфейси без interface: Клаксон · Подробности · Танц · Диджей · Езерото
- Проверка на типа: Паркинг · Танци · Автопарк · Зоопарк
- ООП принципи
- ООП принципи: Изпълнител на хонорар · Терасата без if
Грешки и изключения
- Изключения: Текст към число · Няма такъв продукт · Средна поръчка
- try, catch и finally: Цена на човек · Калкулатор
- Хвърляне и свои изключения: Музикален магазин · Сметка с правила · Невалидна възраст
Текст и файлове
- Низове: Палиндром · Бележка с колони · Думите наобратно
- Регулярни изрази: Дата · Мобилен номер · Имейл · Списък за пазаруване
- Регулярни изрази: групи и замяна: Намери и замени · Думи с префикс · Адреси в текст · Дати към ISO
- Файлове: Конфигурационен файл · Филтър на лог файл · Съдържание на папка · Индексен файл
- Данни във файлове: Анализ на CSV · Запис на героя · Дублиран текст
Колекции
- Масиви: push, splice и sort: Рафт с книги · Журнал на събитията · Тетрадка · Смятане наум
- Стек, опашка и свързан списък: Влакче · Маршрут на автобус · Борсов тикер · Скобите в баланс · Свой свързан списък
- Map и Set: Таблица с потребители · Честота на думите · Документи по ключова дума · Мрежа от контакти
- Хеш код и хеш функции: Ключ на човек · Роботът в склада · Хеш на файл
- Вложени класове и данни: Количка за пазаруване · Монитор на уеб сървър · Сграден мениджър · Класиране
Модерен JavaScript
- Стрелкови функции: Подреждане по няколко полета · Филтър на поръчки · Отстъпки една след друга
- Методите на масива: Продажби по категория · Топ 3 продукта · Средна оценка · Думите в текст
- Данни, switch и разглобяване: Фигури · Цена на доставка · Точка като ключ
- Шаблони за дизайн: Отстъпки като стратегии · „Уведоми ме, когато е налично“ · Фабрика за известия · Стар термометър
Програми в истинския свят
- Тестове с node:test: Калкулаторът на отстъпки · Сметката · Бъгът в средната оценка
- Async, await и нишки: Паралелна сума · Сваляне с басейн · Брояч без загуби
- Мрежово програмиране: Ехо сървър · Сървър с команди · Чат за двама
- Бази данни: Каталог · Търсене по част от името · Превод, който се проваля наполовина
- Reflection: Всички полета и веригата · Мини JSON · Свой пускач на тестове
Да направим игра
- Как се мисли игра: Надбягване за двама · Познай числото · Кой спечели морския шах?
- RPG 1: героите: Шести герой · Списък на отряда · Кой е най-силен?
- RPG 2: битката: Ново чудовище · Лечебна отвара · Отчет за битката
- RPG 3: цялата игра: Меню · Напредък · Бос
- Epic Cosmos 1: обектите в космоса: Слънчевата система · Разстояние · Цялото дърво
- Epic Cosmos 2: ресурси, сгради, кораби: 100 метал възможно най-бързо · Товарен кораб · Симулация на 10 хода
- Заключената лаборатория 1: стаи и команди: Инвентар · Нова стая · Синоними
- Заключената лаборатория 2: загадки и изход: Тъмното мазе · Таймер · Подсказка срещу ход
Хрониките на Арканум
- Цикълът на играта
- Стек от екрани
- Екрани, които връщат отговор
- Рисуване в конзолата
- Картата и гледането
- Герои, врагове, показатели
- Бойната система
- Кръв, рани и ефекти
- Умения и действия като команди
- Врагове, които мислят
- Предмети, инвентар, плячка
- Нива, диалози и куестове
- Запис и зареждане
- Цялата игра и балансът
Epic Cosmos: империята
- Галактиката от семе
- Дървото на технологиите
- Флотите и космическата битка
- Съперниците
- Ходът на галактиката
- Цялата стратегия
Проект
- Хотелски резервации: Смяна на стая