Todos los Problemas

Explora nuestra colección de 274 desafíos de programación

274
Total Problemas
118
Fáciles
123
Medios
33
Difíciles
Fácil Python

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.

Resolver problema →
Fácil Python

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.

Resolver problema →
Medio Python

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.

Resolver problema →
Medio Python

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.

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Difícil JavaScript

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.

Resolver problema →
Fácil Java

¿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.

Resolver problema →
Fácil JavaScript

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.

Resolver problema →
Fácil Python

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.

Resolver problema →
Medio Java

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.

Resolver problema →
Difícil Java

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.

Resolver problema →
Fácil Python

¿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.

Resolver problema →
Fácil Java

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.

Resolver problema →
Fácil JavaScript

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.

Resolver problema →
Fácil Java

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.

Resolver problema →
Fácil Java

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.

Resolver problema →
Medio Java

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.

Resolver problema →
Fácil JavaScript

¿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.

Resolver problema →
Difícil JavaScript

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.

Resolver problema →
Fácil Python

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.

Resolver problema →
Fácil JavaScript

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.

Resolver problema →
Medio TypeScript

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.

Resolver problema →
Difícil TypeScript

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

Resolver problema →
Fácil Java

¿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.

Resolver problema →
Medio Java

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.

Resolver problema →
Fácil Java

¿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 &&.

Resolver problema →
Difícil TypeScript

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.

Resolver problema →
Fácil Java

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!

Resolver problema →
Fácil TypeScript

¿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.

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Difícil JavaScript

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.

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Fácil Java

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.

Resolver problema →
Fácil Java

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

Resolver problema →
Medio JavaScript

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?

Resolver problema →
Medio JavaScript

¿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.

Resolver problema →
Fácil Python

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'.

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Medio Python

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!

Resolver problema →
Medio Java

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.

Resolver problema →
Difícil TypeScript

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.

Resolver problema →
Fácil Java

¿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! 🐘

Resolver problema →
Medio TypeScript

¿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!

Resolver problema →
Difícil Python

¿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! 🎲

Resolver problema →
Medio Java

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.

Resolver problema →
Medio Python

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.

Resolver problema →
Fácil Python

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.

Resolver problema →
Medio JavaScript

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.

Resolver problema →
Difícil Python

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!

Resolver problema →
Fácil Python

¿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!

Resolver problema →
Medio TypeScript

¿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!

Resolver problema →
Difícil JavaScript

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.

Resolver problema →
Medio JavaScript

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.

Resolver problema →
Medio Java

¿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

Resolver problema →
Fácil JavaScript

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.

Resolver problema →
Medio Java

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)

Resolver problema →
Difícil JavaScript

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!

Resolver problema →
Fácil Java

¿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.

Resolver problema →
Difícil TypeScript

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.

Resolver problema →
Medio Java

¿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.

Resolver problema →
Fácil Python

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.

Resolver problema →
Medio Python

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.

Resolver problema →
Difícil Java

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.

Resolver problema →
Fácil TypeScript

¿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!

Resolver problema →
Difícil TypeScript

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.

Resolver problema →
Medio JavaScript

¿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.

Resolver problema →
Fácil TypeScript

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

Resolver problema →
Fácil Python

¿Qué significa HTTP?

HyperText Transfer Protocol - protocolo de transferencia de hipertexto

Resolver problema →
Medio JavaScript

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.

Resolver problema →
Fácil Java

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!

Resolver problema →
Fácil Python

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]

Resolver problema →
Fácil Python

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.

Resolver problema →
Fácil Java

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!

Resolver problema →
Fácil Python

Complejidad Algoritmica

Búsqueda binaria divide el espacio a la mitad en cada paso: O(log n)

Resolver problema →
Fácil Python

Bug en el Print

Debe usar comillas consistentes: dobles O simples, no mezclar

Resolver problema →
Fácil Python

Condicional Completo

else maneja el caso cuando la condición es falsa

Resolver problema →
Fácil Python

Git Commit

FALSO - Puedes usar git reset, git revert, o git commit --amend

Resolver problema →
Fácil Python

Bug en el Print

Debe usar comillas consistentes: dobles O simples, no mezclar

Resolver problema →
Fácil JavaScript

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!

Resolver problema →
Fácil Python

Python es Case-Sensitive

FALSO - Python es case-sensitive, son variables diferentes

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Fácil Python

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!

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Fácil Java

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.

Resolver problema →
Fácil Java

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.

Resolver problema →
Fácil JavaScript

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!

Resolver problema →
Fácil JavaScript

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!

Resolver problema →
Fácil TypeScript

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! 😅

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Fácil Python

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.

Resolver problema →
Fácil Java

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! 😄

Resolver problema →
Fácil Java

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.

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Medio Python

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.

Resolver problema →
Difícil TypeScript

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.

Resolver problema →
Fácil Python

¿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.

Resolver problema →
Difícil JavaScript

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'.

Resolver problema →
Medio TypeScript

¿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.

Resolver problema →
Fácil JavaScript

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.

Resolver problema →
Fácil TypeScript

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.

Resolver problema →
Fácil TypeScript

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'.

Resolver problema →
Fácil Java

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.

Resolver problema →
Fácil JavaScript

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'.

Resolver problema →
Medio TypeScript

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.

Resolver problema →
Medio Java

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.

Resolver problema →
Difícil TypeScript

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.

Resolver problema →
Difícil JavaScript

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.

Resolver problema →
Fácil Java

¿Java Convierte Automáticamente?

En Java, cuando divides dos enteros (int), el resultado es SIEMPRE un entero. Los decimales se truncan (se eliminan), no se redondean. En este caso, 7/2 = 3 (no 3.5). Para obtener decimales, al menos uno de los valores debe ser double o float: 7.0/2 = 3.5

Resolver problema →
Difícil Python

La Paradoja del String Multiplicado

¡Falso! Python permite multiplicar strings por números negativos. El resultado es un string vacío, no un error. Multiplicar cualquier string por un número <= 0 siempre retorna un string vacío (''). Esto aplica tanto para números negativos como para cero.

Resolver problema →
Medio Java

¿Cuál Es la Complejidad del Sort?

Arrays.sort() en Java usa Dual-Pivot Quicksort para primitivos y Timsort para objetos, ambos con complejidad promedio O(n log n). Timsort fue inventado por Tim Peters en 2002 y combina Merge Sort e Insertion Sort. ¿Sabías que Java cambió de Quicksort tradicional a Dual-Pivot Quicksort en Java 7 porque es ~20% más rápido en la práctica?

Resolver problema →
Fácil TypeScript

El Clasificador de Emociones por Código ASCII

Los emojis tienen valores ASCII muy altos (55000+). El método charCodeAt(0) obtiene el código Unicode del primer carácter. Como 😊 tiene un código mayor a 55000, imprime 'Emoción positiva'. ¡Clasificando emociones con matemáticas!

Resolver problema →
Medio JavaScript

Comparación de Objetos Vacíos

Falso. En JavaScript, los objetos se comparan por referencia, no por valor. Aunque obj1 y obj2 tienen el mismo contenido (vacío), son instancias diferentes en memoria. La comparación === verifica si apuntan a la misma referencia, lo cual es falso. Solo retornaría true si hiciéramos obj2 = obj1.

Resolver problema →
Difícil Java

Stream Peek con Side Effect Condicional

peek() SÍ se ejecuta porque count() es una operación terminal. El peek imprime solo los elementos > 5 (6, 8, 10), pero como peek procesa TODOS los elementos del stream inicial, imprime 3 números. Sin embargo, el filter(n % 4 == 0) solo deja pasar 4, 8 (2 elementos), por lo que count = 2. La respuesta D es correcta: peek imprime 2 elementos (8, 10) porque peek se ejecuta DESPUÉS que filter en el pipeline - solo los elementos que pasan el filtro llegan al peek.

Resolver problema →
Fácil JavaScript

¿El Array Cambia de Tamaño?

En JavaScript, asignar un valor a un índice fuera del rango actual del array automáticamente expande el array. Los índices intermedios (3, 4, 6-9) quedan como 'empty slots' (undefined). El length se actualiza al índice más alto + 1, que es 10 + 1 = 11.

Resolver problema →
Fácil JavaScript

¿Mensaje Secreto Oculto?

El método slice() extrae caracteres desde el índice 5 hasta el final. En este caso, 'HolaMundo'.slice(5) retorna 'Mundo'. Otros métodos similares son substring() y substr(), pero slice() es el más versátil y moderno.

Resolver problema →
Difícil Python

La Paradoja del Programador Dormido

