
Angular: De cero a experto
Una plataforma para practicar algoritmos, estructuras de datos y diseño de sistemas — con feedback instantáneo, casos de prueba reales y una comunidad de más de 80 países.
// Encuentra dos números que sumen el target function twoSum(nums, target) { const seen = new Map(); for (let i = 0; i < nums.length; i++) { const diff = target - nums[i]; if (seen.has(diff)) return [seen.get(diff), i]; seen.set(nums[i], i); } }
Datos en vivo de la plataforma. Actualizados desde nuestra infraestructura de ejecución.
Tres pilares, curados por ingenieros que hacen entrevistas en empresas como Mercado Libre, Stripe y Rappi.
Más de 260 retos organizados por dificultad, tema y patrón algorítmico. Cada uno validado con casos edge reales.
Corremos tu código contra 4 a 8 casos en milisegundos. Mostramos runtime, consola y si deseas, puedes ver el código de otros.
Explicaciones paso a paso, soluciones alternativas y complejidad asintótica — escritas por humanos, no por LLMs.
Estudiás, discutís y aprendés con gente de más de 80 países. Sesiones colaborativas en vivo, code reviews entre pares y competencias semanales.
Sin trial. Sin tarjeta. Sin tier oculto. Un solo plan con acceso completo a la plataforma — para siempre.
Empezá con un ejercicio hoy. Sin tarjeta. Sin onboarding. Sin obstáculos.
Comenzar, es gratis →
Gracias a DevTalles por hacer posible esta plataforma. Si querés llevar tus habilidades aún más lejos, explorá su catálogo de cursos.

Angular: De cero a experto

Angular: Convierte cualquier template HTML en una WebAPP

Angular PRO: Lleva tus bases al siguiente nivel

Angular + Sockets: Aplicaciones en tiempo real con Bun

Astro: El framework para sitios web orientados al contenido

C#: Empieza tu camino en el lenguaje

Dart: De cero hasta los detalles

Django: Crea aplicaciones web robustas con Python

Docker: Guía práctica de uso para desarrolladores

RN Expo + Gemini: Aplicaciones con inteligencia artificial

FastAPI: Crea APIs eficientes con Python

Flutter Avanzado: Lleva tu conocimiento al siguiente nivel

Flutter BLoC: Mini-Curso

Flutter Móvil: De cero a experto

Flutter Intermedio: Diseños profesionales y animaciones

Flutter + Gemini: Aplicaciones con inteligencia artificial

Flutter móvil: Recursos Nativos - Nivel intermedio

Flutter Web: Aplicaciones y páginas web profesionales

GIT+GitHub: Todo un sistema de control de versiones de cero

GoLang: Fundamentos del lenguaje

Java: Explora el lenguaje desde cero

Java avanzado: reactividad, concurrencia y patrones

JavaScript: de cero hasta los detalles

JavaScript Moderno: Guía para dominar el lenguaje

n8n + MCP: Automatización y agentes de IA inteligentes

Nest: Desarrollo backend escalable con Node

Nest + GraphQL: Evoluciona tus APIs

NestJS + Microservicios: Aplicaciones escalables y modulares

NestJS + Testing: Pruebas unitarias y end to end (E2E)

NestJs + Reportes: Genera PDFs desde Node

.NET Backend: .NET Core, SQL Server y seguridad JWT

.NET: Pruebas completas para minimal API

Blazor: Desde cero con arquitectura limpia

Next.js: El framework de React para producción

Node: Autenticación Rest con Clean Architecture

Angular: De cero a experto

Angular: Convierte cualquier template HTML en una WebAPP

Angular PRO: Lleva tus bases al siguiente nivel

Angular + Sockets: Aplicaciones en tiempo real con Bun

Astro: El framework para sitios web orientados al contenido

C#: Empieza tu camino en el lenguaje

Dart: De cero hasta los detalles

Django: Crea aplicaciones web robustas con Python

Docker: Guía práctica de uso para desarrolladores

