Ir al contenido
wannacode

Ejercicios

Aquí están todos los ejercicios del curso en un solo lugar. Primero 50 ejercicios independientes, desde «Hola, mundo» hasta el camino más corto en una cuadrícula, cada uno con un ejemplo y una solución en JavaScript comprobada con un compilador real. Después, los ejercicios de las lecciones, por módulos: cada uno lleva a la lección que explica lo que necesitas.

50 ejercicios para practicar

  1. 1. Hello World

    Imprime en la consola el texto Hello, World!; el programa no tiene entrada.

    Sin entrada.

    Salida
    Hello, World!

    Lo que necesitas está en la lección: Tu primer programa

    Solución
    console.log("Hello, World!");
  2. 2. Saluda al usuario

    Lee un nombre de una línea y saluda a la persona por su nombre con la forma «Hola, <nombre>!».

    Entrada
    María
    Salida
    Hola, María!

    Lo que necesitas está en la lección: Entrada y salida

    Solución
    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("Hola, " + name + "!");
    rl.close();
  3. 3. Imprime la edad

    Lee la edad del usuario (un número entero), guárdala en una variable e imprímela en una frase.

    Entrada
    17
    Salida
    Tienes 17 años.

    Lo que necesitas está en la lección: Variables y tipos

    Solución
    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("Tienes " + age + " años.");
    rl.close();
  4. 4. Conversor de unidades

    Lee una longitud en pulgadas (puede ser un número decimal) y conviértela a centímetros: 1 pulgada = 2.54 cm. Imprime el resultado con 2 decimales.

    Entrada
    12.5
    Salida
    31.75 cm

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    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) + " cm");
    rl.close();
  5. 5. Par o impar

    Lee un número entero e imprime si es par o impar.

    Entrada
    7
    Salida
    7 es impar.

    Lo que necesitas está en la lección: Condiciones

    Solución
    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 + " es par.");
    } else {
    console.log(number + " es impar.");
    }
    rl.close();
  6. 6. Suma de dos números

    Lee dos números enteros, cada uno en su propia línea, e imprime su suma.

    Entrada
    12
    30
    Salida
    La suma es 42.

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    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("La suma es " + (first + second) + ".");
    rl.close();
  7. 7. Área de un cuadrado

    Lee el lado de un cuadrado (un número entero) e imprime su área.

    Entrada
    5
    Salida
    El área es 25.

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    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("El área es " + side * side + ".");
    rl.close();
  8. 8. Volumen de una esfera

    Lee el radio r (puede ser un número decimal) e imprime el volumen de la esfera V = 4/3 · π · r³ con 2 decimales.

    Entrada
    3
    Salida
    El volumen es 113.10.

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    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("El volumen es " + volume.toFixed(2) + ".");
    rl.close();
  9. 9. Compara dos números

    Lee dos números enteros, cada uno en su propia línea, e imprime el mayor (si son iguales, cualquiera de los dos).

    Entrada
    8
    15
    Salida
    El mayor es 15.

    Lo que necesitas está en la lección: Condiciones

    Solución
    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("El mayor es " + a + ".");
    } else {
    console.log("El mayor es " + b + ".");
    }
    rl.close();
  10. 10. ¿Es un triángulo?

    Lee tres números enteros, cada uno en su propia línea, y comprueba si pueden ser los lados de un triángulo: la suma de dos cualesquiera tiene que ser mayor que el tercero.

    Entrada
    3
    4
    5
    Salida
    Pueden formar un triángulo.

    Lo que necesitas está en la lección: Condiciones

    Solución
    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("Pueden formar un triángulo.");
    } else {
    console.log("No pueden formar un triángulo.");
    }
    rl.close();
  11. 11. La nota en palabras

    Lee una nota de la escala búlgara del 2 al 6 (puede ser decimal) e imprímela en palabras: desde 5.50 es Excelente, desde 4.50 Muy bien, desde 3.50 Bien, desde 3.00 Suficiente y por debajo de 3.00 Insuficiente.

    Entrada
    4.75
    Salida
    Muy bien

    Lo que necesitas está en la lección: Condiciones

    Solución
    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("Excelente");
    } else if (grade >= 4.5) {
    console.log("Muy bien");
    } else if (grade >= 3.5) {
    console.log("Bien");
    } else if (grade >= 3) {
    console.log("Suficiente");
    } else {
    console.log("Insuficiente");
    }
    rl.close();
  12. 12. De horas a segundos

    Lee un número de horas (un número entero) e imprime cuántos segundos son.

    Entrada
    2
    Salida
    7200 segundos

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    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 + " segundos");
    rl.close();
  13. 13. Contar hasta N

    Lee un número entero N e imprime los números del 1 al N, cada uno en una línea nueva.

    Entrada
    5
    Salida
    1
    2
    3
    4
    5

    Lo que necesitas está en la lección: Bucles

    Solución
    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. Valor ASCII

    Lee un carácter (el primer carácter de la línea) e imprime su código ASCII, es decir, el número con el que la computadora lo guarda.

    Entrada
    A
    Salida
    El código de A es 65.

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    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("El código de " + symbol + " es " + symbol.charCodeAt(0) + ".");
    rl.close();
  15. 15. Ecuación cuadrática

    Lee a, b y c, cada uno en su propia línea, y resuelve ax² + bx + c = 0. Con dos raíces imprime «x1 = …, x2 = …» (x1 usa +√D), con una raíz «x = …», con 2 decimales; si no hay raíces reales o a es 0, dilo.

    Entrada
    1
    -3
    2
    Salida
    x1 = 2.00, x2 = 1.00

    Lo que necesitas está en la lección: Condiciones

    Solución
    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("No es una ecuación cuadrática");
    } 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("No hay raíces reales");
    }
    }
    rl.close();
  16. 16. Positivo o negativo

    Lee un número entero e imprime si es positivo, negativo o cero.

    Entrada
    -4
    Salida
    Negativo

    Lo que necesitas está en la lección: Condiciones

    Solución
    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("Positivo");
    } else if (number < 0) {
    console.log("Negativo");
    } else {
    console.log("Cero");
    }
    rl.close();
  17. 17. Estaciones

    Lee un número de mes (1–12) e imprime su estación: 12, 1 y 2 son Invierno, 3–5 Primavera, 6–8 Verano y 9–11 Otoño. Para cualquier otro número imprime «Mes no válido».

    Entrada
    4
    Salida
    Primavera

    Lo que necesitas está en la lección: Condiciones

    Solución
    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("Mes no válido");
    } else if (month === 12 || month <= 2) {
    console.log("Invierno");
    } else if (month <= 5) {
    console.log("Primavera");
    } else if (month <= 8) {
    console.log("Verano");
    } else {
    console.log("Otoño");
    }
    rl.close();
  18. 18. Número al revés

    Lee un número entero positivo e imprime el número con sus cifras en orden inverso: 123 se convierte en 321. Los ceros que quedan delante desaparecen (1200 se convierte en 21). Toma la última cifra con % 10 y quítala dividiendo entre 10.

    Entrada
    9071
    Salida
    1709

    Lo que necesitas está en la lección: Bucles

    Solución
    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. Conversor de temperatura

    Lee una temperatura en grados Celsius (puede llevar punto decimal) e imprímela en Fahrenheit con dos decimales. La fórmula es F = C * 9 / 5 + 32.

    Entrada
    36.6
    Salida
    97.88 °F

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    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. El nombre más largo

    La primera línea tiene la cantidad de nombres n, y cada una de las n líneas siguientes tiene un nombre. Imprime el nombre con más letras y su cantidad entre paréntesis; si dos nombres son igual de largos, imprime el primero de ellos.

    Entrada
    4
    Ana
    Alejandra
    Juan
    Guadalupe
    Salida
    Alejandra (9 letras)

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    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} letras)`);
    rl.close();
  21. 21. Contador de palabras

    Lee una línea de texto e imprime cuántas palabras tiene. Las palabras están separadas por uno o más espacios, así que los trozos vacíos entre dos espacios no son palabras.

    Entrada
    Escribo código cada día y mejoro
    Salida
    6

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    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úmero primo

    Lee un número entero n y comprueba si es primo: mayor que 1 y divisible solo entre 1 y entre sí mismo. Basta con probar los divisores i para los que i * i <= n.

    Entrada
    91
    Salida
    91 no es primo

    Lo que necesitas está en la lección: Bucles

    Solución
    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} es primo`);
    } else {
    console.log(`${n} no es primo`);
    }
    rl.close();
  23. 23. Día de la semana

    Lee un número del 1 al 7 e imprime el nombre de ese día de la semana, donde 1 es el lunes. Guarda los nombres en un array; para cualquier otro número imprime «No existe ese día».

    Entrada
    5
    Salida
    Viernes

    Lo que necesitas está en la lección: Arrays

    Solución
    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 = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"];
    if (day >= 1 && day <= 7) {
    console.log(days[day - 1]);
    } else {
    console.log("No existe ese día");
    }
    rl.close();
  24. 24. Factorial

    Lee un número entero n del 0 al 15 e imprime n! = 1 * 2 * ... * n (0! es 1). Ya 13! no cabe en un int, así que en Java y C# guarda el producto en un long.

    Entrada
    15
    Salida
    15! = 1307674368000

    Lo que necesitas está en la lección: Bucles

    Solución
    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. Fecha válida

    Lee un día, un mes y un año, cada uno en su propia línea, e imprime «Fecha válida» o «Fecha no válida». El año es al menos 1, el mes va del 1 al 12 y el día del 1 al número de días de ese mes; febrero tiene 29 días en un año bisiesto (divisible entre 4 pero no entre 100, salvo que sea divisible entre 400).

    Entrada
    29
    2
    2100
    Salida
    Fecha no válida

    Lo que necesitas está en la lección: Condiciones

    Solución
    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("Fecha válida");
    } else {
    console.log("Fecha no válida");
    }
    rl.close();
  26. 26. Frecuencia de letras

    Lee una línea de texto e imprime cuántas veces aparece cada letra en ella, sin distinguir mayúsculas y minúsculas. Imprime las letras en orden alfabético, una por línea, con la forma «a: 5»; los espacios y los signos de puntuación no se cuentan.

    Entrada
    ¡Hola, Mundo!
    Salida
    a: 1
    d: 1
    h: 1
    l: 1
    m: 1
    n: 1
    o: 2
    u: 1

    Lo que necesitas está en la lección: Map y Set

    Solución
    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. Mínimo y máximo en un array

    La primera línea tiene la cantidad n, y cada una de las n líneas siguientes tiene un número entero. Léelos en un array e imprime el menor y el mayor, empezando por el primer elemento y comparándolo con los demás.

    Entrada
    5
    7
    -3
    12
    0
    4
    Salida
    Mínimo: -3
    Máximo: 12

    Lo que necesitas está en la lección: Arrays

    Solución
    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(`Mínimo: ${min}`);
    console.log(`Máximo: ${max}`);
    rl.close();
  28. 28. Ordenar un array

    La primera línea tiene la cantidad n, y cada una de las n líneas siguientes tiene un número entero. Ordénalos tú mismo de menor a mayor con el método de la burbuja (n - 1 pasadas; en cada una intercambias los vecinos que están en el orden equivocado) e imprímelos en una línea, separados por espacios.

    Entrada
    6
    5
    2
    9
    1
    5
    6
    Salida
    1 2 5 5 6 9

    Lo que necesitas está en la lección: Arrays

    Solución
    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. Reemplazar las vocales

    Lee una línea de texto e imprímela con cada vocal, mayúscula o minúscula, reemplazada por el carácter *. Las vocales son a, e, i, o, u, también con tilde (á, é, í, ó, ú).

    Entrada
    Me encanta programar
    Salida
    M* *nc*nt* pr*gr*m*r

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    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 = "aeiouáéíóú";
    let result = "";
    for (const c of text) {
    if (vowels.includes(c.toLowerCase())) {
    result += "*";
    } else {
    result += c;
    }
    }
    console.log(result);
    rl.close();
  30. 30. Suma de las cifras

    Lee un número entero no negativo e imprime la suma de sus cifras. La última cifra es n % 10, y n / 10 la quita (n // 10 en Python).

    Entrada
    9875
    Salida
    29

    Lo que necesitas está en la lección: Bucles

    Solución
    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. Palíndromo

    Lee una línea de texto y comprueba si es un palíndromo, es decir, si se lee igual al revés. Las mayúsculas y las minúsculas cuentan como iguales y los espacios se saltan. Imprime «Palíndromo» o «No es palíndromo».

    Entrada
    Anita lava la tina
    Salida
    Palíndromo

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    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("Palíndromo");
    } else {
    console.log("No es palíndromo");
    }
    rl.close();
  32. 32. Contraseña segura

    Lee contraseñas, una por línea, hasta que llegue una segura: al menos 8 caracteres, al menos una cifra, una letra mayúscula y una minúscula. Para cada contraseña débil imprime la primera regla que no cumple, en este orden («Demasiado corta», «Sin cifra», «Sin mayúscula», «Sin minúscula»); para la segura imprime «Contraseña aceptada» y detente.

    Entrada
    kotka
    kotkamiau
    kotkamiau7
    Kotkamiau7
    Salida
    Demasiado corta
    Sin cifra
    Sin mayúscula
    Contraseña aceptada

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    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("Demasiado corta");
    } else if (!digit) {
    console.log("Sin cifra");
    } else if (!upper) {
    console.log("Sin mayúscula");
    } else if (!lower) {
    console.log("Sin minúscula");
    } else {
    console.log("Contraseña aceptada");
    break;
    }
    }
    rl.close();
  33. 33. Array al revés

    La primera línea tiene la cantidad n, y cada una de las n líneas siguientes tiene un número entero. Léelos en un array e imprímelos en orden inverso en una línea, separados por espacios: recorre el array desde el último índice hasta el cero.

    Entrada
    4
    10
    -2
    7
    3
    Salida
    3 7 -2 10

    Lo que necesitas está en la lección: Arrays

    Solución
    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. Contar los elementos

    Lee una línea de palabras separadas por un solo espacio e imprime cuántas veces aparece cada palabra, con la forma «palabra: cantidad». Las palabras salen en el orden en que aparecieron por primera vez.

    Entrada
    manzana pera manzana ciruela pera manzana
    Salida
    manzana: 3
    pera: 2
    ciruela: 1

    Lo que necesitas está en la lección: Map y Set

    Solución
    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úmeros primos

    Lee un número N e imprime en una línea, separados por espacios, todos los números primos del 2 al N.

    Entrada
    30
    Salida
    2 3 5 7 11 13 17 19 23 29

    Lo que necesitas está en la lección: Bucles

    Solución
    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. Media

    Una línea tiene números enteros separados por espacios. Imprime su media con dos decimales.

    Entrada
    5 8 12 6
    Salida
    Media: 7.75

    Lo que necesitas está en la lección: Arrays

    Solución
    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("Media: " + average.toFixed(2));
    rl.close();
  37. 37. Ordenar por longitud

    Una línea tiene palabras separadas por espacios. Ordénalas por longitud, de la más corta a la más larga (las palabras de igual longitud mantienen el orden de la entrada), e imprímelas en una línea.

    Entrada
    cereza higo banana kiwi ciruela
    Salida
    higo kiwi cereza banana ciruela

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    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. Contador de oraciones

    Lee una línea de texto e imprime cuántas oraciones tiene. Una oración termina con un punto, un signo de exclamación o un signo de interrogación; una serie de esos signos (como «...» o «?!») es un solo final.

    Entrada
    ¡Hola! ¿Cómo estás? Estoy bien... ¿Y tú?!
    Salida
    Oraciones: 4

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    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("Oraciones: " + count);
    rl.close();
  39. 39. Números de Fibonacci

    La sucesión de Fibonacci empieza con 1, 1, y cada número siguiente es la suma de los dos anteriores. Lee N (del 1 al 50) e imprime el N-ésimo número de la sucesión.

    Entrada
    40
    Salida
    102334155

    Lo que necesitas está en la lección: Bucles

    Solución
    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. Calcular la mediana

    Una línea tiene números enteros separados por espacios. Imprime su mediana con un decimal: el número del medio una vez ordenados, o la media de los dos del medio cuando la cantidad es par.

    Entrada
    12 3 7 9 1 8
    Salida
    Mediana: 7.5

    Lo que necesitas está en la lección: Arrays: push, splice y sort

    Solución
    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("Mediana: " + median.toFixed(1));
    rl.close();
  41. 41. Gráfico de caracteres

    Lee una línea de texto. Para cada carácter que no sea el espacio, en el orden en que aparece por primera vez, imprime una línea «carácter | estrellas» con una estrella por cada vez que aparece en el texto.

    Entrada
    pan de banana
    Salida
    p | *
    a | ****
    n | ***
    d | *
    e | *
    b | *

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    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. Trasponer una matriz

    La primera línea tiene el número de filas R y de columnas C, y le siguen R líneas con C números separados por espacios. Imprime la matriz traspuesta: C líneas con R números, donde las filas pasan a ser columnas.

    Entrada
    2 3
    1 2 3
    4 5 6
    Salida
    1 4
    2 5
    3 6

    Lo que necesitas está en la lección: Arrays bidimensionales

    Solución
    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. Caminos en un laberinto

    La primera línea tiene R y C, y le siguen R líneas de C caracteres: «.» es una celda libre y «#» es una pared. Moviéndote solo a la derecha o hacia abajo y sin pisar nunca una pared, imprime el número de todos los caminos desde la esquina superior izquierda hasta la inferior derecha.

    Entrada
    4 5
    .....
    .#.#.
    ...#.
    #....
    Salida
    Caminos: 4

    Lo que necesitas está en la lección: Recursión

    Solución
    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("Caminos: " + countPaths(maze, 0, 0));
    rl.close();
  44. 44. Estadística de notas

    Una línea tiene notas del 2 al 6 (la escala escolar búlgara, 6 es la mejor), separadas por espacios. Imprime cuántas son excelentes, muy bien, bien, suficientes e insuficientes, cada categoría en su propia línea.

    Entrada
    6 4 5 6 3 5 2 6 5 4
    Salida
    Excelente (6): 3
    Muy bien (5): 3
    Bien (4): 2
    Suficiente (3): 1
    Insuficiente (2): 1

    Lo que necesitas está en la lección: Arrays

    Solución
    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 = ["", "", "Insuficiente", "Suficiente", "Bien", "Muy bien", "Excelente"];
    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. Números romanos

    Lee un número entero del 1 al 3999 e imprímelo en números romanos (I, V, X, L, C, D, M, donde 4 es IV, 9 es IX, 40 es XL, etc.).

    Entrada
    1994
    Salida
    MCMXCIV

    Lo que necesitas está en la lección: Arrays

    Solución
    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. Simulación de una moneda

    Lee una semilla x (del 1 al 2147483646) y un número de lanzamientos N, cada uno en su propia línea. En cada lanzamiento haz x = x * 16807 % 2147483647; un x par es cara (C) y un x impar es cruz (X). Imprime los lanzamientos en una línea y después cuántas veces salió cara y cuántas cruz.

    Entrada
    42
    10
    Salida
    CXXXCXXCCX
    Cara: 4
    Cruz: 6

    Lo que necesitas está en la lección: Bucles

    Solución
    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 += "C";
    heads++;
    } else {
    tosses += "X";
    }
    }
    console.log(tosses);
    console.log("Cara: " + heads);
    console.log("Cruz: " + (n - heads));
    rl.close();
  47. 47. Array simétrico

    Una línea tiene números enteros separados por espacios. Comprueba si el array es simétrico, es decir, si se lee igual de izquierda a derecha y de derecha a izquierda.

    Entrada
    1 2 3 2 1
    Salida
    Simétrico

    Lo que necesitas está en la lección: Arrays

    Solución
    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 ? "Simétrico" : "No simétrico");
    rl.close();
  48. 48. Paréntesis equilibrados

    Lee una línea de texto y comprueba si sus paréntesis (), [] y {} están equilibrados: cada uno que abre tiene uno que cierra del mismo tipo y los pares no se cruzan. Los demás caracteres no cuentan.

    Entrada
    (a + [b) * c]
    Salida
    No equilibrados

    Lo que necesitas está en la lección: Pila, cola y lista enlazada

    Solución
    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("Equilibrados");
    } else {
    console.log("No equilibrados");
    }
    rl.close();
  49. 49. Serie de elementos iguales

    Una línea tiene números enteros separados por espacios. Encuentra la serie más larga de números vecinos iguales e imprímela en una línea; si varias series tienen la misma longitud, imprime la primera.

    Entrada
    2 1 1 3 3 3 2 2 2 5
    Salida
    3 3 3

    Lo que necesitas está en la lección: Arrays

    Solución
    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. Camino más corto en una cuadrícula

    La primera línea tiene R y C, y le siguen R líneas de C caracteres: «.» es una celda libre, «#» es una pared, «S» es el inicio y «E» es la meta. Moviéndote hacia arriba, abajo, izquierda y derecha, imprime el menor número de movimientos de S a E, o «No hay camino» si E no se puede alcanzar.

    Entrada
    5 6
    S.#...
    .##.#.
    ...#..
    #.#..#
    ...E.#
    Salida
    7

    Lo que necesitas está en la lección: Pila, cola y lista enlazada

    Solución
    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 = "No hay camino";
    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();