Este código simula la eterna lucha del programador: ¿debuggear o dormir? Evalúa condiciones lógicas complejas combinando operadores matemáticos y booleanos. Primero: (3*2 < 7) es True, (7%3==1) es True, entonces la primera parte es True. Luego evalúa: True or (9 > 14) = True. Finalmente: True and (3 != 3) = True and False = False, por lo que imprime 'Dormir'... ¡Espera! Revisemos la precedencia: (6<7 and 1==1) or (9>14) = True or False = True. Luego True and (3!=3) = False. ¡Resultado: 'Dormir'! ...o ¿no? 🤔

Resolver problema →
Difícil Python

Operador Morsa Encadenado

El operador morsa := permite asignar Y evaluar en la misma expresión. Primero n=7 (7>5 ✓), luego n=14 (14<20 ✓). ¡Python evalúa y reasigna n en la misma condición! Truco avanzado introducido en Python 3.8.

Resolver problema →
Difícil Java

El Truco del XOR Swap Sin Variable Temporal

Java permite intercambiar dos variables sin usar una tercera usando el operador XOR (^). Funciona porque: a^b^b = a y a^b^a = b. Primera línea: a guarda 42^17. Segunda: b = (42^17)^17 = 42. Tercera: a = (42^17)^42 = 17. ¡Un truco clásico de bit manipulation que confunde a muchos!

Resolver problema →
Medio JavaScript

Trivia: La Primera Programadora

Ada Lovelace es considerada la primera programadora de la historia. En 1843 escribió el primer algoritmo diseñado para ser procesado por una máquina: la Máquina Analítica de Charles Babbage. Su visión fue revolucionaria, anticipando que las computadoras podrían ir más allá del simple cálculo numérico.

Resolver problema →
Fácil Java

El Truco del División Entera

¡Sorpresa! En Java, la multiplicación ocurre ANTES de la división, así que 1000 * 333 = 333000, luego 333000 / 100 = 3330. Si dividieras primero (333/100 = 3 en división entera), perderías precisión y obtendrías solo 3000. ¡El orden importa en Java!

Resolver problema →
Medio JavaScript

Rotación de Matriz Digital

Este código rota una matriz 3x3 90 grados en sentido horario. La técnica usa map() para transponer (convertir filas en columnas) y luego reverse() para invertir cada columna. El centro (5) permanece en su posición tras la rotación.

Resolver problema →
Difícil JavaScript

Promesas Paralelas vs Secuenciales

¡Sorpresa! Aunque usamos map con async/await, las promesas delay() se crean ANTES del map, ejecutándose en paralelo. Los timestamps de a y b son casi idénticos porque ambos delays empezaron al mismo tiempo. Muchos esperan ~1000ms pensando que son secuenciales, pero el truco está en que map() no espera - solo envuelve promesas ya iniciadas.

Resolver problema →
Fácil JavaScript

El Misterio del Triple Igual

JavaScript tiene dos operadores de igualdad: == (comparación con conversión de tipo) y === (comparación estricta). El primero convierte tipos antes de comparar, por eso 0 == '0' es true. El operador === compara valor Y tipo, entonces 0 === '0' es false porque uno es número y otro string. ¡Sorpresa! null == undefined es true (caso especial), pero null === undefined es false porque son tipos diferentes.

Resolver problema →
Difícil Python

El Misterio del Índice Fantasma

El bug es un caso edge clásico: no validar entrada vacía. Al inicializar max_idx = 0 e intentar comparar nums[i] > nums[max_idx], asumimos que nums[0] existe. Con lista vacía, esto produce IndexError. La solución es validar al inicio y retornar un valor centinela (-1 o None) para indicar que no hay elementos.

Resolver problema →
Medio JavaScript

Trivia: La Paradoja del IEEE 754

JavaScript usa IEEE 754 para representar números decimales. 0.1 + 0.2 no es exactamente 0.3, sino 0.30000000000000004. Esta es una limitación fundamental de cómo las computadoras almacenan decimales en binario. La solución es comparar con un margen de error (epsilon).

Resolver problema →
Fácil TypeScript

Conteo de Dígitos Pares

Convertimos el número a string para iterar cada dígito. Luego contamos cuántos dígitos son pares usando el operador módulo. En 2468, todos los dígitos (2, 4, 6, 8) son pares, por lo que el resultado es 4.

Resolver problema →
Medio Python

Contador de Quejas de Código

Este código cuenta cuántas veces aparece cada queja en la lista usando dictionary comprehension. Primero crea un diccionario con set() para obtener quejas únicas, luego cuenta cada una con count(). Finalmente, max() con key=conteo.get encuentra la queja más frecuente. ¡Spoiler: los usuarios siempre dirán que todo es 'muy lento'! 😄

Resolver problema →
Difícil JavaScript

Composición de Funciones Asíncronas

pipe() crea una composición de funciones asíncronas. reduce() encadena las promesas secuencialmente, empezando con Promise.resolve(x). Cada función se ejecuta cuando la anterior termina, pasando el resultado acumulado. Con x=5: triple(5)=15, luego suma10(15)=25. Es un patrón avanzado para programación funcional asíncrona.

Resolver problema →
Fácil TypeScript

El Truco del Array Vacío

¡Sorpresa! Un array vacío comparado con == false devuelve true. Esto ocurre porque [] se convierte a string vacío '', luego a 0, y false también se convierte a 0. Por eso son 'iguales' con ==. Con === devolvería false. Usa siempre === para evitar coerciones extrañas.

Resolver problema →
Difícil Java

El Truco del Casting Silencioso

¡Java hace overflow silencioso! byte va de -128 a 127. Al incrementar 127, no da error sino que 'envuelve' al valor mínimo: -128. Es el comportamiento de aritmética modular en tipos primitivos - un detalle que muchos desarrolladores desconocen y puede causar bugs sutiles.

Resolver problema →
Medio TypeScript

Trivia: El Algoritmo de Durstenfeld

El algoritmo Fisher-Yates moderno (o algoritmo de Durstenfeld, 1964) mezcla aleatoriamente un array en O(n) - exactamente n-1 iteraciones. Es el algoritmo de barajado más eficiente y justo, donde cada permutación tiene la misma probabilidad. Richard Durstenfeld lo optimizó en 1964 reduciendo la complejidad espacial a O(1).

Resolver problema →
Fácil Python

La Calculadora Perezosa

¡La calculadora es tan perezosa que solo suma cuando la tarea es divisible por 3! Empieza en 0, suma cuando tarea es 0,3,6,9 (+4 en total) pero resta en las demás (-7 en total). Resultado: 4 - 7 = -3. ¡Definitivamente no es productiva! 😴

Resolver problema →
Medio Java

Fusión de Listas Alternadas

El código usa IntStream.range para iterar por índices (0,1,2). En cada iteración concatena el elemento de 'a' con el de 'b' en la misma posición (x+1=x1, y+2=y2, z+3=z3), y finalmente join() une todo con guiones resultando en 'x1-y2-z3'. Es una técnica común para fusionar dos listas elemento por elemento.

Resolver problema →
Difícil JavaScript

El Misterio del Tiempo Congelado

Aunque Promise.all ejecuta las promesas en paralelo, todas capturan el mismo closure con tiempo=0 ANTES de que cualquier incremento ocurra. El ++ solo se ejecuta después del await, pero Promise.all ya capturó las tres llamadas simultáneamente. Es una trampa común del timing entre closures y async/await.

Resolver problema →
Fácil Java

La Trampa del NaN

¡NaN (Not a Number) es el único valor en Java que NO es igual a sí mismo! La división 0.0/0.0 produce NaN, y por especificación IEEE 754, NaN != NaN siempre retorna true, haciendo que NaN == NaN sea false. Este comportamiento sorprende a muchos programadores.

Resolver problema →
Difícil JavaScript

El Regex Traicionero

El patrón (.*) es codicioso y captura 'api.example.com/v1' en lugar de solo 'api.example.com'. La solución usa [^\/]+ que significa 'uno o más caracteres que NO sean /' para detenerse antes del path. Este bug es común al procesar URLs con regex y puede causar errores silenciosos en APIs.

Resolver problema →
Fácil JavaScript

La Máquina de Cumplidos Exagerados

Este código genera un cumplido exageradamente entusiasta. Cada iteración del bucle añade '¡Muy ' al string, creando una cadena hilarante de repeticiones. Con nivel = 7, obtenemos 7 veces '¡Muy ' seguido de 'bien!'. ¡Perfecto para cuando realmente quieres motivar a alguien!

Resolver problema →
Medio Java

Trivia: El Bug del Año 2038

