Todos los Problemas
Explora nuestra colección de 274 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.
¿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
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.
¿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?
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!
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.
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.
¿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.
¿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.
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? 🤔
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.
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!
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.
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!
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.
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.
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.
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.
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).
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.
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'! 😄
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.
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.
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.
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).
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! 😴
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.
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.
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.
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.
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!
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.
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.
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.
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.
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.
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?
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).
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!
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.
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.
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.
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!
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!
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.
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.
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.
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.
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!
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.
¿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.
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! 🧮
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!
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?
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
¿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.
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.
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.
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!
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.
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.
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.
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.
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.
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.
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!
¿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.
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?
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).
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)
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.
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'].
¿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.
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.
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.
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.
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.
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.
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.
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.
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!
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.
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!
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!
¿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ó.
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.
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.
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.
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.
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.
¿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.
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!
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.
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.
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.
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.
¿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.
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.
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.
¿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. ☕
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.
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!
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!
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!
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".
¿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.
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.
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.
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.
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!
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.
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').
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.
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.
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.
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.
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.
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!
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.
¿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!
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.
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.
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.
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.
¿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.
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.
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!
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.
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.
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!
¿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.
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.
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'.
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.
¿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.
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! ⏳
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.
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.
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.
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!
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.
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?
¿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.
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])
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)
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.
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.
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.
¿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).
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?
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.
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.
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.
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).
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.
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!
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.
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.
¿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.
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?
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!
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!
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!
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!
¿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!
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? 🔐