Todos los Problemas
Explora nuestra colección de 109 desafíos de programación
Contador de Números Pares
Este código cuenta cuántos números pares hay del 1 al 10. Usamos un bucle for para recorrer los números, el operador % (módulo) para verificar si son pares, y un contador que se incrementa cada vez que encontramos uno.
Contador de Números Pares
Este código recorre los números del 1 al 10 y cuenta cuántos son pares usando el operador módulo (%). Si el residuo de dividir entre 2 es 0, el número es par.
Detector de Palíndromos Múltiples
Este código usa diccionarios por comprensión para verificar cada palabra contra su reverso (p[::-1]), luego filtra con list comprehension solo los valores True. Combina múltiples conceptos en 4 líneas elegantes.
Contador de Vocales por Palabra
Este código usa list comprehension con diccionarios para contar cuántas vocales tiene cada palabra. La expresión anidada 'sum(1 for letra in p if letra.lower() in vocales)' recorre cada letra de la palabra y suma 1 por cada vocal encontrada.
Contador de Números Pares
Este código recorre un array de números y cuenta cuántos son pares usando el operador módulo (%). Si el residuo de dividir entre 2 es 0, el número es par.
Caché Inteligente con Closures
Función de orden superior que crea un closure con Map para cachear resultados de funciones async. Combina closures, async/await y operador spread para optimizar llamadas costosas.
¿Puerta Abierta o Cerrada?
El operador lógico OR (||) devuelve true si AL MENOS UNA condición es verdadera. Como es de día (true), se abre la puerta aunque no haya luz adicional.
Contador de Números Pares
Este código cuenta cuántos números pares hay del 1 al 10. Usa el operador módulo (%) para detectar si un número es divisible entre 2, incrementando el contador cada vez que encuentra uno.
Contador de Números Pares
Este código recorre una lista de números y cuenta cuántos son pares usando el operador módulo (%). Si el residuo de dividir entre 2 es 0, el número es par. Los números pares son 12, 18 y 22.
Palíndromo con Streams
Usamos streams para invertir la palabra convirtiendo cada char en un objeto Character, luego usamos reduce para construir la palabra al revés concatenando cada carácter al inicio. Finalmente comparamos si la palabra original es igual a su versión invertida.
Filtrado de Números Primos con Streams
Usamos streams con filter() para encontrar números primos. El predicado lambda verifica que ningún número entre 2 y n-1 divida exactamente a n. IntStream.range() genera la secuencia y noneMatch() confirma que no hay divisores.
¿Contraseña Segura?
Evaluamos si una contraseña es segura verificando tres condiciones con operadores lógicos: longitud mínima de 8 caracteres AND contiene números AND contiene mayúsculas. Todas deben ser True para ser segura.
Contador de Vocales en Nombre
Este código cuenta cuántas vocales hay en un nombre. Recorre cada letra, la convierte a minúscula y verifica si es vocal (a, e, i, o, u). En 'Maria' hay 3 vocales: a, i, a.
Construye una Escalera
Este código construye una escalera visual usando el símbolo #. En cada iteración, añadimos más símbolos usando repeat() y creamos una nueva línea con \n. Es perfecto para practicar loops y manipulación de strings.
Suma de Múltiplos
Este código suma todos los números del 1 al 20 que son múltiplos de 3 O múltiplos de 5. Encuentra: 3,5,6,9,10,12,15,18,20 y los suma.
Cuenta Dígitos Pares
Este código cuenta cuántos dígitos pares tiene un número. Extrae cada dígito con % 10, verifica si es par, y divide el número entre 10 para pasar al siguiente dígito.
Extractor de Dominios Únicos
Usando streams, extraemos el dominio de cada email con substring() buscando después del '@', luego recolectamos en un Set que automáticamente elimina duplicados. El resultado muestra cuántos dominios únicos existen en la lista.
¿Puerta Abierta o Cerrada?
Una puerta inteligente se abre solo cuando los interruptores 1 y 3 están activados (true) Y el interruptor 2 está desactivado (false). Usamos operadores lógicos AND (&&) y NOT (!) para evaluar la condición completa.
Detector de Números Triangulares
Un número triangular se forma sumando enteros consecutivos (1+2+3+4=10). El algoritmo acumula sumas hasta alcanzar o superar n, verificando si coincide exactamente.
Validador de Triángulo
Para que tres lados formen un triángulo válido, la suma de cualquier par de lados debe ser mayor que el tercer lado. Este código verifica las tres condiciones necesarias usando operadores lógicos.
Detecta el Horario
Este código clasifica una hora del día (formato 24h) en tres momentos: Mañana (6-11), Tarde (12-19) o Noche (20-5). Usa operadores lógicos && para verificar rangos y estructuras if-else anidadas.
Contador de Vocales Consecutivas
Divide el texto por consonantes, creando grupos de vocales consecutivas. Luego encuentra el grupo más largo usando reduce y Math.max. En 'beauuutiful', 'eau' tiene 3 vocales seguidas.
Máximo Común Divisor Recursivo
El algoritmo de Euclides encuentra el máximo común divisor recursivamente: si b es 0, retorna a; si no, calcula mcd(b, a % b). Para 48 y 18: mcd(18, 12) → mcd(12, 6) → mcd(6, 0) → 6
¿Dónde está el Dígito?
Convierte el número a String usando valueOf() y encuentra la posición del dígito con indexOf(). El 7 está en la posición 1 (segunda posición, indexado desde 0). Si no existe, retorna -1.
Multiplicador de Caracteres Mágico
Este código transforma cada carácter multiplicándolo por su valor numérico en Unicode (mod 10). 'H'=72→2 veces, 'o'=111→1 vez, 'l'=108→8 veces, 'a'=97→7 veces. Usa streams, mapToObj, repeat() y reduce para crear esta transformación mágica.
¿Descuento Aplicable?
Se otorga descuento cuando el precio supera $500 Y la persona es jubilada (65+ años). Ambas condiciones deben cumplirse usando el operador lógico &&.
Magia de Template Literal Types
TypeScript permite crear tipos dinámicos con Template Literal Types. Aquí definimos un tipo Ruta que solo acepta strings con formato específico: 'api/{nombre}/v{número}'. El tipo R se convierte en literalmente ese patrón, validando el formato en tiempo de compilación.
Calculadora de Edad de Perro
Convierte años humanos a años perrunos (x7) y ladra una vez por cada año humano. ¡Un perro de 3 años humanos tiene 21 años perrunos y ladra 3 veces!
¿Cuántos Números?
En TypeScript/JavaScript, puedes modificar la propiedad length de un array directamente. Aumentarla crea espacios vacíos (holes) que no son undefined, sino 'empty items'. Esto es diferente a hacer push() de valores undefined.
Escalera de Asteriscos
Este código crea una escalera de asteriscos usando un bucle for. En cada iteración, imprime asteriscos según el número actual (i), creando un patrón ascendente.
El Misterio del Array Vacío
¡Sorpresa! Modificar la propiedad 'length' de un array a 0 elimina TODOS sus elementos instantáneamente. Es una forma poco conocida de vaciar arrays, pero puede causar bugs si no sabes que existe. arr[0] es undefined porque el array quedó completamente vacío.
Convierte Minutos a Horas
Dividimos los minutos totales entre 60 para obtener las horas completas con Math.floor(), y usamos el operador módulo (%) para obtener los minutos restantes. Perfecto para convertir duraciones.
Contador de Vocales
Recorremos cada letra de la palabra y verificamos si es una vocal (A o E). El método indexOf retorna -1 si no encuentra la letra, por eso comparamos >= 0. En 'JAVA' hay 2 vocales: A y A.
División Misteriosa
¡Sorpresa! En Java, cuando divides dos enteros (int), el resultado siempre es un entero. La división 5/2 matemáticamente es 2.5, pero Java descarta la parte decimal automáticamente. Para obtener 2.5, necesitarías usar double: (double)a / b
El Algoritmo de Euclides
El Algoritmo de Euclides, creado hace más de 2000 años, es uno de los algoritmos más antiguos que aún se usa. Calcula el Máximo Común Divisor (MCD) mediante divisiones sucesivas. ¿Sabías que este algoritmo griego antiguo sigue siendo el más eficiente para encontrar el MCD?
¿Cuántos Bits en un Byte?
Un byte siempre contiene 8 bits. En este código, convertimos el número binario 11111111 (que representa un byte completo con todos los bits en 1) a string binario y contamos su longitud. Esta es una verdad fundamental de la computación: 1 byte = 8 bits, lo que permite representar valores de 0 a 255.
Multiplicación Invisible
En Python, ¡puedes multiplicar strings! El operador * repite la cadena el número de veces indicado. Es una característica única que convierte 'Hola' * 3 en 'HolaHolaHola'.
Calcula el Precio con Descuento
Calcula el precio final aplicando un porcentaje de descuento. Primero calcula cuánto es el 15% de 80, luego lo resta del precio original.
El Número de Grace Hopper
Grace Hopper, pionera de la programación, usaba cables de 30cm para enseñar qué tan lejos viaja la luz en un nanosegundo. En 1947 también encontró el primer 'bug' real: una polilla en una computadora. ¡Por eso llamamos 'bugs' a los errores!
Inversor de Dígitos con Streams
Convierte el número a String, usa StringBuilder para invertirlo con reverse(), y luego lo parsea de vuelta a entero. Una forma elegante de invertir dígitos sin bucles matemáticos.
Validador de Estructura JSON Anidada
Usa generics con DeepPartial para validación de tipos, async/await para operaciones asíncronas, y every() como reduce implícito. El resultado es false porque falta la propiedad 'activo' en los datos.
¿Cabe en la Maleta?
La lógica evalúa: (maleta Y NO elefante) O ratón. Como llevaElefante es true, la primera parte es false. Como llevaRaton es false, todo el resultado es false y imprime 'No cabe!' - ¡Obvio que un elefante no cabe en una maleta! 🐘
¿Qué es un Hash?
Un hash convierte datos de cualquier tamaño en un número fijo. El algoritmo multiplica por 31 (número primo) y suma el código ASCII de cada letra. Se usa en tablas hash, contraseñas y detección de cambios. ¡La misma entrada siempre da el mismo hash!
¿Cuántos 'S' tiene tu dinero?
Este código cuenta cuántos dígitos '5' (eses) aparecen en tu cantidad de dinero Y en el doble de esa cantidad. Con 555: tiene tres '5', pero 555×2=1110 tiene cero '5', total = 3+1=4. ¡Matemática caprichosa! 🎲
El Paradigma de Djikstra
Edsger Djikstra, famoso por su algoritmo de camino más corto, también introdujo el concepto de 'programación estructurada' eliminando el uso de GOTO. Este código demuestra un patrón iterativo simple que Djikstra defendía: bucles con propósito claro y variables bien definidas.
El Teorema de Turing
Alan Turing demostró en 1936 que es matemáticamente imposible crear un algoritmo que determine si cualquier programa terminará o se ejecutará infinitamente. Este es el famoso 'Problema de la Parada' (Halting Problem), uno de los límites fundamentales de la computación.
Pirámide de Sumas
Este código construye una pirámide donde cada nivel muestra la suma acumulada de números desde 1 hasta ese nivel. Por ejemplo, el nivel 3 suma 1+2+3=6. Usa un bucle for para iterar niveles y la función sum() con range() para calcular cada suma.
Rotador de Matriz Numérica
Rota una matriz 90 grados en sentido horario. Primero transponemos (intercambiamos filas por columnas) usando map con el índice, luego invertimos cada columna para completar la rotación.
Operador Morsa con Iterador Condicional
El operador morsa := (walrus operator) asigna y evalúa en una sola expresión. Aquí calculamos x², lo guardamos en y, verificamos si y > 10, y si es true multiplicamos y por 2. ¡Tres operaciones en una línea de comprensión!
¿El Gato Roba Comida?
El gato solo roba comida cuando tiene hambre Y el dueño no está presente Y la comida está al alcance. Si falta alguna condición, el gato se comporta. ¡Lógica felina perfecta!
¿Cuál es el Límite de Recursión?
La mayoría de motores de JavaScript tienen un límite de ~10,000-15,000 llamadas recursivas antes de lanzar un error de desbordamiento de pila. Este límite existe porque cada llamada recursiva ocupa espacio en el call stack, que tiene tamaño finito. Para números grandes, ¡necesitas iteración o recursión de cola optimizada!
Cuenta Picos en el Array
Un 'pico' es un número mayor que sus vecinos inmediatos. En el array, 3 > (1,2), 5 > (2,4), y 7 > (4,6), por lo que hay 3 picos. Usa filter con índices para verificar cada elemento contra sus adyacentes.
La Paradoja del Punto Flotante
En JavaScript (y la mayoría de lenguajes), los números decimales usan el estándar IEEE 754 de punto flotante. Esto causa errores de precisión: 0.1 + 0.2 = 0.30000000000000004, ¡no exactamente 0.3! Este es uno de los bugs más famosos que sorprende a programadores principiantes.
¿Cuándo Se Inventó el Operador Ternario?
El operador ternario (? :) fue introducido en el lenguaje BCPL en 1966 y heredado por C en 1972. Java lo adoptó como una forma compacta de escribir if-else simples. La sintaxis es: condición ? valorSiTrue : valorSiFalse
Bucle Fantasma
¡Sorpresa! El bucle termina antes que los setTimeout, por eso 'i' ya vale 3 cuando se ejecutan. Además, 'Fin' aparece primero porque setTimeout pospone la ejecución aunque sea 0ms. Es un clásico de JavaScript asíncrono y closures.
Comparador de Strings Trampa
¡Sorpresa! compareTo() compara lexicográficamente, no numéricamente. '1' viene ANTES que '2' en Unicode, así que "100" < "20" retorna true. Para comparar números, debes convertir: Integer.parseInt(a) > Integer.parseInt(b)
Reduce con Promesas Encadenadas
¡TRUCO! Aunque funciona, hay un problema oculto: reduce NO espera cada promesa antes de la siguiente iteración. Las promesas se crean todas al mismo tiempo, creando una cadena de 'await (await (await 0) + 1) + 2) + 3'. Con operaciones async reales (fetch, setTimeout), el orden puede ser impredecible. La forma correcta es usar un for...of loop o Promise.all() para controlar la ejecución. ¡Reduce con async es una trampa común!
¿El Precio Tiene Descuento?
Se aplica descuento si el precio es mayor a 50 y el descuento es al menos del 10%. Usamos el operador lógico && (AND) para verificar ambas condiciones.
La Trampa del NaN Silencioso
parseInt('25años') devuelve NaN, no 25. Aunque TypeScript lo tipifica como number, NaN >= 18 siempre es false. Este es un gotcha común: NaN es de tipo number pero falla en todas las comparaciones numéricas.
¿Qué Es el Número de Dunbar?
El Número de Dunbar (150) es el límite cognitivo de relaciones sociales estables que un humano puede mantener. En ciencias de la computación, este concepto inspira diseños de redes sociales, sistemas de mensajería y arquitecturas distribuidas. El código compara si una red social excede este límite cognitivo.
Cuenta las Letras Repetidas
Este código cuenta cuántas veces aparece la letra más repetida en una palabra. Usa un diccionario para contar cada letra y luego encuentra el valor máximo. En 'Montana', tanto 'a' como 'n' aparecen 2 veces.
Suma de Claves Misteriosa
¡Trampa de tipos! Las claves string '1' y '2' NO son comparables con 3 (TypeError potencial), pero Python solo suma las claves int (1 y 2). El resultado es 1+2=3, NO los valores del diccionario. Muchos esperan 70 o un error.
Comparador de Strings sin compareTo()
Usando streams para comparar strings carácter por carácter sin métodos nativos. El IntStream crea índices, map calcula diferencias ASCII, filter encuentra la primera diferencia no-cero, y orElse maneja strings de diferente longitud. Resultado negativo significa que 'a' va antes alfabéticamente.
¿TypeScript Puede Sumar Strings?
En TypeScript, cuando sumas un string con un number, JavaScript convierte el número a string y concatena. El resultado es '53' de tipo string, no 8. ¡La coerción de tipos en acción!
La Paradoja del Objeto Congelado
Object.freeze() hace que el objeto sea inmutable. Intentar modificar user.age falla silenciosamente en modo no-estricto (no lanza error), pero el valor nunca cambia. ¡La asignación se ignora completamente! En strict mode, lanzaría TypeError. Este es un gotcha común al trabajar con objetos congelados.
¿Cuál Fue el Primer Lenguaje de Alto Nivel?
FORTRAN (FORmula TRANslation) fue el primer lenguaje de programación de alto nivel, creado por John Backus en IBM en 1957. Revolucionó la programación al permitir escribir código científico de manera más natural que en ensamblador.
Promedio de Impares
Recorre el array, identifica números impares (3, 7, 9), los suma (19) y divide por la cantidad (3) para obtener el promedio: 6.33
¿Qué significa HTTP?
HyperText Transfer Protocol - protocolo de transferencia de hipertexto
Detector de Escalera Numérica
Verifica si un array forma una escalera numérica (diferencia constante entre elementos consecutivos). Usa .every() para comparar cada elemento con el anterior y validar que la diferencia sea siempre la misma.
El Reloj Misterioso
Este código convierte horas y minutos a minutos totales (15*60+45 = 945), luego divide por 100 y muestra solo la parte entera (9). ¿Por qué dividir por 100? Es el acertijo - ¡descubre el patrón oculto!
Lista Multiplicada
En Python, multiplicar una lista por un número NO multiplica sus elementos, sino que REPITE la lista completa. Este es un error común que sorprende a muchos programadores. Si quisieras multiplicar cada elemento, necesitarías usar un list comprehension: [x * 2 for x in numeros]
Suma Confusa
Cuando multiplicas un string por un número en Python, ¡repite el string! '5' * 3 = '555', no 15. Es un error común al olvidar convertir tipos.
El Código Secreto
Este código convierte cada letra de 'JAVA' a su valor ASCII. J=74, A=65, V=86, A=65. ¡Es como un código secreto usando números!
Complejidad Algoritmica
Búsqueda binaria divide el espacio a la mitad en cada paso: O(log n)
Bug en el Print
Debe usar comillas consistentes: dobles O simples, no mezclar
Condicional Completo
else maneja el caso cuando la condición es falsa
Git Commit
FALSO - Puedes usar git reset, git revert, o git commit --amend
Bug en el Print
Debe usar comillas consistentes: dobles O simples, no mezclar
Array Mágico
Cuando asignas un valor a un índice muy alto en un array, JavaScript automáticamente ajusta la longitud del array a ese índice + 1. Los espacios entre quedan como 'empty slots'. ¡Es una característica sorprendente de los arrays en JavaScript!
Python es Case-Sensitive
FALSO - Python es case-sensitive, son variables diferentes
Encuentra el Nombre Más Largo
El código itera sobre un array de nombres y compara la longitud de cada uno usando .length. Mantiene en 'masLargo' el nombre con más caracteres encontrado hasta el momento. Al final imprime 'Roberto' porque tiene 7 letras, más que todos los demás.
El Eco Numérico
La palabra 'NUEVE' tiene 5 letras. El código calcula 5 * 5 - 5 = 20. ¡El eco devuelve un número diferente al que dice la palabra!
Escalera de Multiplicaciones
Esta función genera una escalera de cubos. Para cada número del 1 al n, calcula su cubo (i³) y lo imprime. Con n=4 obtenemos: 1³=1, 2³=8, 3³=27, 4³=64. Es una forma creativa de practicar bucles y exponenciación.
El Operador Misterioso >>>
El operador >>> es el desplazamiento de bits sin signo en Java. A diferencia de >>, rellena con ceros a la izquierda sin importar el signo. Convierte -8 a bits (11111111...11111000), desplaza 2 posiciones a la derecha rellenando con ceros, resultando en un número positivo enorme.
El Contador de Vocales Consecutivas
El código cuenta cuántas veces aparecen dos vocales seguidas en una palabra. En 'aeiou' hay 4 pares consecutivos: ae, ei, io, ou. Usa indexOf() para verificar si un carácter es vocal y compara posiciones adyacentes.
El Intercambio sin Variable Extra
JavaScript permite intercambiar valores sin usar una variable temporal. Usando matemáticas: primero guardamos la suma, luego recuperamos el valor original de 'a' restando 'b', y finalmente obtenemos el original de 'b' restando el nuevo valor. ¡Los valores se intercambiaron sin ayuda extra!
El Misterio de las Llaves Flotantes
En JavaScript, todas las llaves de objeto se convierten a strings. Cuando usamos obj[1.5], el número 1.5 se convierte a '1.5'. Por eso obj['1.5'] sobrescribe obj[1.5], ya que ambas son la misma llave. ¡Las llaves numéricas y string son lo mismo en objetos!
La Calculadora de Excusas
Este código calcula cuántas excusas necesitas generar basándose en la diferencia entre tus horas de Netflix y estudio. El loop imprime una excusa por cada hora de procrastinación. ¡La realidad duele pero el código no miente! 😅
El Misterio del Operador Condicional Ternario
El operador ternario anidado (?:) permite evaluar múltiples condiciones en una sola línea. Primero verifica si edad >= 18 (falso), luego si edad >= 16 (verdadero), devolviendo 'supervisado'. Es una característica poderosa de TypeScript/JavaScript para asignaciones condicionales compactas.
El Misterio del Timestamp Negativo
new Date(0) crea una fecha con el timestamp Unix 0, que corresponde al 1 de enero de 1970 a las 00:00:00 UTC. Este es el punto de referencia del tiempo Unix. getFullYear() retorna 1970.
El Validador de Contraseñas Roto
El bug está en la lógica de validación. Aunque isalnum() confirma que no hay caracteres especiales, no verifica que exista al menos un número Y una letra. Necesitamos usar any() con generadores para asegurar que la contraseña contiene tanto dígitos como letras.
El Contador de Mentiras del Desarrollador
¡Este código tiene un bug deliberado! En Java, los nombres de variables NO pueden tener comillas. La variable debería ser bugs_reportados (sin comillas). Si corregimos eso, el loop suma 0+1+2+3+4 = 10. La ironía: reportamos 47 bugs pero solo había 10 reales. ¡Típico de developers exagerando en los reportes! 😄
El Misterio del Switch sin Break
Sin declaraciones 'break', el switch ejecuta todos los casos desde donde coincide hasta el final (fall-through). Aunque dia=2 coincide con case 2, también ejecuta case 3, asignando "fin" como valor final.
El Misterio del Array Reverse
El método .reverse() modifica el array original directamente (es un método mutante). Después de llamar a reverse(), el array 'nums' queda como [3, 2, 1], por lo que nums[0] es 3. Este es un concepto importante: algunos métodos de array modifican el original, mientras que otros retornan una copia nueva.
El Misterio del Array Vacío vs Null
¡Trampa de comparación! Aunque arr.length es 0 y null se coerce a 0 en comparaciones numéricas, usar == con null es especial: solo null == undefined es true. Además, [] == null es false porque los objetos no se convierten a null. TypeScript permite any aquí, pero esto muestra por qué el tipado estricto es importante.
Encriptador de Coordenadas GPS
En GPS, las longitudes oeste se representan como negativas. Al multiplicar por -1, convertimos -74.0060 a 74.0060 para mostrarlo como positivo con el sufijo °W. El código procesa coordenadas GPS y las formatea en un string legible.
Promise Race con Side Effects
Promise.race() retorna cuando el primer Promise se resuelve, pero NO cancela los otros Promises. Esto significa que ambas llamadas fetch() se completan, desperdiciando ancho de banda y procesamiento. La solución usa AbortController para cancelar explícitamente la petición perdedora después de que race() se resuelva.
¿Qué Devuelve la Comparación Encadenada?
Python permite comparaciones encadenadas. La expresión '18 < edad < 30' evalúa si edad está entre 18 y 30 (exclusivo). Como 25 cumple ambas condiciones (25 > 18 AND 25 < 30), el resultado es True.
El Enigma del Operador de Coalescencia
El operador de coalescencia nula (??) solo retorna el valor de la derecha cuando el de la izquierda es null o undefined. Como 0 es un valor válido (aunque falsy), la función retorna 0 inmediatamente, sin evaluar b ni 'default'.
¿Qué es el Número de Erdős?
El Número de Erdős mide la 'distancia de colaboración' entre un matemático/científico y Paul Erdős. Erdős publicó más de 1,500 artículos con 511 colaboradores. Si escribiste un paper con Erdős, tu número es 1. Si escribiste con alguien que colaboró con Erdős, tu número es 2. Donald Knuth, creador de TeX, tiene Número de Erdős 4. Este concepto inspiró los 'Bacon Numbers' en Hollywood y es fundamental en teoría de grafos.
El Misterio del Operador de Exponenciación
El operador ** (exponenciación) tiene asociatividad de derecha a izquierda. Primero se calcula 3**2 = 9, luego 2**9 = 512. Es diferente a (2**3)**2 que sería 64.
El Misterio del Type Guard Automático
TypeScript tiene 'type narrowing': dentro del if, sabe que valor es string. ¡Pero fuera del if puede ser string O number, entonces toUpperCase() da error de compilación! El código nunca llega a ejecutarse porque TypeScript lo detecta antes.
El Enigma del Bucle Silencioso
El bucle itera 5 veces (0-4). El operador 'continue' salta las iteraciones pares (0, 2, 4), solo concatenando los números impares 1 y 3, resultando en el string '13'.
El Enigma de la Suma Imposible
La suma de 7 + 3 es 10, que NO es igual a 4 * 4 (16). Por lo tanto, imprime "¡Ciencia!". Este ejercicio demuestra la evaluación de condiciones booleanas y cómo comparar operaciones matemáticas.
El Misterio del Operador Nullish ??
El operador ?? (nullish coalescing) solo reemplaza valores null o undefined, ¡pero NO valores falsy como 0, false o ''! A diferencia de ||, ?? preserva valores 'falsy' que son válidos. Por eso x=0 y z='', pero y='default'.
Agrupador de Palabras por Longitud
Este código agrupa palabras según su longitud usando reduce(). Crea un objeto donde las claves son las longitudes y los valores son arrays de palabras. El operador spread (...) mantiene las palabras existentes mientras añade nuevas al grupo correspondiente.
Modificación de Lista Durante Iteración
¡TRAMPA! Al modificar una lista mientras la recorres con foreach, Java lanza ConcurrentModificationException. Aunque parece que debería quedar [1, 3], el código explota en runtime. La solución correcta es usar Iterator.remove() o streams con filter.
Undefined vs Null en Optional Chaining
¡Sorpresa! Aunque u1 tiene 'undefined' explícito, u2 tiene 'null' y u3 está vacío, el operador optional chaining (?.) devuelve 'undefined' en los tres casos. PERO hay una diferencia sutil: u1.name es undefined, u2.name es null, y u3.name es undefined. El ?. corta la cadena en null/undefined y retorna undefined, ocultando la diferencia entre null y la ausencia de propiedad. Este comportamiento sorprende porque null y undefined se tratan igual con ?., pero son distintos sin él.
Closure con Async Race Condicional
El código crea un closure con estado mutable (val). Aunque setTimeout incrementa val, las Promises con resolve inmediato siempre ganan el race porque el microtask de Promise.resolve se ejecuta ANTES que el timer del macrotask. Promise.race retorna la promesa que se resuelve primero. Las 3 llamadas retornan sus valores originales porque los resolves instantáneos son más rápidos que el setTimeout de 10ms.