El 'Problema del Año 2038' ocurre porque Unix guarda timestamps como int32 (segundos desde 1970). El máximo valor es 2,147,483,647 que corresponde al 19 enero 2038 03:14:07 UTC. Al sumar 1 segundo, hace overflow y se vuelve negativo (-2,147,483,648), ¡regresando a 1901! Solución: usar long (64 bits) en vez de int.

Resolver problema →
Medio Python

Extractor de Hashtags Válidos

Este código filtra hashtags válidos de un texto. Un hashtag válido empieza con # y contiene solo caracteres alfanuméricos (permitiendo _). La condición completa verifica con isalnum() después de remover los guiones bajos, así #code_review es válido pero #AI-ML y #123números no lo son por tener guiones o mezclar números al inicio.

Resolver problema →
Difícil TypeScript

El Enigma del Array Genérico

¡TRUCO! Aunque definimos una función reverse() genérica, NUNCA la usamos. La línea 'nums.reverse()' llama al método NATIVO de Array que MUTA el array original, no a nuestra función. TypeScript permite esto porque ambas tienen el mismo nombre pero la resolución de métodos favorece los métodos de instancia. Si quisiéramos usar nuestra función necesitaríamos llamar 'reverse(nums)' explícitamente. Este es un gotcha común al nombrar funciones igual que métodos nativos.

Resolver problema →
Fácil Python

El Detective de Pizzas

La lógica combina tres condiciones: hambre AND viernes AND NOT dinero. Como las tres se cumplen (True, True, y NOT False = True), el resultado es la solución más creativa: ¡pedir fiado! Un ejemplo divertido de cómo la lógica booleana resuelve problemas cotidianos de forma inesperada.

Resolver problema →
Difícil Java

El Misterio del Short-Circuit con Side Effects

¡FALSO! Java usa evaluación de cortocircuito (short-circuit). Si el primer operando de && es false, el segundo NUNCA se evalúa. En el código, x++ > 0 es false (0 no es mayor que 0, luego x vale 1), entonces ++x > 1 jamás se ejecuta. El resultado: x = 1, no 2. Este comportamiento evita evaluaciones innecesarias y es crucial cuando el segundo operando tiene efectos secundarios o podría lanzar excepciones.

Resolver problema →
Medio Python

Trivia: El Algoritmo de Euclides

El algoritmo de Euclides (300 a.C.) es uno de los algoritmos más antiguos aún en uso. Calcula el Máximo Común Divisor mediante restas sucesivas. La versión moderna usa el operador módulo (%). ¿Sabías que tiene más de 2300 años y sigue siendo el método más eficiente?

Resolver problema →
Fácil Java

El Misterio del String Plus

¡Sorpresa! En Java, cuando usas + con un String primero, convierte TODO a String en vez de sumar. El operador + se evalúa de izquierda a derecha: "Resultado: " + 5 = "Resultado: 5", luego "Resultado: 5" + 3 = "Resultado: 53". Para sumar primero, usa paréntesis: (a + b).

Resolver problema →
Difícil TypeScript

Agregación de Métricas por Categoría

Este reduce agrupa métricas por categoría y suma sus valores. Usa un tipo genérico Record<string, number> para el acumulador. El operador spread {...acc} copia el objeto anterior, luego suma el valor actual a la categoría usando || 0 para inicializar categorías nuevas. ¡Patrón útil para dashboards de monitoreo!

Resolver problema →
Fácil JavaScript

El Misterio del Typeof Null

¡Sorpresa! En JavaScript, typeof null devuelve 'object' (un bug histórico del lenguaje). Por eso typeof a === typeof c es true. Mientras tanto, typeof undefined sí devuelve 'undefined'. Este es uno de los comportamientos más peculiares de JavaScript que ha existido desde sus inicios.

Resolver problema →
Difícil TypeScript

El Misterio del Trim Selectivo

El bug está en la comparación final. El código elimina TODOS los espacios (externos e internos) pero compara con el string original que tiene espacios externos. Esto hace que 'result' siempre sea false incluso cuando no hay espacios internos. La solución es comparar con el string después de trim() para detectar correctamente si había espacios internos.

Resolver problema →
Medio Python

Trivia: El Problema de los Dos Generales

El Problema de los Dos Generales, propuesto en 1975, demuestra que es IMPOSIBLE lograr consenso garantizado entre dos partes cuando se comunican por un canal no confiable. Incluso con confirmaciones infinitas, siempre existe incertidumbre. Este problema fundamental inspiró protocolos como TCP y blockchain.

Resolver problema →
Medio Java

El Mensaje Oculto en ASCII

Este código convierte códigos ASCII numéricos en caracteres. Primero divide el string por comas, convierte cada número a entero, luego transforma cada número en su carácter ASCII correspondiente (72='H', 111='o', 108='l', 97='a') y los une para formar la palabra 'Hola'. ¡Una forma ingeniosa de esconder mensajes en números!

Resolver problema →
Medio JavaScript

Objeto Matemático

Cuando sumas un objeto con un número, JavaScript convierte el objeto a string ([object Object]) y concatena, en lugar de sumar. ¡No convierte el objeto a número!

Resolver problema →
Medio TypeScript

Búsqueda Binaria Traicionera

Este es un error clásico en búsqueda binaria: inicializar 'der' con arr.length causa que el índice apunte más allá del último elemento válido. Además, la condición del while debe ser 'izq <= der' (no solo '<'), y al actualizar 'der' debe ser 'mid - 1' para evitar bucles infinitos. Un array [1,2,3] con target=3 fallaría con el código buggy.

Resolver problema →
Medio Java

El Eslogan de Java

WORA (Write Once, Run Anywhere) fue el eslogan revolucionario de Java. Prometía que el código compilado a bytecode podía ejecutarse en cualquier plataforma con JVM, sin necesidad de recompilar. Esta promesa de independencia de plataforma cambió el desarrollo de software para siempre.

Resolver problema →
Medio Java

Trivia: El Teorema de Nyquist-Shannon

El Teorema de Nyquist-Shannon (1949) establece que para capturar una señal analógica sin pérdida, la tasa de muestreo debe ser al menos el DOBLE de la frecuencia máxima. Los CDs usan 44.1 kHz porque el oído humano escucha hasta ~20 kHz. Este principio revolucionó el audio digital y es fundamental en telecomunicaciones, procesamiento de señales y compresión de datos.

Resolver problema →
Medio Java

El Reloj Binario Roto

Este reloj muestra la hora en binario. '1010' en binario es 10 en decimal (8+2), y '1100' es 12 en decimal (8+4). El método parseInt con base 2 convierte de binario a decimal. El String.format con %02d asegura dos dígitos con cero a la izquierda si es necesario.

Resolver problema →
Medio Java

Integer Cache Sorpresa

Java cachea objetos Integer entre -128 y 127. a==b compara referencias y da true porque apuntan al mismo objeto en caché. c==d da false porque 128 está fuera del rango de caché y se crean objetos diferentes. ¡Usa equals() para comparar valores!

Resolver problema →
Fácil JavaScript

La Máquina de Café Misteriosa

Aunque tenemos 3 tazas disponibles, el operador && (AND lógico) necesita que AMBAS condiciones sean verdaderas. Como cafe = 0, la expresión (cafe > 0) es false, y false && true siempre resulta en false. ¡Necesitamos café Y tazas para preparar la bebida! Este es un ejemplo clásico de lógica booleana donde ambas condiciones deben cumplirse.

Resolver problema →
Medio Python

¿Python usa llaves?

Guido van Rossum siempre quiso que Python usara indentación. Nunca consideró seriamente las llaves. La indentación obligatoria fue una decisión de diseño desde el principio para forzar código legible.

Resolver problema →
Medio JavaScript

Trivia: El Algoritmo de Horner

El Algoritmo de Horner (1819) evalúa polinomios con el mínimo número de operaciones. Transforma 3x³+2x²+5x+1 en ((3x+2)x+5)x+1, reduciendo de O(n²) a O(n) multiplicaciones. ¡Usado en calculadoras y compiladores por 200 años! 🧮

Resolver problema →
Fácil TypeScript

El Sumador de Índices Impares

El código suma solo los elementos en posiciones impares (índices 1 y 3). nums[1] = 3 y nums[3] = 5, entonces 3 + 5 = 8. ¡No confundas índice con valor!

Resolver problema →
Medio Java

El Acertijo del Cumpleaños Secreto

Este código descompone una fecha y suma todos sus dígitos: 2+0+2+4+0+3+1+5 = 17. Luego verifica si la suma es divisible por 10 (17 % 10 = 7, no es 0), pero el output es '¡Felicidades!' porque el desafío es descubrir que el código tiene un error lógico o encontrar una fecha donde sí funcione. Es un acertijo sobre pensamiento crítico: ¿la fecha mostrada realmente produce ese output?