RN Expo + Gemini: Aplicaciones con inteligencia artificial

FastAPI: Crea APIs eficientes con Python

Flutter Avanzado: Lleva tu conocimiento al siguiente nivel

Flutter BLoC: Mini-Curso

Flutter Móvil: De cero a experto

Flutter Intermedio: Diseños profesionales y animaciones

Flutter + Gemini: Aplicaciones con inteligencia artificial

Flutter móvil: Recursos Nativos - Nivel intermedio

Flutter Web: Aplicaciones y páginas web profesionales

GIT+GitHub: Todo un sistema de control de versiones de cero

GoLang: Fundamentos del lenguaje

Java: Explora el lenguaje desde cero

Java avanzado: reactividad, concurrencia y patrones

JavaScript: de cero hasta los detalles

JavaScript Moderno: Guía para dominar el lenguaje

n8n + MCP: Automatización y agentes de IA inteligentes

Nest: Desarrollo backend escalable con Node

Nest + GraphQL: Evoluciona tus APIs

NestJS + Microservicios: Aplicaciones escalables y modulares

NestJS + Testing: Pruebas unitarias y end to end (E2E)

NestJs + Reportes: Genera PDFs desde Node

.NET Backend: .NET Core, SQL Server y seguridad JWT

.NET: Pruebas completas para minimal API

Blazor: Desde cero con arquitectura limpia

Next.js: El framework de React para producción

Node: Autenticación Rest con Clean Architecture

NodeJS: De cero a experto

Nuxt: El marco de trabajo web progresivo (Nuxt 4+)

OpenAI: Ejercicios y asistentes con Angular + NestJS

OpenAI: Ejercicios prácticos y asistentes con React + NestJS

Patrones de Diseño: Soluciones prácticas y eficientes

PHP moderno: Empieza tu camino en el lenguaje

Programación para principiantes

Ingeniería de prompts: Para la vida real

PWA - Aplicaciones Web Progresivas: De cero a experto

Python: Fundamentos hasta los detalles

Python + n8n: Automatiza rutinas cotidianas

qwik: Introducción al Framework

React: De cero a experto

React Native Expo: Aplicaciones nativas para iOS y Android

React Pro: Lleva tus bases al siguiente nivel

TanStack Query: Un poderoso gestor de estado asíncrono

React Router: Navegación declarativa y framework

React: Aplicaciones en tiempo real con socket-io

React + Sockets: Aplicaciones en tiempo real con Bun

Mini-Curso: Riverpod providers con anotaciones

ReactiveX - RxJs: De cero hasta los detalles

Shadcn/ui: Componentes accesibles y personalizables

Principios: SOLID y Clean Code

Java: Spring Boot - Guía definitiva

Spring Boot 4: Arquitectura de Microservicios

Spring Boot: De MVC a Hexagonal

SQL de cero: Tu guía práctica con PostgreSQL

TailwindCSS: Para desarrolladores de software

TypeScript: tu completa guía y manual de mano.

Vibe Coding: De forma responsable

Visual Studio Code: Mejora tu velocidad para codificar

Vue + TS: Lleva tus bases al siguiente nivel - Intermedio

Vue.js - de Cero a Experto: Composition Api

Vue.js Tradicional: Options API

Zustand: Gestor de estado para React

NodeJS: De cero a experto

Nuxt: El marco de trabajo web progresivo (Nuxt 4+)

OpenAI: Ejercicios y asistentes con Angular + NestJS

OpenAI: Ejercicios prácticos y asistentes con React + NestJS

Patrones de Diseño: Soluciones prácticas y eficientes

PHP moderno: Empieza tu camino en el lenguaje

Programación para principiantes

Ingeniería de prompts: Para la vida real

PWA - Aplicaciones Web Progresivas: De cero a experto

Python: Fundamentos hasta los detalles

Python + n8n: Automatiza rutinas cotidianas

qwik: Introducción al Framework

React: De cero a experto

React Native Expo: Aplicaciones nativas para iOS y Android