Ejercicios de las lecciones

Sección «Ejercicios de las lecciones»

Fundamentos del lenguaje

Funciones

Clases y objetos

Herencia y polimorfismo

Errores y excepciones

Texto y archivos

  • Cadenas: Palíndromo · Un recibo con columnas · Palabras al revés
  • Expresiones regulares: Fecha · Número de móvil · Email · Lista de la compra
  • Expresiones regulares: grupos y reemplazo: Buscar y reemplazar · Palabras con prefijo · Direcciones en un texto · Fechas a ISO
  • Archivos: Un archivo de configuración · Un filtro de archivo de registro · El contenido de una carpeta · Un archivo índice
  • Datos en archivos: Análisis de un CSV · Guardar al héroe · Texto duplicado

Colecciones

  • Arrays: push, splice y sort: Una estantería · Un registro de eventos · Un cuaderno · Cálculo mental
  • Pila, cola y lista enlazada: Un tren de juguete · Una línea de autobús · Un indicador de bolsa · Paréntesis equilibrados · Tu propia lista enlazada
  • Map y Set: Una tabla de usuarios · Frecuencia de palabras · Documentos por palabra clave · Una red de contactos
  • Códigos hash y funciones hash: Una clave para una persona · El robot del almacén · El hash de un archivo
  • Clases anidadas y datos: Carrito de compras · Monitor de un servidor web · Administrador de un edificio · Clasificación

JavaScript moderno

Programas en el mundo real

  • Tests con node:test: La calculadora de descuentos · La cuenta · El error en la nota media
  • Async, await e hilos: Suma en paralelo · Descarga con un grupo · Un contador sin pérdidas
  • Programación en red: Servidor de eco · Un servidor con comandos · Un chat para dos
  • Bases de datos: Catálogo · Búsqueda por parte del nombre · Una transferencia que falla a medias
  • Reflexión: Todos los campos y la cadena · Mini JSON · Tu propio ejecutor de pruebas

Hagamos un juego

Las crónicas de Arcanum

Epic Cosmos: el imperio

Proyecto

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·