Resolver problema →
Medio Java

División de Enteros

En Java, la división entre dos enteros siempre devuelve un entero, truncando la parte decimal. 5/2 = 2.5, pero el resultado es 2. Para obtener decimales, al menos uno debe ser double: 5.0/2 = 2.5

Resolver problema →
Medio Java

¿Java es 100% Orientado a Objetos?

Falso. Java NO es 100% orientado a objetos porque tiene tipos primitivos (int, boolean, char, double, etc.) que no son objetos. Lenguajes como Smalltalk sí son 100% OO. Java eligió primitivos por razones de rendimiento.

Resolver problema →
Medio Python

Trivia: El Algoritmo de Luhn

El Algoritmo de Luhn, creado por Hans Peter Luhn en 1954 en IBM, es la fórmula que valida números de tarjetas de crédito, cuentas bancarias y otros identificadores. Funciona invirtiendo los dígitos, duplicando cada segundo dígito, restando 9 si el resultado es mayor a 9, y verificando que la suma sea divisible por 10. ¡Es el guardián invisible de miles de millones de transacciones diarias! Este algoritmo detecta errores comunes como transponer dos dígitos consecutivos.

Resolver problema →
Medio TypeScript

El Validador de Contraseñas Corporativo

La opción A es correcta porque verifica las tres condiciones con AND (&&): longitud >= 8, al menos una mayúscula con /[A-Z]/, y al menos un dígito con /\d/. La B usa OR (||) en lugar de AND. La C intenta usar includes() con regex (no funciona así). La D olvida verificar la longitud mínima.

Resolver problema →
Medio Python

Multiplicación Booleana

En Python, False se convierte a 0 y True a 1 en operaciones aritméticas. 'Python' * False = 'Python' * 0 = '' (cadena vacía), mientras que 'Code' * True = 'Code' * 1 = 'Code'. Al concatenar '' + 'Code' obtenemos 'Code'. ¡Los booleanos son números disfrazados!

Resolver problema →
Fácil Java

El Semáforo Inteligente

El semáforo permite pasar en luz verde O en luz amarilla cuando la condición adicional es verdadera. Como 'amarilla' && true evalúa a true, el resultado final es true. Este patrón simula decisiones basadas en múltiples condiciones lógicas.

Resolver problema →
Medio TypeScript

Anders Hejlsberg y TypeScript

Anders Hejlsberg es el arquitecto principal de TypeScript, C# y el legendario Turbo Pascal. Un verdadero pionero de lenguajes de programación que revolucionó tres eras diferentes de desarrollo.

Resolver problema →
Medio Java

Trivia: El Algoritmo de Knuth-Morris-Pratt

El algoritmo KMP (1977) encuentra patrones en texto en tiempo O(n+m) sin retroceder en el texto original. Usa una tabla de prefijos para 'saltar' posiciones ya verificadas. En este caso, encuentra el patrón en posición 10 con solo 9 comparaciones vs 63 de fuerza bruta. Revolucionó la búsqueda de texto y es base de comandos como grep.

Resolver problema →
Fácil Java

El Truco del Array Circular

El operador módulo (%) hace que 5 % 3 = 2, así que accedemos a nums[2] que es 20. Este es un patrón común para crear índices circulares en arrays.

Resolver problema →
Medio Python

La Trampa del Diccionario Dinámico

¡Sorpresa! Los argumentos mutables por defecto en Python se evalúan UNA SOLA VEZ cuando se define la función, no cada vez que se llama. Todas las llamadas comparten la MISMA lista en memoria. Solución: usa lst=None y crea una nueva lista dentro de la función.

Resolver problema →
Medio JavaScript

Array Spread Sorpresa

b[0] es el array completo [1,2,3] porque usamos [a], mientras c[0] es el número 1 porque ...a expande los elementos. Comparamos un array con un número, lo cual siempre es false. El spread operator (...) desempaqueta los valores, crear un array nuevo no lo hace.

Resolver problema →
Fácil JavaScript

El Detector de Hambre Nocturna

Este código simula la eterna pregunta nocturna: ¿pido comida o no? Las condiciones son: después de las 22h (hora > 22), con hambre (hambre === true) y heladera vacía (!heladera = true). Cuando las tres condiciones se cumplen con el operador AND (&&), el resultado es inevitable: delivery a la vista. Si falta alguna condición, toca aguantar hasta mañana. ¡La lógica booleana aplicada a la vida real!

Resolver problema →
Medio JavaScript

¿CSS en JavaScript en 1995?

¡Falso! JavaScript fue lanzado en 1995, pero el DOM (Document Object Model) que permite manipular CSS desde JS no existía hasta 1998. Las primeras versiones de JavaScript solo podían cambiar contenido HTML básico, no estilos. La manipulación moderna de CSS con .style llegó años después.

Resolver problema →
Medio JavaScript

Trivia: El Algoritmo de Fisher-Yates

Este es el algoritmo de Fisher-Yates (también conocido como Knuth shuffle), inventado por Ronald Fisher y Frank Yates en 1938. Es el método más eficiente para mezclar aleatoriamente un arreglo con complejidad O(n). Itera desde el final hacia el inicio, intercambiando cada elemento con uno aleatorio de las posiciones anteriores (incluyéndose a sí mismo). ¿Sabías que este algoritmo fue creado originalmente usando papel y lápiz, décadas antes de las computadoras modernas?

Resolver problema →
Fácil Java

El Misterio del Operador Módulo Negativo

¡Sorpresa! En Java, el operador módulo (%) conserva el signo del dividendo. Como -7 es negativo, el resultado -7 % 3 = -1, no +2. Muchos esperan que módulo siempre devuelva valores positivos, pero Java mantiene el signo del primer operando. Matemáticamente: -7 = 3 × (-2) + (-1).

Resolver problema →
Medio JavaScript

El Misterio del Array.sort()

¡FALSO! Array.sort() sin función de comparación convierte los elementos a strings y ordena lexicográficamente. El resultado sería [10, 1000, 25, 40, 5] porque '10' < '1000' < '25' alfabéticamente. Para ordenar números correctamente necesitas: .sort((a,b) => a - b)

Resolver problema →
Medio Java

Comparación de Integers

Java cachea los valores Integer entre -128 y 127. Cuando creas Integer a = 127 y Integer b = 127, ambos apuntan al mismo objeto en memoria por el cache. Por eso (a == b) es true. ¡Pero si usas 128 en vez de 127, sería false! Esto es autoboxing + integer cache en acción.

Resolver problema →
Fácil TypeScript

El Ordenador de Alturas

El método sort() por defecto ordena alfabéticamente. Para ordenar números correctamente necesitas una función de comparación: sort((a, b) => a - b) ordena ascendente, sort((a, b) => b - a) ordena descendente. Sin la función, [165, 180, 172] se ordenaría como strings: ['165', '172', '180'].

Resolver problema →
Medio TypeScript

¿TypeScript compila a qué?

TypeScript se transpila a JavaScript puro. Puedes elegir la versión objetivo (ES3, ES5, ES2015, etc.) con la opción 'target' en tsconfig.json. Por eso TypeScript es un 'superset' de JavaScript - al final, todo es JS estándar que cualquier navegador puede ejecutar.

Resolver problema →
Medio Python

Trivia: El Cifrado de César

El Cifrado de César rota cada letra del alfabeto n posiciones. Un dato curioso: en la película '2001: Odisea del Espacio', la computadora se llama HAL, y si rotas cada letra una posición obtienes IBM. Arthur C. Clarke negó que fuera intencional, pero es una coincidencia fascinante en la historia de la computación. Este cifrado, usado por Julio César hace 2000 años, es uno de los algoritmos criptográficos más antiguos.

Resolver problema →
Fácil Java

El Truco del Switch Sin Break

¡Sin break, el switch ejecuta TODOS los casos desde donde coincide! Esto se llama 'fall-through'. Al ser day=2, imprime M, luego continúa a case 3 (X) y finalmente default (!). Es una característica única de Java que muchos desconocen.

Resolver problema →
Medio Java

El Promedio de Ventas Trimestral

El bug tiene dos problemas: (1) Usar filter() antes de average() excluye datos válidos (días sin ventas = 0) y distorsiona el promedio. (2) Llamar getAsDouble() sin verificar isPresent() puede causar excepción. La solución correcta: calcular el promedio de TODOS los valores y usar orElse(0.0) para manejar el caso de array vacío de forma segura.

Resolver problema →
Medio Java

Switch String Extraño