React Pro: Lleva tus bases al siguiente nivel

TanStack Query: Un poderoso gestor de estado asíncrono

React Router: Navegación declarativa y framework

React: Aplicaciones en tiempo real con socket-io

React + Sockets: Aplicaciones en tiempo real con Bun

Mini-Curso: Riverpod providers con anotaciones

ReactiveX - RxJs: De cero hasta los detalles

Shadcn/ui: Componentes accesibles y personalizables

Principios: SOLID y Clean Code

Java: Spring Boot - Guía definitiva

Spring Boot 4: Arquitectura de Microservicios

Spring Boot: De MVC a Hexagonal

SQL de cero: Tu guía práctica con PostgreSQL

TailwindCSS: Para desarrolladores de software

TypeScript: tu completa guía y manual de mano.

Vibe Coding: De forma responsable

Visual Studio Code: Mejora tu velocidad para codificar

Vue + TS: Lleva tus bases al siguiente nivel - Intermedio

Vue.js - de Cero a Experto: Composition Api

Vue.js Tradicional: Options API

Zustand: Gestor de estado para React
Los desafíos más resueltos por nuestra comunidad esta semana.
Dados dos booleanos, devuelve `true` si **al menos uno** de los dos es `true` (compuerta OR). ### Ejemplo ``` atLeastOneTrue(true, false) → true atLeastOneTrue(false, false) → false atLeastOneTrue(true, true) → true ```
Dados dos booleanos, devuelve `true` solo si **ambos** son `true` (compuerta AND). ### Ejemplo ``` bothTrue(true, true) → true bothTrue(true, false) → false bothTrue(false, false) → false ```
Devuelve **true** si el string contiene el carácter dado, **false** si no. ### Ejemplo ``` containsChar("hola", "o") → true containsChar("hola", "z") → false ```
Dados dos números `n` y `divisor`, devuelve `true` si `n` es divisible por `divisor` (sin residuo). ### Ejemplo ``` isDivisible(10, 2) → true isDivisible(7, 2) → false isDivisible(9, 3) → true ```
Dado un número, devuelve `true` si es un número entero (sin parte decimal). ### Ejemplo ``` isInteger(5) → true isInteger(3.14) → false isInteger(0) → true isInteger(-7) → true ```
Devuelve **true** si el número es mayor que 0, **false** en caso contrario. ### Ejemplo ``` isPositive(5) → true isPositive(-3) → false ```
Crea una función que reciba un número y devuelva **true** si es par, **false** si es impar. ### Ejemplo ``` isEven(4) → true isEven(7) → false ```
## ¿Es múltiplo? Dados dos números `n` y `m`, devuelve `true` si `n` es múltiplo de `m`, es decir, si `n` es divisible entre `m` sin residuo. ## Casos especiales - Si `m` es `0`, devuelve `false` (división por cero no está definida). - `0` es múltiplo de cualquier número distinto de cero. ## Ejemplos ``` isMultiple(10, 2) // true → 10 / 2 = 5, sin residuo isMultiple(9, 3) // true → 9 / 3 = 3, sin residuo isMultiple(7, 2) // false → 7 / 2 = 3.5, tiene residuo isMultiple(0, 5) // true → 0 / 5 = 0, sin residuo isMultiple(5, 0) // false → división por cero ```
## ¿Es número Fibonacci? Dado un número entero no negativo, determina si pertenece a la secuencia de Fibonacci. La secuencia de Fibonacci es: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... ### Parámetros - `n`: Un número entero no negativo. ### Valor de retorno `true` si `n` es un número de Fibonacci, `false` en caso contrario. ### Ejemplos ```typescript isFibonacci(0); // true (F(0) = 0) isFibonacci(1); // true (F(1) = 1) isFibonacci(8); // true (F(6) = 8) isFibonacci(10); // false isFibonacci(21); // true (F(8) = 21) ``` ### Pista Un número `n` es Fibonacci si y solo si `5*n*n + 4` o `5*n*n - 4` es un cuadrado perfecto.
Dado un array de arrays de números, devuelve un solo array con todos los elementos. ### Ejemplo ``` flatten([[1, 2], [3, 4], [5]]) → [1, 2, 3, 4, 5] flatten([[]]) → [] ```
Cuenta cuántas palabras tiene un string (palabras separadas por uno o más espacios). ### Ejemplo ``` countWords("hola mundo") → 2 countWords("uno dos tres") → 3 ```
Escribe una función que reciba un string y devuelva el número de vocales (a, e, i, o, u). Considera solo minúsculas; si quieres, puedes normalizar el string antes. ### Ejemplo ``` countVowels("hola") → 2 countVowels("aeiou") → 5 ```
Implementa una función que sume todos los elementos de un array usando el método **reduce**. ### Ejemplo ``` sumReduce([1, 2, 3, 4]) → 10 ```
Implementa la función factorial. El factorial de `n` (`n!`) es el producto de todos los enteros desde 1 hasta `n`. Por definición, `0! = 1`. ### Ejemplo ``` factorial(5) → 120 factorial(0) → 1 ```
Dado un array de números, devuélvelo ordenado de **menor a mayor**. No modifiques el array original. ### Ejemplo ``` sortNumbers([3, 1, 2]) → [1, 2, 3] sortNumbers([5, 4, 3, 2, 1]) → [1, 2, 3, 4, 5] sortNumbers([-3, 0, 2]) → [-3, 0, 2] ```
Calcula `base` elevado a `exp` (entero no negativo). Por ejemplo `2^3 = 8`. ### Ejemplo ``` power(2, 3) → 8 power(5, 0) → 1 ```
Dados dos booleanos, devuelve `true` si **al menos uno** de los dos es `true` (compuerta OR). ### Ejemplo ``` atLeastOneTrue(true, false) → true atLeastOneTrue(false, false) → false atLeastOneTrue(true, true) → true ```
Dados dos booleanos, devuelve `true` solo si **ambos** son `true` (compuerta AND). ### Ejemplo ``` bothTrue(true, true) → true bothTrue(true, false) → false bothTrue(false, false) → false ```
Devuelve **true** si el string contiene el carácter dado, **false** si no. ### Ejemplo ``` containsChar("hola", "o") → true containsChar("hola", "z") → false ```
Dados dos números `n` y `divisor`, devuelve `true` si `n` es divisible por `divisor` (sin residuo). ### Ejemplo ``` isDivisible(10, 2) → true isDivisible(7, 2) → false isDivisible(9, 3) → true ```
Dado un número, devuelve `true` si es un número entero (sin parte decimal). ### Ejemplo ``` isInteger(5) → true isInteger(3.14) → false isInteger(0) → true isInteger(-7) → true ```
Devuelve **true** si el número es mayor que 0, **false** en caso contrario. ### Ejemplo ``` isPositive(5) → true isPositive(-3) → false ```
Crea una función que reciba un número y devuelva **true** si es par, **false** si es impar. ### Ejemplo ``` isEven(4) → true isEven(7) → false ```
## ¿Es múltiplo? Dados dos números `n` y `m`, devuelve `true` si `n` es múltiplo de `m`, es decir, si `n` es divisible entre `m` sin residuo. ## Casos especiales - Si `m` es `0`, devuelve `false` (división por cero no está definida). - `0` es múltiplo de cualquier número distinto de cero. ## Ejemplos ``` isMultiple(10, 2) // true → 10 / 2 = 5, sin residuo isMultiple(9, 3) // true → 9 / 3 = 3, sin residuo isMultiple(7, 2) // false → 7 / 2 = 3.5, tiene residuo isMultiple(0, 5) // true → 0 / 5 = 0, sin residuo isMultiple(5, 0) // false → división por cero ```
## ¿Es número Fibonacci? Dado un número entero no negativo, determina si pertenece a la secuencia de Fibonacci. La secuencia de Fibonacci es: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... ### Parámetros - `n`: Un número entero no negativo. ### Valor de retorno `true` si `n` es un número de Fibonacci, `false` en caso contrario. ### Ejemplos ```typescript isFibonacci(0); // true (F(0) = 0) isFibonacci(1); // true (F(1) = 1) isFibonacci(8); // true (F(6) = 8) isFibonacci(10); // false isFibonacci(21); // true (F(8) = 21) ``` ### Pista Un número `n` es Fibonacci si y solo si `5*n*n + 4` o `5*n*n - 4` es un cuadrado perfecto.
Dado un array de arrays de números, devuelve un solo array con todos los elementos. ### Ejemplo ``` flatten([[1, 2], [3, 4], [5]]) → [1, 2, 3, 4, 5] flatten([[]]) → [] ```
Cuenta cuántas palabras tiene un string (palabras separadas por uno o más espacios). ### Ejemplo ``` countWords("hola mundo") → 2 countWords("uno dos tres") → 3 ```
Escribe una función que reciba un string y devuelva el número de vocales (a, e, i, o, u). Considera solo minúsculas; si quieres, puedes normalizar el string antes. ### Ejemplo ``` countVowels("hola") → 2 countVowels("aeiou") → 5 ```
Implementa una función que sume todos los elementos de un array usando el método **reduce**. ### Ejemplo ``` sumReduce([1, 2, 3, 4]) → 10 ```
Implementa la función factorial. El factorial de `n` (`n!`) es el producto de todos los enteros desde 1 hasta `n`. Por definición, `0! = 1`. ### Ejemplo ``` factorial(5) → 120 factorial(0) → 1 ```
Dado un array de números, devuélvelo ordenado de **menor a mayor**. No modifiques el array original. ### Ejemplo ``` sortNumbers([3, 1, 2]) → [1, 2, 3] sortNumbers([5, 4, 3, 2, 1]) → [1, 2, 3, 4, 5] sortNumbers([-3, 0, 2]) → [-3, 0, 2] ```
Calcula `base` elevado a `exp` (entero no negativo). Por ejemplo `2^3 = 8`. ### Ejemplo ``` power(2, 3) → 8 power(5, 0) → 1 ```
Devuelve **true** si `s` y `t` son anagramas (mismas letras en distinto orden), **false** si no. ### Ejemplo ``` isAnagram("roma", "amor") → true isAnagram("hola", "adios") → false ```
Dados dos booleanos `a` y `b`, y el nombre de una compuerta lógica, aplica la operación y devuelve el resultado. Compuertas soportadas: `"AND"`, `"OR"`, `"XOR"`, `"NAND"`. - **XOR**: verdadero solo si los valores son distintos. - **NAND**: negación de AND. ### Ejemplo ``` logicGate(true, false, "AND") → false logicGate(true, false, "OR") → true logicGate(true, true, "XOR") → false logicGate(false, false, "NAND") → true ```
Dado un array de números **ordenado ascendentemente** y un valor objetivo, implementa la búsqueda binaria y devuelve el índice del objetivo. Si no existe, devuelve `-1`. ### Ejemplo ``` binarySearch([1, 3, 5, 7, 9], 5) → 2 binarySearch([1, 3, 5, 7, 9], 6) → -1 binarySearch([2, 4, 6, 8], 8) → 3 ```
Dado un string con palabras separadas por espacios, devuelve el string con el **orden de las palabras invertido**. ### Ejemplo ``` reverseWords("hola mundo") → "mundo hola" reverseWords("el gato come") → "come gato el" reverseWords("TypeScript") → "TypeScript" ```
Dado un string en formato `camelCase`, conviértelo a `snake_case` (palabras separadas por guión bajo y en minúsculas). ### Ejemplo ``` camelToSnake("camelCase") → "camel_case" camelToSnake("myVariableName") → "my_variable_name" camelToSnake("firstName") → "first_name" camelToSnake("hola") → "hola" ```
Dado un string con palabras separadas por espacios, devuelve la longitud de la última palabra. Ignora espacios al final del string. ### Ejemplo ``` lengthOfLastWord("hello world") → 5 lengthOfLastWord(" fly me to the moon ") → 4 ```
> Adaptado de [Daily Coding Problem](https://www.dailycodingproblem.com). Dada una lista de números enteros, determina si existe algún par de elementos cuya suma sea igual a k. Por ejemplo, dada la lista [10, 15, 3, 7] y k = 17, devuelve true ya que 10 + 7 = 17. Dada la lista [1, 2, 3, 4] y k = 10, devuelve false ya que ningún par suma exactamente 10. Bonus: ¿Puedes resolverlo en un solo recorrido usando un hash set?
Dado un array de números **ordenado**, devuelve cuántos elementos únicos hay (modificando in-place no requerido; devuelve el número). ### Ejemplo ``` removeDuplicates([1, 1, 2, 2, 3]) → 3 removeDuplicates([1, 2, 3]) → 3 ```
En un array donde todos los números aparecen **dos veces** excepto uno, devuelve ese único número. ### Ejemplo ``` singleNumber([2, 2, 1]) → 1 singleNumber([4, 1, 2, 1, 2]) → 4 ```
Dada una expresión booleana como array de tokens (`"true"`, `"false"`, `"AND"`, `"OR"`), evalúala de **izquierda a derecha** y devuelve el resultado. Los tokens alternan entre valores (`"true"` / `"false"`) y operadores (`"AND"` / `"OR"`). ### Ejemplo ``` evaluateExpression(["true", "AND", "false"]) → false evaluateExpression(["true", "OR", "false"]) → true evaluateExpression(["true", "AND", "true", "OR", "false"])→ true evaluateExpression(["false", "OR", "false", "AND", "true"])→ false ```
Dado un string que representa un número en binario (solo '0' y '1'), devuelve su valor en decimal. ### Ejemplo ``` binaryToDecimal("101") → 5 binaryToDecimal("1111") → 15 ```
Usando **recursión**, implementa el algoritmo de Euclides para calcular el Máximo Común Divisor (MCD) de dos números enteros positivos. El MCD es el número más grande que divide a ambos sin dejar residuo. ### Ejemplo ``` gcd(48, 18) → 6 gcd(7, 3) → 1 gcd(12, 8) → 4 gcd(100, 75) → 25 ```
Implementa el cifrado César: desplaza cada letra del texto un número de posiciones hacia adelante en el alfabeto. Las letras se envuelven al llegar a la `z`. Los caracteres que no son letras se mantienen sin cambios. Distingue entre mayúsculas y minúsculas. ### Ejemplo ``` caesarCipher("abc", 3) → "def" caesarCipher("xyz", 3) → "abc" caesarCipher("Hello", 1) → "Ifmmp" caesarCipher("abc", 0) → "abc" ```
## Refactoriza: usa curry() En este ejercicio tienes una función `curry` completamente implementada y una versión de `curryAdd3` que **no la usa** — está implementada manualmente con arrow functions anidadas. ## Tu tarea Refactoriza `curryAdd3` para que use la función `curry` en lugar de la implementación manual con arrow functions. ## Cómo funciona curry La función `curry(fn)` transforma cualquier función de múltiples argumentos en su versión currificada. La versión currificada puede recibir los argumentos de varias formas: ``` curryAdd3(1, 2, 3) // 6 → todos los argumentos a la vez curryAdd3(1)(2)(3) // 6 → un argumento a la vez curryAdd3(1, 2)(3) // 6 → combinación parcial curryAdd3(1)(2, 3) // 6 → combinación parcial ``` ## Restricción - `curryAdd3` debe crearse llamando a `curry()` — no puedes usar arrow functions anidadas manualmente.
Dado un objeto con posibles propiedades anidadas, devuelve un nuevo objeto **plano** donde las claves anidadas se unen con puntos (`.`). ### Ejemplo ``` flattenObject({ a: 1, b: { c: 2, d: 3 } }) → { "a": 1, "b.c": 2, "b.d": 3 } flattenObject({ x: { y: { z: 1 } } }) → { "x.y.z": 1 } flattenObject({ a: 1, b: 2 }) → { "a": 1, "b": 2 } ```
## Profundidad de array Dado un array que puede contener otros arrays anidados, determina la profundidad máxima de anidamiento. Un array plano (sin arrays internos) tiene profundidad 1. Un array vacío tiene profundidad 1. ### Parámetros - `arr`: Un array que puede contener números u otros arrays anidados. ### Valor de retorno Un número entero que representa la profundidad máxima de anidamiento del array. ### Ejemplos ```typescript arrayDepth([1, 2, 3]); // 1 arrayDepth([1, [2, 3]]); // 2 arrayDepth([1, [2, [3]]]); // 3 arrayDepth([]); // 1 arrayDepth([[[[]]]]) // 4 arrayDepth([1, [2], [[3]], [[[4]]]]); // 4 ``` ### Pista Usa recursión para explorar cada elemento del array. Si un elemento es un array, calcula su profundidad recursivamente y quédate con la mayor.
Devuelve **true** si `s` y `t` son anagramas (mismas letras en distinto orden), **false** si no. ### Ejemplo ``` isAnagram("roma", "amor") → true isAnagram("hola", "adios") → false ```
Dados dos booleanos `a` y `b`, y el nombre de una compuerta lógica, aplica la operación y devuelve el resultado. Compuertas soportadas: `"AND"`, `"OR"`, `"XOR"`, `"NAND"`. - **XOR**: verdadero solo si los valores son distintos. - **NAND**: negación de AND. ### Ejemplo ``` logicGate(true, false, "AND") → false logicGate(true, false, "OR") → true logicGate(true, true, "XOR") → false logicGate(false, false, "NAND") → true ```
Dado un array de números **ordenado ascendentemente** y un valor objetivo, implementa la búsqueda binaria y devuelve el índice del objetivo. Si no existe, devuelve `-1`. ### Ejemplo ``` binarySearch([1, 3, 5, 7, 9], 5) → 2 binarySearch([1, 3, 5, 7, 9], 6) → -1 binarySearch([2, 4, 6, 8], 8) → 3 ```
Dado un string con palabras separadas por espacios, devuelve el string con el **orden de las palabras invertido**. ### Ejemplo ``` reverseWords("hola mundo") → "mundo hola" reverseWords("el gato come") → "come gato el" reverseWords("TypeScript") → "TypeScript" ```
Dado un string en formato `camelCase`, conviértelo a `snake_case` (palabras separadas por guión bajo y en minúsculas). ### Ejemplo ``` camelToSnake("camelCase") → "camel_case" camelToSnake("myVariableName") → "my_variable_name" camelToSnake("firstName") → "first_name" camelToSnake("hola") → "hola" ```
Dado un string con palabras separadas por espacios, devuelve la longitud de la última palabra. Ignora espacios al final del string. ### Ejemplo ``` lengthOfLastWord("hello world") → 5 lengthOfLastWord(" fly me to the moon ") → 4 ```
> Adaptado de [Daily Coding Problem](https://www.dailycodingproblem.com). Dada una lista de números enteros, determina si existe algún par de elementos cuya suma sea igual a k. Por ejemplo, dada la lista [10, 15, 3, 7] y k = 17, devuelve true ya que 10 + 7 = 17. Dada la lista [1, 2, 3, 4] y k = 10, devuelve false ya que ningún par suma exactamente 10. Bonus: ¿Puedes resolverlo en un solo recorrido usando un hash set?
Dado un array de números **ordenado**, devuelve cuántos elementos únicos hay (modificando in-place no requerido; devuelve el número). ### Ejemplo ``` removeDuplicates([1, 1, 2, 2, 3]) → 3 removeDuplicates([1, 2, 3]) → 3 ```
En un array donde todos los números aparecen **dos veces** excepto uno, devuelve ese único número. ### Ejemplo ``` singleNumber([2, 2, 1]) → 1 singleNumber([4, 1, 2, 1, 2]) → 4 ```
Dada una expresión booleana como array de tokens (`"true"`, `"false"`, `"AND"`, `"OR"`), evalúala de **izquierda a derecha** y devuelve el resultado. Los tokens alternan entre valores (`"true"` / `"false"`) y operadores (`"AND"` / `"OR"`). ### Ejemplo ``` evaluateExpression(["true", "AND", "false"]) → false evaluateExpression(["true", "OR", "false"]) → true evaluateExpression(["true", "AND", "true", "OR", "false"])→ true evaluateExpression(["false", "OR", "false", "AND", "true"])→ false ```
Dado un string que representa un número en binario (solo '0' y '1'), devuelve su valor en decimal. ### Ejemplo ``` binaryToDecimal("101") → 5 binaryToDecimal("1111") → 15 ```
Usando **recursión**, implementa el algoritmo de Euclides para calcular el Máximo Común Divisor (MCD) de dos números enteros positivos. El MCD es el número más grande que divide a ambos sin dejar residuo. ### Ejemplo ``` gcd(48, 18) → 6 gcd(7, 3) → 1 gcd(12, 8) → 4 gcd(100, 75) → 25 ```
Implementa el cifrado César: desplaza cada letra del texto un número de posiciones hacia adelante en el alfabeto. Las letras se envuelven al llegar a la `z`. Los caracteres que no son letras se mantienen sin cambios. Distingue entre mayúsculas y minúsculas. ### Ejemplo ``` caesarCipher("abc", 3) → "def" caesarCipher("xyz", 3) → "abc" caesarCipher("Hello", 1) → "Ifmmp" caesarCipher("abc", 0) → "abc" ```
## Refactoriza: usa curry() En este ejercicio tienes una función `curry` completamente implementada y una versión de `curryAdd3` que **no la usa** — está implementada manualmente con arrow functions anidadas. ## Tu tarea Refactoriza `curryAdd3` para que use la función `curry` en lugar de la implementación manual con arrow functions. ## Cómo funciona curry La función `curry(fn)` transforma cualquier función de múltiples argumentos en su versión currificada. La versión currificada puede recibir los argumentos de varias formas: ``` curryAdd3(1, 2, 3) // 6 → todos los argumentos a la vez curryAdd3(1)(2)(3) // 6 → un argumento a la vez curryAdd3(1, 2)(3) // 6 → combinación parcial curryAdd3(1)(2, 3) // 6 → combinación parcial ``` ## Restricción - `curryAdd3` debe crearse llamando a `curry()` — no puedes usar arrow functions anidadas manualmente.
Dado un objeto con posibles propiedades anidadas, devuelve un nuevo objeto **plano** donde las claves anidadas se unen con puntos (`.`). ### Ejemplo ``` flattenObject({ a: 1, b: { c: 2, d: 3 } }) → { "a": 1, "b.c": 2, "b.d": 3 } flattenObject({ x: { y: { z: 1 } } }) → { "x.y.z": 1 } flattenObject({ a: 1, b: 2 }) → { "a": 1, "b": 2 } ```
## Profundidad de array Dado un array que puede contener otros arrays anidados, determina la profundidad máxima de anidamiento. Un array plano (sin arrays internos) tiene profundidad 1. Un array vacío tiene profundidad 1. ### Parámetros - `arr`: Un array que puede contener números u otros arrays anidados. ### Valor de retorno Un número entero que representa la profundidad máxima de anidamiento del array. ### Ejemplos ```typescript arrayDepth([1, 2, 3]); // 1 arrayDepth([1, [2, 3]]); // 2 arrayDepth([1, [2, [3]]]); // 3 arrayDepth([]); // 1 arrayDepth([[[[]]]]) // 4 arrayDepth([1, [2], [[3]], [[[4]]]]); // 4 ``` ### Pista Usa recursión para explorar cada elemento del array. Si un elemento es un array, calcula su profundidad recursivamente y quédate con la mayor.