{"id":20271934,"url":"https://github.com/tanrax/soy-un-buen-programador-js","last_synced_at":"2025-04-11T04:32:43.528Z","repository":{"id":79955380,"uuid":"457678942","full_name":"tanrax/soy-un-buen-programador-js","owner":"tanrax","description":"Juego con retos sencillos de JavaScript para probarte a ti mismo que sabes lo que haces","archived":false,"fork":false,"pushed_at":"2022-10-06T16:51:57.000Z","size":121,"stargazers_count":11,"open_issues_count":29,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-25T02:39:53.740Z","etag":null,"topics":["functional-programming","javascript","programming-exercises"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tanrax.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-10T07:44:11.000Z","updated_at":"2022-09-28T17:00:46.000Z","dependencies_parsed_at":"2023-05-24T12:45:20.492Z","dependency_job_id":null,"html_url":"https://github.com/tanrax/soy-un-buen-programador-js","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanrax%2Fsoy-un-buen-programador-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanrax%2Fsoy-un-buen-programador-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanrax%2Fsoy-un-buen-programador-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanrax%2Fsoy-un-buen-programador-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tanrax","download_url":"https://codeload.github.com/tanrax/soy-un-buen-programador-js/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248345202,"owners_count":21088231,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["functional-programming","javascript","programming-exercises"],"created_at":"2024-11-14T12:40:19.442Z","updated_at":"2025-04-11T04:32:43.476Z","avatar_url":"https://github.com/tanrax.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Soy un buen programador JS\n\nJuego con retos sencillos de JavaScript para probarte a ti mismo que sabes lo que haces.\n\n\u003cimg src=\"logo.png\" width=\"250\"\u003e\n\n## Solo 2 Reglas\n\n1. Todas las variables deben ser constantes. No uses ni `let` ni `var`, solo `const`.\n2. Prohibido usar los bucles: `while` y `for`.\n\n## ¿Cómo se entrega?\n\nCrea un Issue y pégame el código. Encantado te daré retroalimentación.\n\n## ¿Cuál es la recompensa?\n\n- Si haces ejercicios: Mi feedback.\n- Si completas todos los ejercicios correctamente: Un diploma donde personalmente certifico tus habilidades.\n\n## ✅ Reto 1\n\nCrea un `Array` con números de 0 al 10.\n\n**Solución**:\n\nVideoexplicación: https://youtu.be/ROijmck2a6w\n\n```javascript\n// Forma 1 - La más equilibrada en recursos.\nArray(11).fill().map((valor, indice) =\u003e indice);\n\n// Forma 2\n[...Array(11).keys()]\n\n// Forma 3\nArray.from({length: 11}, (v, i) =\u003e i);\n```\n\n## ✅ Reto 2\n\nA partir del siguiente `Array`.\n\n```javascript\nconst miLista = [1, 9, 87, 3, 10, 4, 20, 2, 45];\n```\n\nCrea una nueva lista con números de 1 digito.\n\n```javascript\n// [1, 9, 3, 4, 2];\n```\n\n**Solución**:\n\nVideoexplicación: https://youtu.be/OfUt_BjoGcg\n\n```javascript\nconst miLista = [1, 9, 87, 3, 10, 4, 20, 2, 45];\nconst miLista1Decimal = miLista.filter((numero) =\u003e /\\b-?[0-9]\\b/.test(numero));\n```\n\n## ✅ Reto 3\n\nA partir del siguiente `Array`.\n\n```javascript\nconst miLista = [\"Lisp\", \"Clojure\", \"Haskell\", \"PHP\", \"Racket\"]\n```\n\nElimina el elemento que se encuentra en la posición 3. Insisto: posición 3, no por el string \"PHP\".\n\n**Solución**:\n\n```javascript\nconst miLista = [\"Lisp\", \"Clojure\", \"Haskell\", \"PHP\", \"Racket\"]\n\nconst miListaSinPHP = semana.filter(function(valor, indice) {\n    return indice !== 3\n});\n```\n\n## ✅ Reto 4\n\nA partir del siguiente `Array`.\n\n```javascript\nconst miLista = [\"Lisp\", \"Clojure\", \"Haskell\", \"Elm\", \"Racket\", \"Swift\", \"Erlang\", \"Scala\"]\n```\n\nObtén el número de elementos que contienen una letra \"s\" en su valor (o una \"s\" en su texto).\n\nSi quieres subir el nivel, no uses \"length\".\n\n**Solución**:\n\n```javascript\n// Solución 1 - Larga\nconst miLista = [ \"Lisp\", \"Clojure\", \"Haskell\", \"Elm\", \"Racket\", \"Swift\", \"Erlang\", \"Scala\" ];\nconst letra = \"s\";\n\nconst resultado = miLista\n  .filter((texto) =\u003e texto.toUpperCase().includes(letra.toUpperCase()))\n  .reduce((contador) =\u003e (contador += 1), 0);\n// 4\n\n// Solucion 2 - Corta\nconst resultado = miLista\n  .filter((texto) =\u003e /s/i.test(texto))\n  .reduce((contador) =\u003e (contador += 1), 0);\n// 4\n```\n\n## ✅ Reto 5\n\nCrea una función que elimine los acentos de un `string`. Prohibido usar `Regex` o `replace`.\n\n**Solución**:\n\n``` javascript\n/**\n * Devuelve un texto sin acentos\n * @param {string} text - Texto con acentos.\n * @return {string}\n */\nfunction removeAccents(text) {\n  const sustitutions = {\n    àáâãäå: \"a\",\n    ÀÁÂÃÄÅ: \"A\",\n    èéêë: \"e\",\n    ÈÉÊË: \"E\",\n    ìíîï: \"i\",\n    ÌÍÎÏ: \"I\",\n    òóôõö: \"o\",\n    ÒÓÔÕÖ: \"O\",\n    ùúûü: \"u\",\n    ÙÚÛÜ: \"U\",\n    ýÿ: \"y\",\n    ÝŸ: \"Y\",\n    ß: \"ss\",\n    ñ: \"n\",\n    Ñ: \"N\"\n  };\n  // Devuelve un valor si 'letter' esta incluido en la clave\n  function getLetterReplacement(letter, replacements) {\n    const findKey = Object.keys(replacements).reduce(\n      (origin, item, index) =\u003e (item.includes(letter) ? item : origin),\n      false\n    );\n    return findKey !== false ? replacements[findKey] : letter;\n  }\n  // Recorre letra por letra en busca de una sustitución\n  return text\n    .split(\"\")\n    .map((letter) =\u003e getLetterReplacement(letter, sustitutions))\n    .join(\"\");\n}\n\nremoveAccents(\"El bárbaro entró en cólera\");\n// \"El barbaro entro en colera\"\n```\n\n## ✅ Reto 6\n\nCrea una `Array` que muestre los primeros 10 números de la secuencia de Fibonacci.\n\n¿Subimos el nivel? Crea una función donde le indiques la cantidad de números que quieres en la secuencia.\n\n**Solución**:\n\n``` javascript\n/**\n * Devuelve una lista con la secuencia de Fibonacci\n * @param {number} long - Número de elementos deseados.\n * @param {Array\u003cnumber\u003e} sequence - Secuencia inicial.\n * @return {Array\u003cnumber\u003e}\n */\nfunction generate_fibonacci_sequence(long, sequence = [0, 1]) {\n  return sequence.length \u003c long\n    ? generate_fibonacci_sequence(\n        long,\n        sequence.concat(sequence.at(-1) + sequence.at(-2))\n      )\n    : sequence;\n}\n\ngenerate_fibonacci_sequence(4);\n// [0, 1, 1, 2]\n\ngenerate_fibonacci_sequence(10);\n// [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]\n```\n\n## ✅ Reto 7\n\nCrea una `Array` con 10 números aleatorios enteros sin que se repitan y estén ordenados de menor a mayor.\n\n**Solución**:\n\n``` javascript\nfunction obtenerListaAleatoria(longitud, lista=[]) {\n\tconst randomInt = parseInt(Math.random() * 100);\n\tconst nuevaListaConRandomInt = lista.concat(randomInt);\n\tconst nuevaListaSinRepetidos = [...(new Set(nuevaListaConRandomInt))];\n\tconst nuevaListaOrdenada = nuevaListaSinRepetidos.sort((a, b) =\u003e a - b);\n\treturn longitud \u003c= lista.length ? lista : obtenerListaAleatoria(longitud, nuevaListaOrdenada);\n}\n\nconsole.log(obtenerListaAleatoria(10));\n// [ 6, 26, 35, 41, 43, 60, 61, 67, 88, 93 ]\n```\n\n## ✅ Reto 8\n\nCrea una función que mueva elementos dentro de una `Array`. Por ejemplo, si quisiera mover Scala, que esta en la posición 7, a la posición 1: \n\n``` javascript\nconst miLista = [\"Lisp\", \"Clojure\", \"Haskell\", \"Elm\", \"Racket\", \"Swift\", \"Erlang\", \"Scala\"]\n\nmoverElemento(7, 1, miLista);\n\n// [\"Lisp\", \"Scala\", \"Clojure\", \"Haskell\", \"Elm\", \"Racket\", \"Swift\", \"Erlang\"]\n\n```\n\nComo puedes observar, no solo se han intercambiado, sino que el resto de elementos se han movido para hacerle sitio.\n\n**Solución**:\n\n``` javascript\nfunction moverElemento(\n    indexFrom,\n    indexTo,\n    list\n) {\n    // Guarda el elemento a mover\n    const moveValue = list[index];\n    // Crea una lista sin el elemento a mover\n    const listNotValue = list.filter(\n        (currentValue, currentIndex) =\u003e currentIndex != index\n    );\n    // Concadena todos los fragmentos: inicio del array + elemento + resto del array\n    return listNotValue\n        .slice(0, newPosition)\n        .concat(moveValue, listNotValue.slice(newPosition));\n}\n\nmoverElemento(7, 1, miLista);\n// [\"Lisp\", \"Scala\", \"Clojure\", \"Haskell\", \"Elm\", \"Racket\", \"Swift\", \"Erlang\"]\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanrax%2Fsoy-un-buen-programador-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanrax%2Fsoy-un-buen-programador-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanrax%2Fsoy-un-buen-programador-js/lists"}