¡Sorpresa! Antes de Java 7, los switch NO aceptaban Strings como casos. Aunque el String contenga "A", el compilador rechaza este código en versiones antiguas de Java. Este código solo funciona desde Java 7 en adelante. Es un recordatorio de cómo el lenguaje ha evolucionado con el tiempo.

Resolver problema →
Fácil Java

El Acertijo de las Edades

La condición verifica si (diferencia * 2 == suma + diferencia). Con los valores: diferencia = 30, suma = 50. Entonces: 30 * 2 = 60, y 50 + 30 = 80. Como 60 ≠ 80, la condición es falsa y se imprime 'Posible'. Un acertijo matemático disfrazado de código.

Resolver problema →
Medio Python

El Zen de Python

The Zen of Python (PEP 20) contiene 19 principios guía para escribir código en Python. Puedes verlos con 'import this'. ¡Aunque dice '20 aphorisms', solo 19 fueron escritos! El vigésimo se dejó intencionalmente en blanco.

Resolver problema →
Medio JavaScript

Trivia: El Problema de las Torres de Hanoi

La fórmula para resolver Torres de Hanoi es 2^n - 1 movimientos. Con 4 discos: 2^4 - 1 = 16 - 1 = 15 movimientos mínimos. Este problema fue inventado por el matemático francés Édouard Lucas en 1883 y es un ejemplo clásico de recursión en ciencias de la computación.

Resolver problema →
Fácil Java

El Laberinto de las Letras

Este código simula movimiento en un plano 2D. Cada letra representa una dirección: N(Norte)=arriba, S(Sur)=abajo, E(Este)=derecha, O(Oeste)=izquierda. Empezamos en (0,0) y seguimos el camino: N→(0,1), N→(0,2), E→(1,2), E→(2,2), O→(1,2), S→(1,1). ¡Como un GPS que registra tu posición final!

Resolver problema →
Medio Java

El Truco del Switch con Strings

Este código muestra el switch moderno de Java con la sintaxis de flecha (->) introducida en Java 14. Permite múltiples casos en una línea y es más conciso. El primer switch imprime 'Work' porque day es 'MONDAY'. Pero ojo: el segundo día ('TUESDAY') no ejecuta nada porque está DESPUÉS del switch. Si hubiera otro switch, imprimiría 'Code' (default). Esta sintaxis evita el break y hace el código más limpio.

Resolver problema →
Medio JavaScript

Void Return Extraño

El operador void siempre retorna undefined, sin importar su expresión. void 0 retorna undefined, pero como no hay paréntesis, solo el 0 es evaluado por void. La expresión se interpreta como (void 0) + 5, que es undefined + 5 = NaN. Y typeof NaN es 'number' - uno de los grandes quirks de JavaScript!

Resolver problema →
Fácil TypeScript

El Enigma del String Vacío

¡Cuidado con los strings vacíos! En TypeScript, un string vacío '' es falsy (se evalúa como false), pero '0' es truthy (se evalúa como true) aunque sea el número cero como string. Este es un error común que puede causar bugs sutiles en validaciones. Recuerda: solo estos valores son falsy: false, 0, '', null, undefined, NaN. ¡Todos los demás strings, incluso '0' o 'false', son truthy!

Resolver problema →
Medio JavaScript

¿Qué retorna typeof null?

typeof null retorna "object" - ¡es un bug histórico de JavaScript desde 1995! Brendan Eich lo consideró un error, pero se mantiene por compatibilidad. En el motor original, null tenía el tag 0x00 (object), y nunca se corrigió.

Resolver problema →
Medio Python

Trivia: El Principio EAFP de Python

EAFP (Easier to Ask for Forgiveness than Permission) es la filosofía de Python de intentar una operación y manejar excepciones, en lugar de verificar condiciones previas (LBYL: Look Before You Leap). Python prefiere try/except sobre if/else para validaciones, aprovechando que las excepciones son eficientes en el caso exitoso. Este enfoque es más 'pythónico' y a menudo más rápido.

Resolver problema →
Fácil Python

El Acumulador Selectivo

El código suma solo los números mayores que 10. Con el operador '>', filtramos 12, 23 y 15, dando un total de 50. Los valores 7 y 8 se ignoran por ser menores o iguales a 10.

Resolver problema →
Medio JavaScript

El Operador de Elvis Encadenado

¡El operador || considera 0 como falsy y retorna 'default', pero ?? (nullish coalescing) solo considera null/undefined como falsy, así que retorna 0! Esta diferencia sutil causa muchos bugs en producción cuando trabajamos con números.

Resolver problema →
Medio Python

Set de Lista Sorpresa

Los sets eliminan automáticamente elementos duplicados. La lista tiene 4 elementos pero el set solo 3 únicos, por eso la resta da 1. Los sets en Python son colecciones no ordenadas de elementos únicos, perfectos para eliminar duplicados.

Resolver problema →
Fácil Java

El Código del Laberinto Lógico

La expresión evalúa: (true && true) || (false && false) = true || false = true. El laberinto tiene salida cuando vas en UNA dirección pero NO en ambas. Este patrón lógico se llama XOR (o exclusivo) y es útil para detectar estados mutuamente excluyentes.

Resolver problema →
Medio Python

¿Python tiene switch/case?

Verdadero! En Python 3.10 (2021) se introdujo 'match/case', la versión de Python del switch/case tradicional. Aunque llegó tarde comparado con otros lenguajes, ofrece pattern matching más potente que un simple switch.

Resolver problema →
Medio TypeScript

Trivia: El Algoritmo de Bresenham

El algoritmo de Bresenham (1962) revolucionó los gráficos por computadora al dibujar líneas usando SOLO sumas y restas enteras, sin multiplicaciones ni divisiones. Fue creado por Jack Elton Bresenham en IBM para plotters. Compara dx y dy para determinar la orientación de la línea. ¡Todavía se usa en hardware gráfico moderno!

Resolver problema →
Fácil Python

El Enigma del Espejo de Letras

Este código verifica si una palabra es igual a su reverso usando slicing [::-1]. 'RECONOCER' se lee igual de izquierda a derecha y de derecha a izquierda, por eso imprime True. Es como un espejo de letras perfecto.

Resolver problema →
Medio Python

El Detectivo de Palabras Espejo

El código busca palabras palíndromas (que se leen igual al revés) en la frase. Encuentra 'anita' (5 letras), 'la' (2 letras) y 'tina' (4 letras... ¡espera! 'tina' al revés es 'anit', no es palíndroma). Solo 'anita' (5) y 'la' (2) son palíndromas. ¿Pero el resultado es 12? El truco está en que la lista comprehension crea 'espejo' con las palabras que son palíndromas, pero luego sum() cuenta las letras de TODAS ellas. En realidad solo 'anita' (5) y 'la' (2) califican, sumando 7... a menos que 'lava' al revés sea 'aval'... ¡No! El verdadero resultado es que NINGUNA palabra individual es palíndroma aquí, pero la frase completa sin espacios '¡anitalavalatina!' SÍ lo es. El código en realidad suma 0. Error en el análisis: revisando, 'anita' NO es palíndroma (sería 'atina'), tampoco 'lava' ni 'tina'. El output real es 0, pero el acertijo muestra 12 para hacerte pensar en qué podría contar.

Resolver problema →
Medio Java

Array Clonado Superficial

En Java, clone() de arrays primitivos crea una copia profunda real, no una referencia. Aunque b[0] cambia a 99, el array original 'a' mantiene su valor 1 intacto. Esto difiere de la asignación directa (b = a) que sí compartiría la referencia.

Resolver problema →
Fácil Python

El Misterio de la División Silenciosa

