Към съдържанието
wannacode

Задачи

Тук са задачите на курса на едно място. Първо 50 самостоятелни задачи от „Здравей, свят“ до най-кратък път в матрица, всяка с пример и решение на JavaScript, проверено с истински компилатор. После задачите от уроците, по модули: всяка води към урока, където е обяснено нужното.

50 задачи за упражнение

  1. 1. Hello World

    Изпиши на конзолата текста Hello, World! – програмата няма вход.

    Без вход.

    Изход
    Hello, World!

    Нужното е в урока: Първата програма

    Решение
    console.log("Hello, World!");
  2. 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. 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. 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. 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. 6. Сума на числа

    Прочети две цели числа, всяко на отделен ред, и изпиши сумата им.

    Вход
    12
    30
    Изход
    Сумата е 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. 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. 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. 9. Сравнение на числа

    Прочети две цели числа, всяко на отделен ред, и изпиши по-голямото от тях (ако са равни, което и да е).

    Вход
    8
    15
    Изход
    По-голямото е 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. 10. Проверка за триъгълник

    Прочети три цели числа, всяко на отделен ред, и провери дали могат да са страни на триъгълник: сборът на всеки две трябва да е по-голям от третото.

    Вход
    3
    4
    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 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. 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. 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. 13. Изброяване до N

    Прочети цяло число N и изпиши числата от 1 до N, всяко на нов ред.

    Вход
    5
    Изход
    1
    2
    3
    4
    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 n = Number(await ask(""));
    for (let i = 1; i <= n; i++) {
    console.log(i);
    }
    rl.close();
  14. 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. 15. Квадратно уравнение

    Прочети a, b и c, всяко на отделен ред, и реши уравнението ax² + bx + c = 0. При два корена изпиши „x1 = …, x2 = …“ (x1 е с +√D), при един – „x = …“, с 2 знака след точката; ако корени няма или a е 0, кажи го.

    Вход
    1
    -3
    2
    Изход
    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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 25. Валидна дата

    Прочети ден, месец и година, всяко на отделен ред, и изведи „Валидна дата“ или „Невалидна дата“. Годината е поне 1, месецът е от 1 до 12, а денят от 1 до броя дни в месеца; февруари има 29 дни във високосна година (делима на 4, но не на 100, освен ако е делима на 400).

    Вход
    29
    2
    2100
    Изход
    Невалидна дата

    Нужното е в урока: Условия

    Решение
    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. 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. 27. Минимум и максимум в масив

    На първия ред е броят n, на следващите n реда по едно цяло число. Прочети ги в масив и изведи най-малкото и най-голямото, като започнеш от първия елемент и сравняваш с останалите.

    Вход
    5
    7
    -3
    12
    0
    4
    Изход
    Най-малко: -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. 28. Сортиране на масив

    На първия ред е броят n, на следващите n реда по едно цяло число. Подреди ги сам във възходящ ред с метода на мехурчето (n - 1 минавания, във всяко разменяш съседи, които са в грешен ред) и ги изведи на един ред, разделени с интервал.

    Вход
    6
    5
    2
    9
    1
    5
    6
    Изход
    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. 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. 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. 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. 32. Сигурна парола

    Чети пароли, по една на ред, докато дойде сигурна: поне 8 знака, поне една цифра, една главна и една малка буква. За всяка слаба изведи първото неизпълнено правило в този ред („Твърде кратка“, „Няма цифра“, „Няма главна буква“, „Няма малка буква“), а за сигурната „Паролата е приета“ и спри.

    Вход
    kotka
    kotkamiau
    kotkamiau7
    Kotkamiau7
    Изход
    Твърде кратка
    Няма цифра
    Няма главна буква
    Паролата е приета

    Нужното е в урока: Низове: работа с текст

    Решение
    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. 33. Обратен масив

    На първия ред е броят n, на следващите n реда по едно цяло число. Прочети ги в масив и ги изведи в обратен ред, на един ред, разделени с интервал: обходи масива от последния индекс към нулевия.

    Вход
    4
    10
    -2
    7
    3
    Изход
    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. 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. 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. 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. 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. 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. 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. 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. 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. 42. Транспониране на матрица

    На първия ред са броят редове R и броят колони C, следват R реда с по C числа, разделени с интервал. Изведи транспонираната матрица: C реда с по R числа, където редовете стават колони.

    Вход
    2 3
    1 2 3
    4 5 6
    Изход
    1 4
    2 5
    3 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. 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. 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. 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. 46. Симулация на монета

    Прочети семе x (от 1 до 2147483646) и брой хвърляния N, всяко на отделен ред. При всяко хвърляне смени x = x * 16807 % 2147483647; четно x е ези (Е), нечетно е тура (Т). Изведи хвърлянията на един ред, после колко пъти се е паднало ези и колко тура.

    Вход
    42
    10
    Изход
    ЕТТТЕТТЕЕТ
    Ези: 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. 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. 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. 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. 50. Най-кратък път в матрица

    На първия ред са R и C, следват R реда по C знака: „.“ е свободна клетка, „#“ е стена, „S“ е началото, „E“ е целта. С ходове нагоре, надолу, наляво и надясно изведи най-малкия брой ходове от S до E или „Няма път“, ако E е недостижима.

    Вход
    5 6
    S.#...
    .##.#.
    ...#..
    #.#..#
    ...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();

Основи на езика

Функции

Класове и обекти

Наследяване и полиморфизъм

Грешки и изключения

Текст и файлове

Колекции

Модерен JavaScript

Програми в истинския свят

  • Тестове с node:test: Калкулаторът на отстъпки · Сметката · Бъгът в средната оценка
  • Async, await и нишки: Паралелна сума · Сваляне с басейн · Брояч без загуби
  • Мрежово програмиране: Ехо сървър · Сървър с команди · Чат за двама
  • Бази данни: Каталог · Търсене по част от името · Превод, който се проваля наполовина
  • Reflection: Всички полета и веригата · Мини JSON · Свой пускач на тестове

Да направим игра

Хрониките на Арканум

Epic Cosmos: империята

Проект

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·