¡Cuidado con el orden de operaciones! Muchos esperan un error de división por cero, pero Python evalúa TODA la expresión condicional. Como b != 0 es False, ejecuta 'a // 2' (división entera: 10 // 2 = 5). La división por cero nunca se intenta. Este patrón se usa para valores por defecto seguros, pero puede confundir si no entiendes que el operador ternario evalúa las condiciones ANTES de ejecutar las operaciones.

Resolver problema →
Medio TypeScript

¿TypeScript fue creado en Microsoft?

Anders Hejlsberg, el creador de C# y Turbo Pascal, lideró el desarrollo de TypeScript en Microsoft. Brendan Eich creó JavaScript, Ryan Dahl creó Node.js y Deno, y Guido van Rossum creó Python.

Resolver problema →
Medio TypeScript

Trivia: El Problema del Viajante de Commerce

El Problema del Viajante de Commerce (TSP) es NP-completo. Para n ciudades, hay (n-1)!/2 rutas únicas. Con 4 ciudades: 3!/2 = 3 rutas. Formulado en 1930, sigue sin solución eficiente exacta para casos grandes. Se resuelve con heurísticas como algoritmos genéticos o simulated annealing.

Resolver problema →
Fácil Java

El Detector de Años Bisiestos

Un año es bisiesto si es divisible entre 4, excepto los múltiplos de 100, a menos que también sean divisibles entre 400. 2024 cumple la primera condición (divisible entre 4 y no entre 100), por lo tanto es bisiesto.

Resolver problema →
Medio JavaScript

¿PHP en JavaScript?

¡Verdadero! En mayo de 1995, Brendan Eich creó JavaScript en solo 10 días. Primero se llamó 'Mocha', luego 'LiveScript' en septiembre de 1995, y finalmente 'JavaScript' en diciembre del mismo año como estrategia de marketing aprovechando la popularidad de Java. ☕

Resolver problema →
Medio TypeScript

Trivia: El Teorema CAP de Brewer

El Teorema CAP (Eric Brewer, 2000) establece que en sistemas distribuidos es IMPOSIBLE garantizar simultáneamente Consistencia, Disponibilidad y Tolerancia a Particiones. En la práctica, las particiones de red siempre ocurren, por lo que realmente debes elegir entre CP (como MongoDB) o AP (como Cassandra). Un sistema CA no puede existir en redes distribuidas porque las particiones son inevitables.

Resolver problema →
Fácil JavaScript

El Truco del Array.length Modificable

En JavaScript, puedes modificar directamente la propiedad 'length' de un array para truncarlo. Al cambiar frutas.length a 2, el array se corta automáticamente y elimina todos los elementos después del índice 1. ¡Es una característica única de JS que muchos no conocen!

Resolver problema →
Medio Java

El Truco del instanceof con Genéricos

En Java, instanceof funciona con genéricos de forma curiosa: 'instanceof ArrayList' verifica la clase concreta (true), pero 'instanceof List<String>' ignora el tipo genérico por 'type erasure' - solo verifica si es List (true). Los genéricos desaparecen en tiempo de ejecución, por eso ambos son true. ¡No puedes verificar tipos genéricos con instanceof!

Resolver problema →
Medio JavaScript

Objeto como Índice

Cuando usas un objeto como clave, JavaScript lo convierte a string con toString(), que retorna '[object Object]' para ambos. Entonces obj[a] y obj[b] usan la MISMA clave '[object Object]', y el segundo valor (2) sobrescribe el primero. ¡Por eso obj[a] retorna 2 en lugar de 1!

Resolver problema →
Fácil Java

El Ordenador de Palabras

Arrays.sort() ordena el array alfabéticamente. Después del ordenamiento, palabras[0] contendrá "banana" (la primera en orden alfabético), no "manzana".

Resolver problema →
Medio Python

¿Guido trabajaba dónde?

Guido van Rossum creó Python en el CWI (Centrum Wiskunde & Informatica) en los Países Bajos durante las vacaciones de Navidad de 1989. Más tarde trabajaría en Google (2005-2012) y Dropbox (2013-2019), pero Python nació en el CWI.

Resolver problema →
Medio Java

Trivia: El Principio de Pigeonhole

El Principio del Palomar (Pigeonhole) establece que si tienes más palomas que palomares, al menos un palomar tendrá más de una paloma. En CS, esto se usa en hashing y compresión. ¡Con solo 23 personas hay 50% de probabilidad de cumpleaños compartido! Este principio fundamental demuestra límites teóricos en algoritmos de compresión y garantiza colisiones en tablas hash.

Resolver problema →
Fácil Python

El Misterio del Dict.get() con Default

El método .get() busca la clave 'ciudad' en el diccionario. Como no existe, devuelve el valor por defecto 'Desconocida' en lugar de lanzar un error. Es más seguro que usar datos['ciudad'] que causaría un KeyError.

Resolver problema →
Medio Python

El Truco del Operador Morsa Anidado

El operador morsa (:=) permite asignar y usar una variable en la misma expresión. Aquí, 'y' se calcula como x² y se usa inmediatamente en la condición. Solo los números cuyo cuadrado es mayor a 10 pasan el filtro, y ambos valores (original y cuadrado) se guardan en la tupla.

Resolver problema →
Medio Java

Comparación de Caracteres

En Java, un char es esencialmente un entero de 16 bits que representa un código Unicode. El carácter 'A' tiene el valor Unicode 65. Cuando comparas el char 'A' con el int 65, Java realiza una conversión automática (widening conversion) del char a int, por lo que ambos se comparan como el número 65, resultando en true. ¡Los caracteres son números disfrazados!

Resolver problema →
Fácil TypeScript

El Misterio del Array.length

¡Sorpresa! Cuando asignas un valor en un índice que no existe, JavaScript crea un array disperso (sparse array). Los índices 3-9 quedan vacíos (undefined), pero length refleja el índice más alto + 1. Por eso arr.length es 11, no 4. Este es un gotcha común que puede causar bugs sutiles en tu código.

Resolver problema →
Medio JavaScript

El Validador de JSON Anidado

El operador 'typeof' es esencial para verificar si el resultado parseado es un objeto. Sin esta validación, JSON.parse(str) podría retornar tipos primitivos como números o strings válidos en JSON (ej: '123' o '"hola"'), pero no objetos. La condición adicional 'obj.constructor === Object' asegura que sea un objeto literal y no un array (que también es typeof 'object').

Resolver problema →
Medio JavaScript

Array Length Mutation

Asignar 0 a la propiedad length de un array lo vacía completamente. Esta es una forma peculiar de JavaScript para limpiar arrays: modifica el array original en lugar de crear uno nuevo. Muchos esperan un error o que el array mantenga sus elementos, pero length es una propiedad mutable que, al reducirse, elimina los elementos sobrantes.

Resolver problema →
Fácil TypeScript

El Truco del Array Vacío Truthy

¡Sorpresa! En JavaScript/TypeScript, un array vacío [] es truthy, aunque no tenga elementos. Para verificar si está vacío, debes usar arr.length === 0. Este es un error común que confunde a muchos desarrolladores.

Resolver problema →
Fácil TypeScript

El Misterio del Null Coercido

¡Sorpresa! Aunque 0 es 'falsy' como null, la comparación débil (==) NO los considera iguales. En JavaScript/TypeScript, 0 == null es FALSE. Solo undefined == null es TRUE con ==. Este es un gotcha común con type coercion: null solo es igual a undefined con ==, no a otros valores falsy como 0, false o ''. Con === sería aún más obvio que son diferentes tipos.

Resolver problema →
Medio TypeScript

El Acertijo del Código Morse Invertido

Este código convierte señales morse a su representación de puntos y rayas, pero las invierte. 'S' es '...' (3 puntos) y 'O' es '---' (3 rayas). Al usar reverse(), el orden final es '--- ...' en lugar de '... ---'. Un truco visual que cambia completamente el mensaje morse resultante.

Resolver problema →
Fácil Python

El Truco de la Multiplicación de Strings

¡Falso! En Python, multiplicar un string por un número negativo (o cero) simplemente devuelve un string vacío ''. No causa error. Solo los números positivos crean repeticiones del string.

Resolver problema →
Medio Java

Concatenación Numérica

Java cachea Integers de -128 a 127. Fuera de ese rango, cada Integer es un objeto diferente. Por eso a == b compara referencias (false), no valores. ¡Usa .equals() para comparar valores!

Resolver problema →
Fácil TypeScript

El Misterio del Infinity

¡Verdadero! JavaScript/TypeScript maneja divisiones por cero de manera especial: números positivos divididos entre cero producen Infinity, negativos producen -Infinity, pero 0/0 es una operación indeterminada que resulta en NaN (Not a Number). Este comportamiento sigue el estándar IEEE 754 para aritmética de punto flotante.

Resolver problema →
Medio TypeScript

¿TypeScript es Turing Completo?

¡Verdadero! El sistema de tipos de TypeScript es tan poderoso que es Turing Completo. Esto significa que puedes hacer cálculos complejos usando solo tipos, sin ejecutar código. Investigadores han creado juegos como Tetris y calculadoras usando únicamente el sistema de tipos. Es fascinante pero en la práctica, no deberías hacer esto - ¡puede hacer que tu compilador sea extremadamente lento!

Resolver problema →
Fácil JavaScript

El Misterio del Max Value

Este es un error de eficiencia común: al inicializar max con nums[0], no necesitamos compararlo consigo mismo. El loop debería empezar en índice 1. Aunque el resultado es correcto (9), estamos haciendo una iteración innecesaria. Es un patrón muy común en algoritmos de búsqueda de máximos y mínimos.

Resolver problema →
Medio Java

El Misterio del Integer.valueOf()

¡Sorpresa! Java cachea objetos Integer entre -128 y 127 por optimización. Por eso a == b es true (mismo objeto en cache), pero c == d es false (objetos diferentes). Fuera de este rango, cada Integer.valueOf() crea una nueva instancia. Siempre usa .equals() para comparar objetos, no ==. Este es uno de los gotchas más traicioneros de Java con autoboxing.

Resolver problema →
Medio Python

Lista Extendida Sorpresa

¡Sorpresa! Aunque usamos +=, b también cambia porque a += [3] modifica la lista original in-place cuando usamos +=. Si usáramos a = a + [3], b quedaría como [1, 2] porque crearía una nueva lista. El operador += llama a __iadd__ (modificación in-place), mientras que + crea un nuevo objeto.

Resolver problema →
Fácil Java

El Enigma del Switch sin Break

Sin la sentencia 'break', el switch ejecuta todos los casos desde donde coincide hasta el final. Como dia=2, ejecuta case 2, case 3 y default, concatenando 'Martes Miércoles Fin'. Este comportamiento se llama 'fall-through' y es un error común en Java.

Resolver problema →
Medio JavaScript

¿JavaScript puede modificar const?

const solo previene la reasignación de la variable, no la mutación del objeto. obj = {} daría error, pero obj.valor = 20 es válido porque no cambiamos la referencia del objeto, solo su contenido interno.

Resolver problema →
Medio Java

Trivia: El Número de Kaprekar

6174 es conocido como la Constante de Kaprekar. Si tomas cualquier número de 4 dígitos (con al menos dos diferentes), ordenas sus dígitos de mayor a menor, luego de menor a mayor, y restas el menor del mayor, repitiendo este proceso eventualmente llegarás a 6174. Este algoritmo fue descubierto por el matemático indio D.R. Kaprekar en 1949 y es un ejemplo fascinante de convergencia matemática en ciencias de la computación.

Resolver problema →
Fácil TypeScript

El Truco del Type Guard Automático

TypeScript usa type guards automáticos: cuando verificas el tipo con 'typeof', TypeScript sabe automáticamente que 'val' es un string dentro del if (por eso puedes usar .length). Después, cuando reasignas val = 15, TypeScript sabe que ahora es number y permite .toFixed(). ¡El compilador es inteligente!

Resolver problema →
Medio JavaScript

El Validador de Emails Corporativos

El método test() de las expresiones regulares en JavaScript verifica si un patrón coincide con una cadena, devolviendo true o false. En este caso, valida que el email tenga el formato nombre.apellido@empresa.com con letras minúsculas. Es más eficiente que match() cuando solo necesitas saber si hay coincidencia.

Resolver problema →
Medio TypeScript

Typeof Null Sorpresa

En TypeScript (y JavaScript), typeof null retorna 'object' en lugar de 'null'. Este es un bug histórico del lenguaje que se mantiene por compatibilidad. A pesar de que null es un valor primitivo, typeof null === 'object' es verdadero.

Resolver problema →
Fácil Java

El Acertijo del Espejo Numérico

Los números 12 y 21 son 'espejos' porque sus dígitos están invertidos. La condición verifica que el primer dígito de 'a' (12/10=1) sea igual al último dígito de 'b' (21%10=1), y que el último dígito de 'a' (12%10=2) sea igual al primer dígito de 'b' (21/10=2). ¡Es como mirar un número en un espejo!

Resolver problema →
Medio TypeScript

¿TypeScript tiene interfaces en runtime?

¡Falso! Las interfaces de TypeScript son puramente para el sistema de tipos y desaparecen completamente después de la compilación. Solo existen en tiempo de desarrollo para ayudar con el tipado estático, pero no generan ningún código JavaScript.

Resolver problema →
Medio JavaScript

Trivia: 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 tiene número 0, sus coautores directos tienen 1, los coautores de sus coautores tienen 2, etc. Este concepto se usa en ciencias de la computación para medir redes de colaboración académica y es un ejemplo clásico de teoría de grafos aplicada.

Resolver problema →
Fácil Python

El Misterio del Operador Walrus

¡Verdadero! El operador := (introducido en Python 3.8) permite asignar valores dentro de expresiones. En este ejemplo, 'n' recibe el valor 3 y se usa inmediatamente en la comparación, imprimiendo 'Lista tiene 3 elementos'.

Resolver problema →
Fácil JavaScript

El Misterio del Math.max Vacío

¡Sorpresa! Math.min() sin argumentos devuelve Infinity y Math.max() sin argumentos devuelve -Infinity. Por eso Infinity > -Infinity es true. Esto ocurre porque Math.min busca el valor más pequeño comparando con Infinity como punto de partida, y Math.max busca el más grande comparando con -Infinity.

Resolver problema →
Medio TypeScript

¿TypeScript es Open Source?

¡Sí! A pesar de ser creado por Microsoft, TypeScript es completamente open source desde 2012 bajo licencia Apache 2.0. Puedes ver y contribuir al código en GitHub (microsoft/TypeScript). Esto ha permitido que la comunidad aporte mejoras y que el lenguaje evolucione con transparencia.

Resolver problema →
Medio JavaScript

Trivia: El Algoritmo de Ackermann

La función de Ackermann, definida por Wilhelm Ackermann en 1928, crece tan rápidamente que ackermann(4, 2) ya produce un número con más de 19,000 dígitos. Es computable (podemos programarla) pero no es primitiva recursiva porque su crecimiento supera cualquier función construida con recursión simple y composición. Es famosa en teoría de la computación por demostrar que existen funciones computables que no pueden expresarse con recursión primitiva. ¡Nunca intentes calcular ackermann(5, 5) a menos que tengas toda la eternidad! ⏳

Resolver problema →
Fácil TypeScript

El Truco del Template Literal Type

TypeScript permite crear tipos literales usando template strings! El tipo Full es exactamente "user_123" - no cualquier string, sino ESE string específico. Si intentas asignar otro valor como "user_456", TypeScript te dará error. Es como tener constantes a nivel de tipos.

Resolver problema →
Medio TypeScript

El Contador de Menciones en Chat

La función extrae menciones con regex /@\w+/g, elimina el @ con slice(1) y cuenta cada aparición. Ana aparece 3 veces (1 en el primer mensaje, 2 en el segundo) y Luis 1 vez. El operador || 0 inicializa el contador para nuevas menciones.

Resolver problema →
Medio TypeScript

Template Literal Tipo

Los template literals siempre producen strings en TypeScript, incluso cuando interpolan números. La expresión `${n}` convierte el número 42 a string '42', por lo que typeof s es 'string', no 'number'. Esto es diferente a simplemente asignar n directamente.

Resolver problema →
Medio Java

El Enigma del Mapa de Frecuencias

El código cuenta las frecuencias de caracteres en 'BANANA'. La letra 'A' aparece 3 veces. freq.getOrDefault('Z', 0L) devuelve 0L porque 'Z' no existe en el mapa. Por lo tanto: 3 + 0 = 3. ¡Un patrón común en análisis de texto!

Resolver problema →
Medio JavaScript

Array toString Sorpresa

Aunque a y b son arrays idénticos, la comparación falla. Cuando usamos ==, JavaScript convierte el array 'a' a string '1,2,3' y compara con b.toString() que también es '1,2,3'. ¡Pero el resultado es FALSE! Esto se debe a que JavaScript primero convierte 'a' a string, luego intenta comparar dos strings diferentes en referencias de memoria. La trampa: == compara referencias de objetos antes de hacer coerción de tipos cuando ambos lados son objetos.

Resolver problema →
Fácil JavaScript

El Enigma del Reloj Binario

El código convierte formato 24h a 12h. Primero verifica si es PM (≥12), luego resta 12 si es mayor a 12. Con hora=13, esPM=true y formato12=1, mostrando '1:00 PM'. ¿Notaste que usa operador ternario anidado?

Resolver problema →
Medio Python

¿Python permite múltiples inheritance?

Python soporta herencia múltiple desde su creación. Una clase puede heredar de varias clases usando class C(A, B, D). Python resuelve el orden de búsqueda de métodos usando el algoritmo MRO (Method Resolution Order) basado en C3 linearization.

Resolver problema →
Medio TypeScript

Trivia: El Algoritmo de Kadane

¡Falso! El algoritmo de Kadane tiene una complejidad temporal de O(n), no O(n²). Es uno de los algoritmos más elegantes de programación dinámica, resolviendo el problema de subarreglo de suma máxima en una sola pasada. La solución naive que prueba todos los subarreglos posibles sí es O(n²). Salida: 6 (subarreglo [4, -1, 2, 1])

Resolver problema →
Fácil TypeScript

El Truco del Array.sort() Sin Comparador

¡Sorpresa! Array.sort() sin comparador convierte los números a strings y ordena alfabéticamente. Por eso '10' viene antes que '5' (porque '1' < '5' en orden alfabético). El resultado es [10, 100, 25, 40, 5], así que nums[0] = 10. Para ordenar números correctamente usa: nums.sort((a, b) => a - b)

Resolver problema →
Medio TypeScript

El Truco del Reduce con Acumulador Object

El reduce crea un objeto contador: {1: 2, 2: 2, 3: 1}. result[1] es 2 (el número 1 aparece 2 veces) y result[3] es 1 (el número 3 aparece 1 vez). La suma es 2 + 1 = 3. Este patrón de reduce como contador de frecuencias es muy útil en TypeScript para análisis de datos.

Resolver problema →
Medio JavaScript

Array Sort Numérico

¡Sorpresa! Array.sort() convierte los números a strings por defecto, ordenando alfabéticamente ('1', '10', '2', '5'). Para ordenar numéricamente, necesitas: nums.sort((a, b) => a - b). Un error común que causa bugs inesperados en producción.

Resolver problema →
Fácil JavaScript

El Detector de Vocales Consecutivas

La función recorre cada letra de la palabra y verifica si hay dos vocales seguidas. En 'aeropuerto', encuentra 'ae' al inicio, por lo que devuelve true. Es útil para análisis lingüístico o validaciones de texto.

Resolver problema →
Medio JavaScript

¿JavaScript fue creado para navegadores?

¡Falso! JavaScript fue creado por Brendan Eich en 1995 específicamente para el navegador Netscape Navigator. Su propósito era agregar interactividad a las páginas web. Aunque hoy Node.js permite usarlo en servidores, su diseño original fue 100% orientado al navegador. De hecho, se creó en solo 10 días con el nombre 'Mocha', luego 'LiveScript', y finalmente 'JavaScript' por marketing (para aprovechar la popularidad de Java).

Resolver problema →
Medio JavaScript

Trivia: El Problema de Josephus

El Problema de Josephus es un antiguo problema matemático usado en CS. Con 7 personas en círculo, eliminando cada 3ra persona, la posición segura es la 4. Este algoritmo resuelve el problema en O(n) usando aritmética modular. Fue descrito por Flavio Josefo en el siglo I. ¿Sabías que este problema inspiró estructuras de datos circulares?

Resolver problema →
Fácil Python

El Contador de Palabras Largas

El código divide el texto en palabras con split(), luego usa una comprensión de generador con sum() para contar cuántas palabras tienen más de 5 letras. 'divertido' (9 letras) y 'poderoso' (8 letras) cumplen la condición, por eso el resultado es 2.

Resolver problema →
Medio JavaScript

El Validador de Sudoku

Para validar una fila de Sudoku, necesitamos verificar que todos los números del 1-9 estén presentes sin repetirse. Un Set elimina duplicados automáticamente, por lo que si el tamaño del Set es 9 y no hay ceros, la fila es válida. La palabra 'new' es necesaria para crear una nueva instancia del objeto Set.

Resolver problema →
Medio TypeScript

Optional Chaining Número

El operador ?? (nullish coalescing) solo retorna el valor derecho si el izquierdo es null o undefined. Como age es 0 (un número válido aunque falsy), retorna 0, no 18. Diferente a || que consideraría 0 como falsy.

Resolver problema →
Fácil TypeScript

El Enigma del NaN Comparado

NaN es el único valor en JavaScript/TypeScript que NO es igual a sí mismo. NaN === NaN siempre retorna false. Para verificar si un valor es NaN, debes usar Number.isNaN(x) o isNaN(x).

Resolver problema →
Medio TypeScript

Trivia: El Algoritmo de Duff's Device

Duff's Device es una técnica de optimización creada por Tom Duff en 1983 para Lucasfilm. Combina un switch sin breaks con un bucle para 'desenrollar' iteraciones. Aquí count % 8 = 7, así que entra en case 7 y ejecuta los 4 console.log (casos 7, 6, 5, 4) por el fall-through. Es una de las optimizaciones más ingeniosas y controvertidas en C, adaptable a TypeScript aunque raramente usada hoy.

Resolver problema →
Medio JavaScript

El Misterio del Array Vacío Truthy

¡Sorpresa! Los arrays y objetos vacíos son truthy en contextos booleanos (&&), pero [] == false es true porque JavaScript convierte el array a string vacío ('') y luego a 0. Sin embargo, {} != false porque los objetos no se convierten igual. Este es un clásico gotcha de coerción de tipos: [] es truthy pero == false al mismo tiempo. ¡Usa === para evitar estas sorpresas!

Resolver problema →
Medio Python

Diccionario get() Sorpresa

El método append() modifica la lista in-place pero retorna None, no la lista modificada. Aunque d.get('x', []) crea una lista temporal vacía y le agrega 1, el resultado de append() siempre es None. Este es un error común al esperar que append() retorne la lista.

Resolver problema →
Fácil Java

El Clasificador de Triángulos

Un triángulo isósceles tiene exactamente DOS lados iguales. Usamos || (OR) para verificar si a==b O b==c O a==c, y luego excluimos el caso equilátero (tres lados iguales). Con lados 5,5,7 el resultado es true.

Resolver problema →
Medio Java

¿Java siempre fue de Oracle?

Java fue creado por James Gosling en Sun Microsystems en 1995. Oracle adquirió Sun Microsystems en 2010, convirtiéndose en el propietario de Java desde entonces. Por eso verás 'Copyright © Oracle' en versiones modernas del JDK.

Resolver problema →
Medio TypeScript

Trivia: El Algoritmo de Sieve of Eratosthenes

El Algoritmo de la Criba de Eratóstenes, creado por el matemático griego en el siglo III a.C., es uno de los métodos más antiguos y eficientes para encontrar números primos. Este código muestra una versión optimizada que solo verifica divisores hasta la raíz cuadrada del número. 97 es primo porque no es divisible por ningún número entre 2 y 9 (√97 ≈ 9.8). La criba original marcaba múltiplos en una tabla, mientras que las implementaciones modernas usan divisiones. ¿Sabías que este algoritmo de 2,300 años sigue siendo la base de muchos sistemas criptográficos actuales?

Resolver problema →
Fácil Python

El Detector de Número Gritón

La función 'gritar' convierte el número a string y le agrega tantos signos de exclamación como el valor del número. Es como si el número gritara más fuerte cuanto más grande es. ¡4 grita con 4 exclamaciones!

Resolver problema →
Medio JavaScript

El Misterio del Set con NaN

Set trata a NaN como el mismo valor (aunque NaN !== NaN), así que solo se agrega una vez. Sin embargo, 0/-1 produce -0, que es distinto de NaN en Sets. Resultado: 2 elementos (NaN y -0). ¡Un comportamiento peculiar de JavaScript con valores especiales!

Resolver problema →
Medio JavaScript

String + Array Extraño

JavaScript convierte arrays a strings con +, pero a números con - y *. [1] se convierte a '1' con + (concatenación '5'+'1'='51'), pero a número 1 con - y * (conversión numérica: 5-1=4, 5*1=5). ¡Las operaciones matemáticas fuerzan conversión numérica!

Resolver problema →
Fácil JavaScript

El Enigma del Operador Ternario Anidado

El operador ternario se evalúa de izquierda a derecha. Como edad < 18, va al segundo operador: tienePermiso es false, entonces retorna 'no puede entrar'. Los operadores ternarios anidados pueden ser confusos, ¡por eso es mejor usar if-else para casos complejos!

Resolver problema →
Medio TypeScript

¿TypeScript tiene enums en JavaScript?

TypeScript compila enums a objetos JavaScript normales con mapeo bidireccional (nombre→valor y valor→nombre). Por ejemplo, enum Color {Red, Green} se convierte en un objeto con {0: 'Red', Red: 0, 1: 'Green', Green: 1}. ¡Son una de las pocas features de TypeScript que añaden código en runtime!

Resolver problema →
Medio JavaScript

Trivia: El Algoritmo de Euclides

El Algoritmo de Euclides, creado hace más de 2300 años, es uno de los algoritmos más antiguos que aún se usa hoy. Calcula el MCD usando divisiones sucesivas. MCD(48, 18) = 6 porque es el número más grande que divide a ambos. ¿Sabías que este algoritmo es la base de la criptografía RSA? 🔐

Resolver problema →