{"id":559,"date":"2026-02-02T22:04:12","date_gmt":"2026-02-02T22:04:12","guid":{"rendered":"https:\/\/www.bogotajvm.com.co\/?page_id=559"},"modified":"2026-07-01T00:25:16","modified_gmt":"2026-07-01T00:25:16","slug":"funciones","status":"publish","type":"page","link":"https:\/\/www.bogotajvm.com.co\/en\/starter-kit\/funciones\/","title":{"rendered":"\u00a1Hola Mundo!"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"559\" class=\"elementor elementor-559\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6e0aa5d e-flex e-con-boxed e-con e-parent\" data-id=\"6e0aa5d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-00d9c31 e-con-full e-flex e-con e-child\" data-id=\"00d9c31\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-c985f09 e-con-full e-flex e-con e-child\" data-id=\"c985f09\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-54fb13d e-con-full e-flex e-con e-child\" data-id=\"54fb13d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d390060 elementor-widget elementor-widget-html\" data-id=\"d390060\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<link rel=\"license\" href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/\">\n\n<link rel=\"stylesheet\" href=\"css\/main.css\">\n<link href=\"https:\/\/cdn.jsdelivr.net\/npm\/prismjs@1.29.0\/themes\/prism.css\" rel=\"stylesheet\" \/>\n<link href=\"https:\/\/cdn.jsdelivr.net\/npm\/prismjs@1.29.0\/plugins\/line-numbers\/prism-line-numbers.css\" rel=\"stylesheet\" \/>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/prismjs@1.29.0\/prism.min.js\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/prismjs@1.29.0\/components\/prism-java.min.js\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/prismjs@1.29.0\/plugins\/line-numbers\/prism-line-numbers.min.js\"><\/script>\n\n\n<h1 id='hola-mundo'>\u00a1Hola Mundo!<\/h1>\n        <p>Las <strong>funciones<\/strong> son un concepto fundacional en la programaci\u00f3n. Tan importantes son que vale la pena que sean lo primero que aprendamos.<\/p>\n        <p>Una funci\u00f3n toma unos par\u00e1metros o input y produce un valor de retorno o output. Los pasos que se siguen para esa transformaci\u00f3n reciben el nombre de <strong>algoritmo<\/strong>.<\/p>\n\n<img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/02\/Hola-mundo-1.png\"\/>\n\n\n\n        <p>Ejemplos sencillos de una funci\u00f3n son:<\/p>\n\n        <ul>\n          <li>Un procedimiento que calcule el precio que el consumidor debe pagar, teniendo como <em>input<\/em> el precio base y el valor del impuesto a cobrar, y como <em>output<\/em> el precio final.<\/li>\n          <li>Un procedimiento que devuelva sin\u00f3nimos de una palabra, teniendo como <em>input<\/em> la palabra que nos interesa, y como <em>output<\/em> una lista de palabras.<\/li>\n          <li>Un procedimiento que indique si un a\u00f1o es bisiesto, teniendo como <em>input<\/em> el n\u00famero del a\u00f1o y como output un predicado verdadero si es bisiesto o falso en caso contrario.<\/li>\n          <li>Una funci\u00f3n que resuelva una sopa de letras, teniendo como <em>input<\/em> una cuadr\u00edcula cuadrada con letras may\u00fasculas y una lista de palabras a buscar, y como <em>output<\/em> una sopa de letras donde las palabras de la lista aparezcan destacadas.<\/li>\n        <\/ul>\n\n<img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/02\/Hola-mundo-2.png\"\/>\n\n        <p>Los algoritmos son secuenciales, llevamos a cabo un primer paso antes de llevar a cabo un segundo paso, etc. hasta que finalmente somos capaces de devolver el output esperado.<\/p>\n        <p>Veamos una funci\u00f3n muy sencilla:<\/p>\n\n        <figure class=\"code-block\">\n          <figcaption>C\u00f3digo 1 - \u00a1Hola Mundo!<\/figcaption>\n        <pre class=\"line-numbers\"><code class=\"language-java\">String saludos() {\n  return \"\u00a1Hola Mundo!\";\n}<\/code><\/pre>\n        <\/figure>\n\n        <div class=\"io-example\">\n          <div class=\"input\">\n            <div class=\"label\">Input<\/div>\n              <pre><code>&gt; saludos();<\/code><\/pre>\n            <\/div>\n          <div class=\"output\">\n            <div class=\"label\">Output<\/div>\n              <pre><code>\u00a1Hola Mundo!<\/code><\/pre>\n            <\/div>\n        <\/div>\n\n        <p>\u00a1Has escrito tu primera funci\u00f3n! Felicitaciones.<\/p>\n\n        <p>El C\u00f3digo 1 muestra una <strong>funci\u00f3n<\/strong> en Java que retorna una cadena de caracteres, llamadas String, en este caso \"Hola Mundo\".<\/p>\n\n        <aside class=\"aside-box note\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>El libro \"The C Programming Language\", de 1978, escrito por Dennis Ritchie y Brian Kernighan, es considerado uno de los libros m\u00e1s influyentes en nuestra industria. El primer ejemplo de c\u00f3digo en ese libro\n                    es un programa que imprime \"\u00a1Hola mundo!\" en la pantalla y se ha vuelto costumbre que todos los tutoriales de programaci\u00f3n hagan lo mismo. Esta referencia ha entrado en la cultura popular e incluso se ha \n                    convertido en sin\u00f3nimo de dar un ejemplo con los elementos m\u00e1s simples de un concepto.<\/p>\n            <\/div>\n        <\/aside>\n\n        <p>La l\u00ednea 01 tiene 3 aspectos importantes de todas las funciones, en orden:<\/p>\n\n        <ol>\n          <li><strong>Valor de retorno<\/strong> u <strong>output<\/strong>, en nuestro ejemplo String. El valor de retorno es importante para saber qu\u00e9 vamos a obtener despu\u00e9s de llamar a nuestra funci\u00f3n.<\/li>\n          <li>El <strong>identificador<\/strong> de la funci\u00f3n, en nuestro caso saludos. El identificador es importante para poder distinguir las diferentes funciones que tengamos.<\/li>\n          <li>Y los <strong>par\u00e1metros<\/strong> o <strong>input<\/strong>, que siempre est\u00e1n entre par\u00e9ntesis,   &laquo;(\" y \")&raquo;. En este caso no hay par\u00e1metros, nuestra funci\u00f3n siempre va a retornar el mismo valor.<\/li>\n        <\/ol>\n\n        <p>Estos 3 elementos se llaman la <strong>firma<\/strong> de una funci\u00f3n.<\/p>\n\n        <p>Al final de la l\u00ednea 01 encontramos una llave de apertura &laquo;{&raquo; y en la l\u00ednea 03 encontramos una llave de cierre &laquo;}&raquo;, ellas forman un <strong>bloque<\/strong>. Los bloques nos ayudan a agrupar las instrucciones de nuestra funci\u00f3n y de esta forma reconocer r\u00e1pidamente una instrucci\u00f3n a qu\u00e9 funci\u00f3n pertenece.<\/p>\n\n        <p>La l\u00ednea 02 tiene una <strong>sentencia<\/strong> f\u00e1cilmente identificable por el punto y coma, &laquo;;&raquo;, al final. En este caso es una <strong>sentencia return<\/strong>, indicada por la palabra clave return usada en ella, que nos indica cu\u00e1l es el output de la funci\u00f3n. T oda funci\u00f3n debe terminar en una sentencia return impl\u00edcita o expl\u00edcita. Luego viene un String, indicado por comillas dobles \", que rodean la cadena de caracteres \"\u00a1Hola Mundo!\".<\/p>\n\n        <p>Leyendo el c\u00f3digo podemos ver que al llamar la funci\u00f3n saludos() obtendremos la cadena de caracteres \"\u00a1Hola Mundo!\"<\/p>\n\n        <p>Esta es una de las funciones m\u00e1s simples que podemos hacer, con el pasar de los cap\u00edtulos iremos aprendiendo c\u00f3mo hacer funciones m\u00e1s complejas.<\/p>\n\n        <p>Revisemos cada concepto en m\u00e1s detalle.<\/p>\n\n        <dl>\n          <dt><strong>Valor de Retorno<\/strong><\/dt>\n          <dd>El valor de retorno del c\u00f3digo 01 es String, que representa una cadena de caracteres. Sin embargo las funciones pueden retornar otros tipos de datos, como n\u00fameros, fechas o incluso tipos de datos que nosotros mismos definamos.<\/dd>\n          <dt><strong>Identificadores<\/strong><\/dt>\n          <dd>El identificador del c\u00f3digo 01 es &laquo;saludos&raquo;. El uso de un buen identificador es muy importante para nuestra capacidad de entender el c\u00f3digo que nosotros escribimos o que escriben otras personas. Sin embargo no todos los identificadores son v\u00e1lidos, hay unas reglas b\u00e1sicas. Aqu\u00ed las m\u00e1s importantes:<\/dd>\n        <\/dl>\n\n        <table class=\"identifier-table\">\n          <thead>\n            <tr>\n              <th>Identificador<\/th>\n              <th>\u00bfV\u00e1lido?<\/th>\n              <th>Explicaci\u00f3n<\/th>\n            <\/tr>\n          <\/thead>\n          <tbody>\n            <tr>\n              <td><code>mi saludo maravilloso<\/code><\/td>\n              <td class=\"invalid\">&#x274c;<\/td>\n              <td>Los identificadores no pueden tener espacios.<\/td>\n            <\/tr>\n            <tr>\n              <td><code>101saludos<\/code><\/td>\n              <td class=\"invalid\">&#x274c;<\/td>\n              <td>Los identificadores pueden tener n\u00fameros, pero no pueden empezar con ellos.<\/td>\n            <\/tr>\n            <tr>\n              <td><code>SopaDeLetras<\/code><\/td>\n              <td class=\"valid\">&#x2705;<\/td>\n              <td>Los identificadores pueden llevar may\u00fasculas y min\u00fasculas.<\/td>\n            <\/tr>\n            <tr>\n              <td><code>CONSTANTE_GRAVITACIONAL<\/code><\/td>\n              <td class=\"valid\">&#x2705;<\/td>\n              <td>Los identificadores pueden usar \"_\", por ejemplo para separar palabras en may\u00fasculas.<\/td>\n            <\/tr>\n          <\/tbody>\n        <\/table>\n\n        <aside class=\"aside-box error\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>Si usas un identificador que no sea v\u00e1lido, tu programa no va a compilar y a veces tendr\u00e1 un mensaje un poco cr\u00edptico. Afortunadamente hay una manera sencilla de evitar estos errores: evita los espacios y los n\u00fameros como caracteres iniciales, lo dem\u00e1s es un poco intuitivo.<\/p>\n            <\/div>\n        <\/aside>\n\n        <aside class=\"aside-box error\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>Las may\u00fasculas y min\u00fasculas son importantes en los identificadores que uses. Una funci\u00f3n que se llama saludos es diferente de una que se llame Saludos. Si no usas el identificador exacto de una funci\u00f3n obtendr\u00e1s un error de compilaci\u00f3n.<\/p>\n            <\/div>\n        <\/aside>\n\n        <aside class=\"aside-box info\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>Hay algunas convenciones en el mundo de la programaci\u00f3n que conviene seguir. La m\u00e1s usada para los identificadores en lenguajes como Java es el uso de <em>Camel Case<\/em>: Se escriben  primordialmente en min\u00fasculas pero si un identificador usa m\u00e1s de una palabra entonces la letra inicial va en may\u00fasculas. Algunos ejemplos ser\u00edan: SopaDeLetras, miSaludo, unIdentificadorMuyLargo, etc. Si adem\u00e1s la primera letra es tambi\u00e9n may\u00fascula se llama <em>Uppercase Camel Case<\/em>, sino se llama <em>Lowercase Camel Case<\/em>. En Java la convenci\u00f3n es que las funciones y las variables utilicen <em>Lowercase Camel Case<\/em>.<\/p>\n            <\/div>\n        <\/aside>\n\n        <dl>\n          <dt><strong>Par\u00e1metros<\/strong><\/dt>\n          <dd>Los par\u00e1metros siempre van despu\u00e9s del identificador de una funci\u00f3n y van entre par\u00e9ntesis. Si no hay nada entre los par\u00e9ntesis es porque la funci\u00f3n no tiene par\u00e1metros. Las funciones sin par\u00e1metros suelen ser poco comunes, pero a veces son \u00fatiles. Pronto veremos funciones con par\u00e1metros.<\/dd>\n          <dt><strong>Bloques<\/strong><\/dt>\n          <dd>En el c\u00f3digo 01, vemos un <strong>bloque<\/strong> delimitado por las llaves, la de apertura en la l\u00ednea 01 y la de cierre en la l\u00ednea 03. Un bloque siempre es una manera de agrupar elementos de nuestro c\u00f3digo. Si tenemos muchas l\u00edneas de c\u00f3digo es importante poder entender r\u00e1pidamente a d\u00f3nde pertenecen. Por ejemplo la l\u00ednea 02 sabemos que pertenece a la funci\u00f3n saludos porque est\u00e1 definida dentro del bloque de esa funci\u00f3n. Adem\u00e1s de funciones, hay otros elementos que usan bloques y en todos cumplen la misma funci\u00f3n: agrupar.<\/dd>\n        <\/dl>\n\n        <aside class=\"aside-box question\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>El uso de caracteres espec\u00edficos no es la \u00fanica manera en la que los lenguajes de programaciones agrupan cosas. He aqu\u00ed 2 ejemplos adicionales de c\u00f3mo lo hacen, el primero en el lenguaje Python y el segundo en Basic:<\/p>\n                <p><pre><code>def saludos() :\n   return \u201c\u00a1Hola Mundo!\u201d<\/code><\/pre><\/p>\n                <p><pre><code>Function saludos()\n   return \u201cHello World!\u201d\n End Function<\/code><\/pre><\/p>\n                <p>En el primer ejemplo, se utilizan los niveles de tabulaci\u00f3n, un elemento pertenece al elemento que tiene un nivel menos de tabulaci\u00f3n. En el segundo, en vez de utilizar un caracter arbitrario, se utilizan palabras en ingl\u00e9s para indicar el inicio y el fin de un elemento.<\/p>\n                <p>\u00bfCu\u00e1les crees que son las ventajas y desventajas de los 3 m\u00e9todos?<\/p>\n            <\/div>\n        <\/aside>\n\n        <dl>\n          <dt><strong>Sentencias<\/strong><\/dt>\n          <dd>Finalmente en la l\u00ednea 02 hay una sentencia. Una sentencia indica una instrucci\u00f3n que se le da al computador. Una sentencia siempre termina en &laquo;;&raquo;.<\/dd>\n          <dt><strong>Bloques<\/strong><\/dt>\n          <dd>En el c\u00f3digo 01, vemos un <strong>bloque<\/strong> delimitado por las llaves, la de apertura en la l\u00ednea 01 y la de cierre en la l\u00ednea 03. Un bloque siempre es una manera de agrupar elementos de nuestro c\u00f3digo. Si tenemos muchas l\u00edneas de c\u00f3digo es importante poder entender r\u00e1pidamente a d\u00f3nde pertenecen. Por ejemplo la l\u00ednea 02 sabemos que pertenece a la funci\u00f3n saludos porque est\u00e1 definida dentro del bloque de esa funci\u00f3n. Adem\u00e1s de funciones, hay otros elementos que usan bloques y en todos cumplen la misma funci\u00f3n: agrupar.<\/dd>\n        <\/dl>\n\n        <p>Todas las funciones deben terminar en una sentencia return, es decir una sentencia que inicia con la palabra clave <strong>return<\/strong>. Una sentencia return indica el valor que se va a retornar una vez que la funci\u00f3n termina de ser ejecutada. En la funci\u00f3n &laquo;saludos&raquo;; siempre retornamos la misma cadena de caracteres: \"\u00a1Hola Mundo!\"<\/p>\n\n        <p>Pronto escribiremos funciones m\u00e1s complejas. Las funciones pueden tener m\u00faltiples sentencias, cada una haciendo un paso intermedio para calcular el valor final. Lo m\u00e1s importante a tener en cuenta es que una funci\u00f3n se ejecuta una l\u00ednea a la vez, en el orden que aparecen.<\/p>\n\n        <aside class=\"aside-box error\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>Uno de los errores m\u00e1s comunes al aprender a programar en Java es olvidar poner el &laquo;;&raquo; al final de una sentencia. \u00a1No olvides tus &laquo;;&raquo;!<\/p>\n            <\/div>\n        <\/aside>\n\n        <aside class=\"aside-box note\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>Los &laquo;;&raquo; son importantes porque permiten al compilador identificar d\u00f3ndetermina una sentencia, de igual manera que los humanos necesitamos un \".\" para saber d\u00f3nde termina una oraci\u00f3n. Hay otros lenguajes que usan el caracter de final de l\u00ednea para indicar el final de una sentencia. Por lo que no se puede poner m\u00e1s una sentencia por l\u00ednea de c\u00f3digo, algo que antes los programadores ve\u00edan como inconveniente aunque hoy en d\u00eda es mucho m\u00e1s aceptado. Por lo tanto los lenguajes deben tomar una decisi\u00f3n: permitir m\u00e1s de una sentencia por l\u00ednea, necesitando un caracter como \";\" para separarlas, o permitir una sola sentencia por l\u00ednea y no usar ning\u00fan delimitador.<\/p>\n            <\/div>\n        <\/aside>\n\n        <aside class=\"aside-box idea\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>Hist\u00f3ricamente las funciones se han asociado a la reutilizaci\u00f3n de c\u00f3digo, pero, el verdadero poder de las funciones vienen de la legibilidad que agregan a nuestro c\u00f3digo. Asignando un nombre a un algoritmo hacemos nuestro c\u00f3digo m\u00e1s f\u00e1cil de entender. Est\u00e1 bien escribir una funci\u00f3n incluso si no esperas reusarla.<\/p>\n                <p>La reutilizaci\u00f3n es un bono adicional a la legibilidad.<\/p>\n            <\/div>\n        <\/aside>\n\n        <h2 id='hola-java'>\u00a1Hola Mundo! \u00a1Hola Java!<\/h2>\n\n        <figure class=\"code-block\">\n          <figcaption>C\u00f3digo 2 - saludos() con par\u00e1metros<\/figcaption>\n            <pre class=\"line-numbers\"><code class=\"language-java\">String saludosPara(String quien) {\n  return String.format(\"\u00a1Hola %s!\", quien);\n}<\/code><\/pre>\n        <\/figure>\n\n        <div class=\"io-example\">\n          <div class=\"input\">\n            <div class=\"label\">Input<\/div>\n              <pre><code>&gt; saludosPara(\"Mundo\");\n&gt; saludosPara(\"Java\")<\/code><\/pre>\n            <\/div>\n          <div class=\"output\">\n            <div class=\"label\">Output<\/div>\n              <pre><code>\u00a1Hola Mundo!\n\u00a1Hola Java!<\/code><\/pre>\n            <\/div>\n        <\/div>\n\n        <p>La funci\u00f3n saludosPara() es muy similar a la funci\u00f3n saludos() pero ahora tiene un par\u00e1metro. Un par\u00e1metro agrega flexibilidad a una funci\u00f3n, dado que una funci\u00f3n sin par\u00e1metros retornar\u00eda siempre el mismo valor. \u00bfQu\u00e9 sucede si queremos saludar, no solo al mundo, sino a otras personas o cosas? \u00a1Par\u00e1metros al rescate!<\/p>\n\n        <p>En la l\u00ednea 01 se define un par\u00e1metro dentro de los par\u00e9ntesis. Un par\u00e1metro tiene 2 partes: un tipo de dato, como lo tienen los valores de retorno, y un identificador. Para el C\u00f3digo 02 el par\u00e1metro tambi\u00e9n es un String y decidimos usar el identificador \"quien\" para ayudar a recordar el papel que tiene dentro de la funci\u00f3n. Podr\u00edamos haber usado cualquier identificador y la funci\u00f3n seguir\u00eda retornando el valor esperado, pero usar un buen identificador hace que nuestro c\u00f3digo sea m\u00e1s legible.<\/p>\n\n        <aside class=\"aside-box warning\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>Vas a escuchar que en muchos lugares vamos a hablar sobre c\u00f3mo algunas recomendaciones hacen el c\u00f3digo m\u00e1s legible. \u00bfSi una m\u00e1quina va a ejecutar el c\u00f3digo, por qu\u00e9 nos preocupamos por que sea legible para un humano? Antes de que un c\u00f3digo sea ejecutado, los humanos tienen que leerlo y entenderlo.\n            <p>\n                \n            <\/p>Para poder corregir errores en ellos, para poder extenderlos e incluso para aprender de ellos. De hecho es algo que hace unos a\u00f1os no se mencionaba en la industria y hab\u00eda una cierta mentalidad de que escribir c\u00f3digo cr\u00edptico era ch\u00e9vere porque las personas se sent\u00edan orgullosas de entender c\u00f3digo que otros no pod\u00edan. Pero lo malo es que esas mismas personas olvidaban r\u00e1pidamente la raz\u00f3n por la cu\u00e1l su c\u00f3digo cr\u00edptico funcionaba. \n            <p>\n                \n            <\/p>Trata de dedicar un poco de tiempo a pensar un buen identificador para los elementos de tu c\u00f3digo. Es dif\u00edcil hacerlo y quiz\u00e1s no te salga en tu primer intento pero no te sientas desalentado, con la pr\u00e1ctica se vuelve m\u00e1s sencillo.<\/p>\n            <\/div>\n        <\/aside>\n\n        <p>Una funci\u00f3n puede tener varios par\u00e1metros, separados por comas, y de cualquier tipo. Por ahora solo usaremos Strings porque son f\u00e1ciles de usar y de hecho son bastante importantes en la programaci\u00f3n.<\/p>\n\n        <p>La l\u00ednea 02 usa la funci\u00f3n String.format(), \u00bfde d\u00f3nde sali\u00f3? Resulta que todos los lenguajes de programaci\u00f3n incluyen una librer\u00eda est\u00e1ndar con funciones generales. De esta manera sin haber escrito una l\u00ednea de c\u00f3digo, ya tienes la capacidad de hacer muchas cosas.<\/p>\n\n        <aside class=\"aside-box idea\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>\"No reinventar la rueda\" es una frase muy com\u00fan en programaci\u00f3n. Es muy importante conocer la librer\u00eda est\u00e1ndar del lenguaje de programaci\u00f3n que utilices porque te har\u00e1 m\u00e1s eficiente en el c\u00f3digo que escribas.<\/p>\n            <\/div>\n        <\/aside>\n\n        <p>String.format() permite crear una cadena de caracteres combinando diferentes partes. La funci\u00f3n necesita al menos 2 par\u00e1metros: un formato y un valor que suele venir de una variable, en nuestro caso un parametro. En este caso tenemos un formato de saludo y tenemos a quien queremos saludar. El formato necesita un marcador de posici\u00f3n para saber c\u00f3mo formar el String resultante, en String.format() este es \"%s\". La funci\u00f3n va a tomar los argumentos y va a ir reemplazando los marcadores de posici\u00f3n con ellos.<\/p>\n\n        <p>Podemos pensar la ejecuci\u00f3n de saludosPara() en 3 reemplazos:<\/p>\n\n        <ol>\n          <li>saludosPara(\"Mundo\")<\/li>\n          <li>String.format(\"\u00a1Hola %s!\")<\/li>\n          <li>\"\u00a1Hola Mundo!\"<\/li>\n        <\/ol>\n\n        <p>Si utilizamos diferentes argumentos, \"Java\" en vez de \"Mundo\", obtendremos diferentes saludos.<\/p>\n\n        <aside class=\"aside-box error\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>Invocar una funci\u00f3n con menos o m\u00e1s argumentos que su n\u00famero de par\u00e1metros es un error de compilaci\u00f3n. Adicionalmente usar un argumento de diferente tipo tambi\u00e9n es error de compilaci\u00f3n, por ejemplo no pasar un String cuando el par\u00e1metro esperado es un String.<\/p>\n            <\/div>\n        <\/aside>\n\n        <p>\u00a1Genial! Ya podemos crear saludos a todo lo que se nos ocurra.<\/p>\n\n        <aside class=\"aside-box info\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>La documentaci\u00f3n oficial de String.format() est\u00e1 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.base\/java\/lang\/String.html#format(java.lang.String,java.lang.Object...)\">aqu\u00ed<\/a>.<\/p>\n                <p>Puede parecer un poco desalentador leerla  ahora, pero sentirse c\u00f3modo leyendo documentaci\u00f3n oficial es una habilidad muy importante que ser\u00eda bueno empezar a practicar. \u00a1No importa tus a\u00f1os de experiencia, leer la documentaci\u00f3n oficial es algo que seguir\u00e1s haciendo!<\/p>\n            <\/div>\n        <\/aside>\n\n        <h2 id='hola-java-refactor'>\u00a1Hola Mundo! version 2.0<\/h2>\n\n        <figure class=\"code-block\">\n          <figcaption>C\u00f3digo 3 - \u00a1Hola Mundo! 2.0<\/figcaption>\n            <pre class=\"line-numbers\"><code class=\"language-java\">String saludosPara(String quien) {\n  return String.format(\"\u00a1Hola %s!\", quien);\n}\n\nString saludos() {\n  return saludosPara(\"Mundo\");\n}<\/code><\/pre>\n        <\/figure>\n\n        <div class=\"io-example\">\n          <div class=\"input\">\n            <div class=\"label\">Input<\/div>\n              <pre><code>&gt; saludos();\n&gt; saludosPara(\"Mundo\")<\/code><\/pre>\n            <\/div>\n          <div class=\"output\">\n            <div class=\"label\">Output<\/div>\n              <pre><code>\u00a1Hola Mundo!\n\u00a1Hola Mundo!<\/code><\/pre>\n            <\/div>\n        <\/div>\n\n        <p>Cuando escribimos la funci\u00f3n saludosPara() \u00bfno se te hizo algo familiar? De alguna manera podemos ver como saludos() y saludosPara() tienen alguna similitud. De hecho si lo piensas bien, \u00a1saludos() es una versi\u00f3n espec\u00edfica de saludosPara()! Es una versi\u00f3n de saludosPara() que siempre saluda al Mundo.<\/p>\n\n        <p>Esta relaci\u00f3n la podemos poner de manifiesto en el c\u00f3digo, y lo que podemos hacer es invocar a la funci\u00f3n saludosPara() dentro de saludos(). Esto es una manera de reutilizaci\u00f3n de c\u00f3digo que es una muy buena pr\u00e1ctica y una muy importante en programaci\u00f3n, de hecho antes hemos visto que tiene un lema \u201cNo reinventar la rueda\u201d. Y de una manera anexa, tambi\u00e9n es una manera de reducir la repetici\u00f3n en nuestro c\u00f3digo que es igualmente una muy importante pr\u00e1ctica.<\/p>\n\n        <aside class=\"aside-box idea\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>DRY es una sigla para Don't Repeat your Code. Si tenemos repetici\u00f3n en nuestro c\u00f3digo, cuando queramos ampliarlo o corregirlo tenemos que tener cuidado de hacer los cambios en todas las partes. Si olvidamos hacerlo entonces tendremos un sistema inconsistente y a veces eso genera errores sutiles dif\u00edciles de encontrar. Al evitar la repetici\u00f3n nos aseguramos de evitar este tipo de problemas.<\/p>\n            <\/div>\n        <\/aside>\n\n        <p>Con el C\u00f3digo 03, si m\u00e1s adelante queremos cambiar el formato del saludo, entonces solo tendremos un lugar donde hacer el cambio, pero ambas funciones ver\u00e1n el cambio.<\/p>\n\n        <p>El C\u00f3digo 03 tambi\u00e9n nos reitera que dentro de una funci\u00f3n podemos usar funciones dentro de funciones incluso las que hemos definido nosotros. No solo es permitido sino que es algo que debemos fomentar. En un sentido, la programaci\u00f3n trata de hacer peque\u00f1as partes y despu\u00e9s usar esas peque\u00f1as para crear partes m\u00e1s complejas.<\/p>\n\n        <p>Es muy importante que empieces a ejercitar el h\u00e1bito de escribir peque\u00f1as funciones y utilizarlas como partes de otra funci\u00f3n. Lo inverso es tambi\u00e9n importante, si vas a crear una funci\u00f3n, piensa c\u00f3mo puedes dividir el algoritmo en partes m\u00e1s peque\u00f1as y escribir una funci\u00f3n para cada una.<\/p>\n\n        <aside class=\"aside-box idea\">\n            <div class=\"icon\"><\/div>\n            <div class=\"content\">\n                <p>Cuando est\u00e9s escribiendo una funci\u00f3n, piensa en c\u00f3mo puedes implementarla en t\u00e9rminos de funciones m\u00e1s peque\u00f1as. Esto te dar\u00e1 la oportunidad de reutilizarlas m\u00e1s adelante har\u00e1 que tus funciones sean m\u00e1s f\u00e1ciles de leer y de probar.<\/p>\n            <\/div>\n        <\/aside>\n\n        <h2 id='espacio-en-blanco'>Espacio en blanco<\/h2>\n        <figure class=\"code-block\">\n          <figcaption>C\u00f3digo 4 - saludosPara() con mucho espacio en blanco<\/figcaption>\n            <pre class=\"line-numbers\"><code class=\"language-java\">String saludosPara\n(String quien) \n{\n      return String.format(\"\u00a1Hola %s!\", quien);\n}<\/code><\/pre>\n        <\/figure>\n        <figure class=\"code-block\">\n          <figcaption>C\u00f3digo 5 - saludosPara() con no mucho espacio en blanco<\/figcaption>\n            <pre class=\"line-numbers\"><code class=\"language-java\">String saludosPara(String quien){return String.format(\"\u00a1Hola %s!\", quien);}<\/code><\/pre>\n        <\/figure>\n        <p>El espacio en blanco es cualquier caracter que parezca un espacio, esto incluye espacios, tabulaciones y saltos en l\u00ednea. El espacio en blanco no tiene ninguna afectaci\u00f3n en el funcionamiento de una funci\u00f3n, es netamente una opci\u00f3n para mejorar la legibilidad para los seres humanos. Cu\u00e1nto espacio en blanco es el exacto para mejorar la legibilidad de un c\u00f3digo es una cuesti\u00f3n subjetiva, pero parece claro que el C\u00f3digo 04 tiene mucho y el C\u00f3digo 05 tiene muy poco. Por lo tanto, busca escribir c\u00f3digo con una cantidad de espacio en blanco que est\u00e9 entre esos dos estilos, pero sobre todo no temas agregar un poco de espacio en blanco para darle espacio a respirar a los elementos que componen una sentencia para hacerlos m\u00e1s f\u00e1ciles de entender.<\/p>\n        <aside class=\"aside-box idea\">\n          <div class=\"icon\"><\/div>\n          <div class=\"content\">\n              <p>Despu\u00e9s de escribir una funci\u00f3n, dale un vistazo y mira si se siente densa. En caso de duda, pide una segunda opini\u00f3n. Agrega un poco de espacio en blanco para hacerla m\u00e1s sencilla a los ojos.<\/p>\n          <\/div>\n        <\/aside>\n\n        <h2 id='comentarios'>Comentarios<\/h2>\n        <figure class=\"code-block\">\n          <figcaption>C\u00f3digo 6 - Comentarios<\/figcaption>\n            <pre class=\"line-numbers\"><code class=\"language-java\">String saludosPara(String quien) {\n  return String.format(\"\u00a1Hola Mundo!\" ,quien);\n}\n\nString saludos() {\n  return saludosPara(\"Mundo!\"); \/\/ evitar repetici\u00f3n\n}<\/code><\/pre>\n        <\/figure>\n        <p>La l\u00ednea 06 tiene un comentario de una sola l\u00ednea, empieza con \u201c\/\/\u201d y termina en el siguiente salto de l\u00ednea. Los comentarios son ignorados por el compilador, son realmente para dejar notas para las personas que puedan leer el c\u00f3digo.<\/p>\n        <p>Dejar notas en tu c\u00f3digo puede ayudar a que sea m\u00e1s f\u00e1cil de entender. Pero ten cuidado de que el comentario no se desactualice si cambias el c\u00f3digo.<\/p>\n        <aside class=\"aside-box info\">\n          <div class=\"icon\"><\/div>\n          <div class=\"content\">\n              <p>Tambi\u00e9n existen los comentarios de m\u00faltiples l\u00edneas, que empiezan con \/* y terminan con *\/ y como su nombre lo indica pueden englobar m\u00faltiples l\u00edneas. No es necesario, pero tiende a usarse, que cada l\u00ednea intermedia empiece con un * para darle un aspecto est\u00e9tico. Este es un comentario de m\u00faltiples l\u00edneas:<\/p>\n              <pre class=\"line-numbers\"><code class=\"language-java\">\/*\n * Este es un comentario de m\u00faltiples l\u00edneas\n *\/<\/code><\/pre>\n              <p>Los comentarios de una sola l\u00ednea son usualmente preferidos porque es muy sencillo comentar mucho c\u00f3digo, y despu\u00e9s descomentar partes de \u00e9l. Sin embargo es importante conocerlos porque los vas a encontrar en algunas partes.<\/p>\n          <\/div>\n        <\/aside>\n        \n        <script> \n \/* Estilo general para el bloque de c\u00f3digo Java *\/\npre[class*=\"language-\"] {\n    background-color: #282c34; \/* Fondo oscuro *\/\n    color: #abb2bf;           \/* Color de texto base *\/\n    padding: 1em;\n    border-radius: 5px;\n    overflow: auto;\n}\n\n\/* Estilos para palabras clave espec\u00edficas de Java (Prism.js usa estos tokens) *\/\n.language-java .token.keyword {\n    color: #c678dd; \/* Color violeta para 'public', 'class', etc. *\/\n    font-weight: bold;\n}\n\n.language-java .token.string {\n    color: #98c379; \/* Color verde para texto entre comillas *\/\n}\n\n.language-java .token.function {\n    color: #61afef; \/* Color azul para nombres de m\u00e9todos *\/\n}\n<\/script>\n\n       \t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c962131 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"c962131\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9d25ce1 e-con-full e-flex e-con e-child\" data-id=\"9d25ce1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-24c064f e-con-full e-flex e-con e-child\" data-id=\"24c064f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-394cc619 elementor-widget elementor-widget-html\" data-id=\"394cc619\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\n   <h1 id='Quiz'>Funciones<\/h1>\n  <p class=\"subtitle\">Quiz Interactivo<\/p>\n  <hr \/>\n\n  <!--\n    The quiz will render inside this div.\n    Show a brief intro before the quiz starts \u2014 clicking the button calls QuizEngine.init().\n  -->\n  <div id=\"quiz-root\">\n    <div class=\"start-screen\">\n      <p>Antes de intentar los ejercicios, toma unos minutos para verificar tu entendimiento de Funciones tomando este quiz.<\/p>\n      <ul>\n        <li>Las preguntas y el orden de las opciones son diferentes cada vez que tomes el quiz.<\/li>\n        <li>Las preguntas que tengas mal, vuelven a aparecer luego hasta que las contestes correctamente.<\/li>\n        <li>Cada pregunta tiene una pista y una explicaci\u00f3n.<\/li>\n      <\/ul>\n      <button class=\"qe-start-btn\" onclick=\"QuizEngine.init('quiz-root')\">Empezar \u2192<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- Load engine first, then the chapter data, then kick off -->\n  <script src=\"quiz-engine.js\"><\/script>\n  <script src=\"quiz-data-chapter1.js\"><\/script>\n  \n  <script>\nconst QuizEngine = (() => {\n\n  \/* \u2500\u2500 Utilities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\n  function shuffle(arr) {\n    const a = [...arr];\n    for (let i = a.length - 1; i > 0; i--) {\n      const j = Math.floor(Math.random() * (i + 1));\n      [a[i], a[j]] = [a[j], a[i]];\n    }\n    return a;\n  }\n\n  function prepareQuestion(q) {\n    \/\/ Attach a shuffled copy of options; preserve the original for reference\n    return { ...q, _options: shuffle(q.options) };\n  }\n\n  \/* \u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\n  let root, allQuestions, queue, nonPassed, current;\n  let stats = { total: 0, firstPassCorrect: 0, attempts: 0 };\n  let isFirstPass = true;\n\n  \/* \u2500\u2500 Render helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\n  function progressLabel(offset = 0) {\n    const remaining = queue.length + nonPassed.length;\n    const done = stats.total - remaining - offset;\n    return `Pregunta ${done + 1} de ${stats.total}`;\n  }\n\n  function renderQuestion() {\n    current = queue.shift();\n    const opts = current._options;\n\n    root.innerHTML = `\n      <div class=\"qe-wrap\">\n        <div class=\"qe-progress\">\n          <div class=\"qe-progress-bar\" style=\"width:${\n            ((stats.total - queue.length - nonPassed.length - 1) \/ stats.total) * 100\n          }%\"><\/div>\n        <\/div>\n        <p class=\"qe-label\">${progressLabel(1)}<\/p>\n        <h2 class=\"qe-question\">${current.question}<\/h2>\n        <ul class=\"qe-options\" role=\"list\">\n          ${opts.map((o, i) => `\n            <li>\n              <button class=\"qe-option\" data-index=\"${i}\" aria-label=\"Option ${i + 1}: ${o.text}\">\n                <span class=\"qe-option-key\">${['A','B','C','D'][i]}<\/span>\n                <span class=\"qe-option-text\">${o.text}<\/span>\n              <\/button>\n            <\/li>\n          `).join('')}\n        <\/ul>\n        <div class=\"qe-feedback\" aria-live=\"polite\"><\/div>\n      <\/div>`;\n\n    root.querySelectorAll('.qe-option').forEach(btn => {\n      btn.addEventListener('click', () => handleAnswer(btn, opts));\n    });\n  }\n\n  function handleAnswer(btn, opts) {\n    stats.attempts++;\n    const idx = parseInt(btn.dataset.index, 10);\n    const chosen = opts[idx];\n    const feedback = root.querySelector('.qe-feedback');\n\n    \/\/ Disable all buttons to prevent double-clicks\n    root.querySelectorAll('.qe-option').forEach(b => b.disabled = true);\n\n    if (chosen.correct) {\n      btn.classList.add('qe-correct');\n      if (isFirstPass) stats.firstPassCorrect++;\n\n      feedback.innerHTML = `\n        <p class=\"qe-feedback-correct\">\u2713 Correcto!<\/p>\n        ${current.explanation ? `<p class=\"qe-feedback-explanation\">${current.explanation}<\/p>` : ''}`;\n\n      setTimeout(() => {\n        if (queue.length === 0 && nonPassed.length === 0) {\n          \/\/ All done on first pass or no more retries needed\n          if (isFirstPass && nonPassed.length === 0) {\n            renderComplete();\n          } else {\n            renderComplete();\n          }\n        } else if (queue.length === 0 && nonPassed.length > 0) {\n          startRetryRound();\n        } else {\n          renderQuestion();\n        }\n      }, current.explanation ? 2200 : 1000);\n\n    } else {\n      btn.classList.add('qe-wrong');\n\n      \/\/ Grey out all options equally \u2014 no correct answer revealed\n      root.querySelectorAll('.qe-option').forEach(b => b.classList.add('qe-dimmed'));\n\n      feedback.innerHTML = `\n        <p class=\"qe-feedback-wrong\">\u2717 No exactamente.<\/p>\n        ${current.hint ? `<p class=\"qe-feedback-hint\"><strong>Pista:<\/strong> ${current.hint}<\/p>` : ''}\n       \n        <button class=\"qe-next-btn\">Siguiente pregunta \u2192<\/button>`;\n\n      \/\/ Save to nonPassed (fresh shuffle of its options)\n      nonPassed.push(prepareQuestion(current));\n\n      feedback.querySelector('.qe-next-btn').addEventListener('click', () => {\n        if (queue.length === 0) {\n          startRetryRound();\n        } else {\n          renderQuestion();\n        }\n      });\n    }\n  }\n\n  function startRetryRound() {\n    isFirstPass = false;\n    queue = shuffle(nonPassed.map(q => prepareQuestion(q)));\n    nonPassed = [];\n    stats.total = queue.length; \/\/ reset progress counter for retry round\n    stats.attempts = 0;\n\n    root.innerHTML = `\n      <div class=\"qe-wrap qe-interlude\">\n        <div class=\"qe-interlude-icon\">\u21a9<\/div>\n        <h2>Ya casi!<\/h2>\n        <p>Revisemos las ${queue.length} pregunta${queue.length > 1 ? 's' : ''} que fallaste. Mismas preguntas, diferente orden.<\/p>\n        <button class=\"qe-start-btn\">Continuar<\/button>\n      <\/div>`;\n\n    root.querySelector('.qe-start-btn').addEventListener('click', renderQuestion);\n  }\n\n  function renderComplete() {\n    const pct = Math.round((stats.firstPassCorrect \/ allQuestions.length) * 100);\n    launchConfetti();\n\n    root.innerHTML = `\n      <div class=\"qe-wrap qe-complete\">\n        <div class=\"qe-trophy\">\ud83c\udf89<\/div>\n        <h2>Quiz completado!<\/h2>\n        <p class=\"qe-score\">Obtuviste <strong>${stats.firstPassCorrect} de ${allQuestions.length}<\/strong> correctas en tu primer intento (${pct}%).<\/p>\n        ${pct >= 80\n          ? `<p class=\"qe-msg qe-msg-good\">Excelentes resultados estas listo para los ejercicios.<\/p>`\n          : `<p class=\"qe-msg qe-msg-ok\">Recuerda poner m\u00e1s atenci\u00f3n, intenta el quiz nuevamente.<\/p>`\n        }\n        <button class=\"qe-restart-btn\">Reinicia el quiz<\/button>\n      <\/div>`;\n\n    root.querySelector('.qe-restart-btn').addEventListener('click', () => init(root.parentElement.id || root.id));\n  }\n\n  \/* \u2500\u2500 Confetti \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\n  function launchConfetti() {\n    const canvas = document.createElement('canvas');\n    canvas.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9999';\n    document.body.appendChild(canvas);\n    const ctx = canvas.getContext('2d');\n    canvas.width = innerWidth; canvas.height = innerHeight;\n\n    const pieces = Array.from({ length: 120 }, () => ({\n      x: Math.random() * canvas.width,\n      y: Math.random() * -canvas.height,\n      w: 8 + Math.random() * 8,\n      h: 4 + Math.random() * 4,\n      r: Math.random() * Math.PI * 2,\n      vx: (Math.random() - 0.5) * 3,\n      vy: 2 + Math.random() * 4,\n      vr: (Math.random() - 0.5) * 0.15,\n      color: ['#FF6B6B','#FFD93D','#6BCB77','#4D96FF','#C77DFF','#FF9F40'][Math.floor(Math.random()*6)]\n    }));\n\n    let frame;\n    function draw() {\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\n      pieces.forEach(p => {\n        ctx.save();\n        ctx.translate(p.x, p.y);\n        ctx.rotate(p.r);\n        ctx.fillStyle = p.color;\n        ctx.fillRect(-p.w\/2, -p.h\/2, p.w, p.h);\n        ctx.restore();\n        p.x += p.vx; p.y += p.vy; p.r += p.vr;\n      });\n      if (pieces.some(p => p.y < canvas.height + 20)) {\n        frame = requestAnimationFrame(draw);\n      } else {\n        canvas.remove();\n      }\n    }\n    draw();\n    setTimeout(() => { cancelAnimationFrame(frame); canvas.remove(); }, 4000);\n  }\n\n  \/* \u2500\u2500 CSS injection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\n  function injectStyles() {\n    if (document.getElementById('qe-styles')) return;\n    const s = document.createElement('style');\n    s.id = 'qe-styles';\n    s.textContent = `\n     .qe-wrap { max-width: 640px; margin: 0 auto; font-family: 'Segoe UI', system-ui, sans-serif; padding: 1.5rem 0; }\n      .qe-progress { height: 4px; background: #e5e7eb; border-radius: 4px; margin-bottom: 1rem; overflow: hidden; }\n      .qe-progress-bar { height: 100%; background: #4D96FF; border-radius: 4px; transition: width 0.4s ease; }\n      .qe-label { font-size: 0.8rem; color: #6b7280; margin: 0 0 0.4rem; letter-spacing: 0.04em; text-transform: uppercase; }\n      .qe-question { font-size: 1.3rem; font-weight: 600; margin: 0 0 1.4rem; line-height: 1.4; }\n      .qe-options { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 10px; }\n      .qe-option { display: flex; align-items: center; gap: 12px; width: 100%; padding: 0.75rem 1rem; background: #dcdde6; border: 1.5px solid #a2bcf0; border-radius: 10px; cursor: pointer; font-size: 1rem; transition: border-color 0.15s, background 0.15s; text-align: left; }\n      .qe-option:hover:not(:disabled) { border-color: #4D96FF; background: #f0f7ff; }\n      .qe-option:disabled { cursor: default; }\n      .qe-option-key { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 6px; background: #f3f4f6; font-size: 0.8rem; font-weight: 700; color: #374151; flex-shrink: 0; }\n      .qe-option-text { flex: 1; color: black; }\n      .qe-correct { border-color: #22c55e !important; background: #f0fdf4 !important; }\n      .qe-correct .qe-option-key { background: #22c55e; color: #fff; }\n      .qe-dimmed { opacity: 0.45; border-color: #e5e7eb !important; background: #f9fafb !important; }\n      .qe-wrong { border-color: #ef4444 !important; background: #fef2f2 !important; }\n      .qe-wrong .qe-option-key { background: #ef4444; color: #fff; }\n      .qe-feedback { margin-top: 1.2rem; }\n      .qe-feedback-correct { color: #16a34a; font-weight: 600; margin: 0 0 0.4rem; }\n      .qe-feedback-wrong { color: #dc2626; font-weight: 600; margin: 0 0 0.4rem; }\n      .qe-feedback-hint { color: #92400e; background: #fef3c7; border-left: 3px solid #f59e0b; padding: 0.6rem 0.8rem; border-radius: 0 6px 6px 0; margin: 0.5rem 0; font-size: 0.95rem; }\n      .qe-feedback-explanation { color: #374151; background: #f9fafb; border: 1px solid #e5e7eb; padding: 0.6rem 0.8rem; border-radius: 6px; margin: 0.5rem 0; font-size: 0.93rem; line-height: 1.5; }\n      .qe-next-btn, .qe-start-btn, .qe-restart-btn { margin-top: 0.8rem; padding: 0.6rem 1.4rem; background: #4D96FF; color: #fff; border: none; border-radius: 8px; cursor: pointer; font-size: 0.95rem; font-weight: 600; transition: background 0.15s; }\n      .qe-next-btn:hover, .qe-start-btn:hover, .qe-restart-btn:hover { background: #2563eb; }\n      .qe-interlude { text-align: center; padding: 2.5rem 1rem; }\n      .qe-interlude-icon { font-size: 2.5rem; margin-bottom: 0.5rem; }\n      .qe-interlude h2 { margin: 0 0 0.5rem; font-size: 1.4rem; }\n      .qe-interlude p { color: #6b7280; margin-bottom: 1.2rem; }\n      .qe-complete { text-align: center; padding: 2.5rem 1rem; }\n      .qe-trophy { font-size: 3rem; margin-bottom: 0.5rem; }\n      .qe-complete h2 { font-size: 1.6rem; margin: 0 0 0.5rem; }\n      .qe-score { font-size: 1.1rem; color: #374151; margin: 0 0 0.5rem; }\n      .qe-msg { font-size: 0.95rem; padding: 0.6rem 1rem; border-radius: 8px; display: inline-block; margin: 0.4rem 0 1.2rem; }\n      .qe-msg-good { background: #f0fdf4; color: #15803d; }\n      .qe-msg-ok { background: #fff7ed; color: #c2410c; }\n\n     \n    `;\n    document.head.appendChild(s);\n  }\n\n  \/* \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\n  \/**\n   * init(rootId)\n   * @param {string} rootId - The id of the container element where the quiz will render.\n   *\n   * Call after both quiz-engine.js and the chapter quiz-data file have loaded.\n   *\/\n  function init(rootId) {\n    if (!window.QUIZ_DATA || !window.QUIZ_DATA.length) {\n      console.error('QuizEngine: window.QUIZ_DATA is missing or empty.');\n      return;\n    }\n    injectStyles();\n    root = document.getElementById(rootId);\n    if (!root) { console.error(`QuizEngine: element #${rootId} not found.`); return; }\n\n    allQuestions = window.QUIZ_DATA;\n    queue = shuffle(allQuestions.map(prepareQuestion));\n    nonPassed = [];\n    isFirstPass = true;\n    stats = { total: allQuestions.length, firstPassCorrect: 0, attempts: 0 };\n\n    renderQuestion();\n  }\n\n  return { init };\n\n})();\n\n<\/script>\n\n<script>window.QUIZ_DATA = [\n  {\n    question: \"\u00bfCu\u00e1l es la manera correcta de representar una cadena de caracteres en Java?\",\n    options: [\n      { text: \"String\",   correct: true },\n      { text: \"string\",   correct: false  },\n      { text: \"cadena\",   correct: false  },\n      { text: \"Str\",   correct: false  },\n    ],\n    hint: \"En Java las may\u00fasculas y las min\u00faculas son completamente diferentes.\",\n    explanation: \"En Java las cadenas de caracteres se representan con un String (escrito con S may\u00fascula)\"\n  },\n  {\n    question: \"\u00bfCu\u00e1l de los siguientes es un identificador v\u00e1lido?\",\n    options: [\n      { text: \"holaTodos\", correct: true },\n      { text: \"hola todos\", correct: false  },\n      { text: \"hola!\", correct: false },\n      { text: \"12holas\", correct: false },\n    ],\n    hint: \"\u00a1Los identificadores tienen unas reglas y algunas recomendaciones. La regla principal es que no pueden llevar espacios ni empezar con n\u00fameros!\",\n    explanation: \"La recomendaci\u00f3n principal es usar Camel Case: todos los caracteres van pegados y la primera letra de cada palabra despu\u00e9s de la primera va en may\u00fascula\"\n  },\n  {\n    question: \"\u00bfPara que se usan los caracteres { y } en una funci\u00f3n?\",\n    options: [\n      { text: \"Para agrupar las sentencias que hacen parte de la funci\u00f3n\", correct: true },\n      { text: \"Para indicar los par\u00e1metros\", correct: false },\n      { text: \"Para indicar el valor de retorno\", correct: false },\n      { text: \"No se usan en funciones\",   correct: false },\n    ],\n    hint: \"El caracter { va despu\u00e9s del caracter ) y el caracter } es el \u00faltimo caracter de toda funci\u00f3n.\",\n    explanation: \"Los caracteres { y } definen un bloque que usamos para agrupar sentencias.\"\n  },\n  {\n    question: \"\u00bfPara qu\u00e9 sirve la funci\u00f3n est\u00e1ndar String.format()?\",\n    options: [\n      { text: 'Para crear un String a partir de un formato y valores adicionales',  correct: true },\n      { text: 'Para retornar String que son siempre id\u00e9nticos', correct: false },\n      { text: 'Para crear Strings que sean igualmente legibles en diferentes sistemas operativos', correct: false },\n    ],\n    hint: \"\u00bfQu\u00e9 significa darle formato a algo?\",\n    explanation: \"String.format() es una funci\u00f3n est\u00e1ndar que toma argumentos para crear Strings basados en ellos y un formato.\"\n  },\n  {\n    question: \"\u00bfCuando debemos usar ; en nuestro c\u00f3digo?\",\n    options: [\n      { text: \"Al final de las sentencias (instrucciones concretas a un computador)\", correct: true },\n      { text: \"Para separar par\u00e1metros\", correct: false  },\n      { text: \"Para separar argumentos\", correct: false },\n      { text: \"Los ; no se deben usar, se utiliza el .\", correct: false },\n    ],\n    hint: \"El caracter usado para separar es la , y el . se utiliza antes de invocar un m\u00e9todo\",\n    explanation: \"No olvides terminas tus instrucciones con ;\"\n  }\n];\n<\/script>\n  \n  \t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c69df0e elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"c69df0e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d4cec85 e-con-full e-flex e-con e-child\" data-id=\"d4cec85\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cf47f2b elementor-widget elementor-widget-html\" data-id=\"cf47f2b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t <h2 id='ejercicios'>Ejercicios<\/h2>\n        <h3 id=\"Ejercicios-Cap1\">Errores del compilador y ejecuci\u00f3n<\/h3>\n        <p>Escribe los siguientes c\u00f3digos, lee el error que te devuelve el compilador o el ambiente de ejecuci\u00f3n. Despu\u00e9s escribe el c\u00f3digo correcto de modo que al ejecutarlo ya no salgan errores.<\/p>\n        <figure class=\"code-block\">\n          <figcaption><strong>E1.1<\/strong><\/figcaption>\n            <pre><code class=\"language-java\">err() {\n  return \"\u00bfD\u00f3nde est\u00e1 el error?\";\n}<\/code><\/pre>\n        <\/figure>\n        <figure class=\"code-block\">\n            \n          <figcaption><strong>E1.2<\/strong><\/figcaption>\n            <pre><code class=\"language-java\">string err2() {\n  return \"\u00bfString o string?\";\n}<\/code><\/pre>\n        <figure class=\"code-block\">\n            \n          <figcaption><strong>E1.3<\/strong><\/figcaption>\n            <pre><code class=\"language-java\">String err3(quien) {\n  return String.format(\"%s, \u00bfcu\u00e1l es el error?\u00bfString o string?\", quien);\n}<\/code><\/pre>\n        <\/figure>\n        <figure class=\"code-block\">\n          <figcaption><strong>E1.4<\/strong><\/figcaption>\n            <pre><code class=\"language-java\">String err4() {\n  return \"Este es un error sutil\"\n}<\/code><\/pre>\n        <\/figure>\n        <figure class=\"code-block\">\n          <figcaption><strong>E1.5<\/strong><\/figcaption>\n            <pre><code class=\"language-java\">String err5() {\n  \"Este es un poco menos sutil\";\n}<\/code><\/pre>\n        <\/figure>\n        <figure class=\"code-block\">\n          <figcaption><strong>E1.6<\/strong><\/figcaption>\n            <pre><code class=\"language-java\">String err6 {\n  return \"\u00a1Hola Error!\";\n}<\/code><\/pre>\n        <\/figure>\n        <figure class=\"code-block\">\n          <figcaption><strong>E1.7<\/strong><\/figcaption>\n            <pre><code class=\"language-java\">String err7(String quien) {\n  return format(\"%s \u00bfUn poco ma\u00f1oso, no?\", quien);\n}<\/code><\/pre>\n        <\/figure>\n        <h3>Ejercicios de Codificaci\u00f3n<\/h3>\n\n        <article>\n        <p><strong>E1.8<\/strong>: Llena los huecos para crear una funci\u00f3n que dados 3 Strings que sean emojis, los devuelva en formato \"[%s, %s, %s]\" por ejemplo al invocar la funci\u00f3n as\u00ed: adivinaLaPelicula(\"&#x2744;\",\"&#x1f6f3;\",\"&#x1f491;\"), retornar\u00eda \"[&#x2744;, &#x1f6f3;, &#x1f491;]\". Para cada hueco con una letra, escoge el reemplazo utilizando una de las opciones numeradas. Una vez que utilices una opci\u00f3n numerada ya no la puedes usar en otro reemplazo.<\/p>\n        <figure class=\"code-block\">\n            <pre><code>String <span class=\"fill-in\">_A_<\/span>(String emoji1<span class=\"fill-in\">_B_<\/span> String emoji2<span class=\"fill-in\">_C_<\/span> String emoji3) <span class=\"fill-in\">_D_<\/span>\n  return <span class=\"fill-in\">_E_<\/span>(\"[%s, %s, %s]\"<span class=\"fill-in\">_F_<\/span> emoji1<span class=\"fill-in\">_G_<\/span> emogi2<span class=\"fill-in\">_H_<\/span> emoji3);\n<span class=\"fill-in\">_I_<\/span><\/code><\/pre>\n        <\/figure>\n        <ol>\n          <li><code>,<\/code><\/li>\n          <li><code>,<\/code><\/li>\n          <li><code>,<\/code><\/li>\n          <li><code>,<\/code><\/li>\n          <li><code>,<\/code><\/li>\n          <li><code>}<\/code><\/li>\n          <li><code>{<\/code><\/li>\n          <li><code>adivinaLaPelicula<\/code><\/li>\n          <li><code>String.format<\/code><\/li>\n        <\/ol>\n        <\/article>\n\n        <article>\n        <p><strong>E1.9<\/strong>: Llena los huecos, para crear una funci\u00f3n que concatene la cadena \"\u3053\u3093\u306b\u3061\u306f\" (hola en japon\u00e9s) y un par\u00e1metro dado. Para cada hueco con una letra, escoge el reemplazo utilizando una de las opciones numeradas. Una vez que utilices una opci\u00f3n numerada ya no la puedes usar en otro reemplazo.<\/p>\n        <figure class=\"code-block\">\n           <pre><code><span class=\"fill-in\">_A_<\/span> <span class=\"fill-in\">_B_<\/span> {\n  <span class=\"fill-in\">_C_<\/span> String.format(\"\u3053\u3093\u306b\u3061\u306f<span class=\"fill-in\">_D_<\/span>\", <span class=\"fill-in\">_E_<\/span>)<span class=\"fill-in\">_F_<\/span>\n}<\/code><\/pre>\n        <\/figure>\n        <ol>\n          <li><code>return<\/code><\/li>\n          <li><code>;<\/code><\/li>\n          <li><code>dare<\/code><\/li>\n          <li><code>konnichiwa(String dare)<\/code><\/li>\n          <li><code>%s<\/code><\/li>\n          <li><code>String<\/code><\/li>\n        <\/ol>\n        <\/article>\n\n        <article>\n        <p><strong>E1.10<\/strong>: Escribe una funci\u00f3n separador() que retorne el String \"&lt;&lt;&lt;&gt;&gt;&gt;\"<\/p>\n        \n        <div class=\"io-example\">\n          <div class=\"input\">\n            <div class=\"label\">Input<\/div>\n              <pre><code>&gt; separador()<\/code><\/pre>\n            <\/div>\n          <div class=\"output\">\n            <div class=\"label\">Output<\/div>\n              <pre><code>\"&lt;&lt;&lt;&gt;&gt;&gt;\"<\/code><\/pre>\n            <\/div>\n        <\/div>\n        <\/article>\n\n        <article>\n        <p><strong>E1.11<\/strong>: Escribe una funci\u00f3n vocales() que retorne el String \"aeiou\"<\/p>\n        <div class=\"io-example\">\n          <div class=\"input\">\n            <div class=\"label\">Input<\/div>\n              <pre><code>&gt; vocales()<\/code><\/pre>\n            <\/div>\n          <div class=\"output\">\n            <div class=\"label\">Output<\/div>\n              <pre><code>\"aeiou\"<\/code><\/pre>\n            <\/div>\n        <\/div>\n        <\/article>\n\n        <article>\n        <p><strong>E1.12<\/strong>: Escribe una funci\u00f3n t\u00edtuloAdornado() que tome un String como par\u00e1metro y retorne el mismo String precedido por \"&lt;&lt;&lt; \" y antecedido por \" &gt;&gt;&gt;\"<\/p>\n        <div class=\"io-example\">\n          <div class=\"input\">\n            <div class=\"label\">Input<\/div>\n              <pre><code>&gt; t\u00edtuloAdornado(\"Java\")\n&gt; t\u00edtuloAdornado(\"&gt;&gt;&gt; &lt;&lt;&lt;\")\n&gt; t\u00edtuloAdornado(\"A + B\")<\/code><\/pre>\n            <\/div>\n          <div class=\"output\">\n            <div class=\"label\">Output<\/div>\n              <pre><code>\"&lt;&lt;&lt; Java &gt;&gt;&gt;\"\"\n\"&lt;&lt;&lt; &gt;&gt;&gt; &lt;&lt;&lt; &gt;&gt;&gt;\"\n\"&lt;&lt;&lt; A + B &gt;&gt;&gt;\"<\/code><\/pre>\n            <\/div>\n        <\/div>\n        <\/article>\n\n        <h3>Ejercicios de Correcci\u00f3n de C\u00f3digo<\/h3>\n\n        <p>Para estos problemas, mira los ejemplos de uso de una funci\u00f3n y luego revisa el c\u00f3digo inicial que no est\u00e1 funcionando como se espera. Ejec\u00fatalo y luego corr\u00edgelo para coincidir con los ejemplos.<\/p>\n\n        <article>\n        <p><strong>E1.13<\/strong>: Escribe una funci\u00f3n t\u00edtuloAdornado() que tome un String como par\u00e1metro y retorne el mismo String precedido por \"&lt;&lt;&lt; \" y antecedido por \" &gt;&gt;&gt;\"<\/p>\n      <div class=\"io-example\">\n          <div class=\"input\">\n            <div class=\"label\">Input<\/div>\n              <pre><code>&gt; adornado(\"Java\")\n&gt; adornado(\"Mundo\")\n<\/code><\/pre>\n            <\/div>\n          <div class=\"output\">\n            <div class=\"label\">Output<\/div>\n              <pre><code>\"&lt;=Java=&gt;\"\n\"&lt;=Mundo=&gt;\"<\/code><\/pre>\n            <\/div>\n        <\/div>\n           <div class=\"input\">\n            <div class=\"label\"><\/div>\n              <pre><code>String adornado(String frase) {\n    return String.format(\"<=%s=>, frase\");\n}\n<\/code><\/pre><\/div>\n            \n        <\/article>     \n        \n        \n     <article>\n        <p><strong>E1.14<\/strong><\/p>\n      <div class=\"io-example\">\n          <div class=\"input\">\n            <div class=\"label\">Input<\/div>\n              <pre><code>&gt; concatenar(\"Hola\",\"Mundo\")\n&gt; concatenar(\"A\", \"Z\")\n<\/code><\/pre>\n            <\/div>\n          <div class=\"output\">\n            <div class=\"label\">Output<\/div>\n              <pre><code>\"&#091;Hola+Mundo&#093;\"\n\"&#091;A+Z&#093;\"<\/code><\/pre>\n            <\/div>\n        <\/div>\n           <div class=\"input\">\n            <div class=\"label\"><\/div>\n              <pre><code>String concatenar(String s1, String s2) {\n    return String.format(\"[%s+%s]\", s2, s1);\n}\n<\/code><\/pre><\/div>\n        <\/article>    \n            \n            \n            \n        \n<p>\u00a9 2022 Carlos Obreg\u00f3n. This work is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0)<\/p>        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-50a7533 e-flex e-con-boxed e-con e-parent\" data-id=\"50a7533\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e4b86b6 elementor-widget elementor-widget-shortcode\" data-id=\"e4b86b6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\t\t<div data-elementor-type=\"container\" data-elementor-id=\"2038\" class=\"elementor elementor-2038\" data-elementor-post-type=\"elementor_library\">\n\t\t\t\t<div class=\"elementor-element elementor-element-95a4ae3 e-flex e-con-boxed e-con e-parent\" data-id=\"95a4ae3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-19c4dee elementor-widget elementor-widget-html\" data-id=\"19c4dee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t   <script>\nfunction initChapterNav(activeIndex) {\n\n  \/* \u2500\u2500 Chapters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  const chapters = [\n    {\n      title: \"Funciones\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/funciones\",\n      sections: [\n        { title: \"\u00a1Hola Mundo! \u00a1Hola Java!\", anchor: \"hola-java\" },\n        { title: \"\u00a1Hola Mundo! version 2.0\",  anchor: \"hola-java-refactor\" },\n        { title: \"Espacio en blanco\",          anchor: \"espacio-en-blanco\" },\n        { title: \"Comentarios\",                anchor: \"comentarios\" },\n        { title: \"Quiz\",                anchor: \"Quiz\" },\n        { title: \"Ejercicios\",                 anchor: \"ejercicios\" },\n      ]\n    },\n    {\n      title: \"Operadores\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/operadores\",\n      sections: [\n        { title: \"Tipos Primitivos\",          anchor: \"tipos-primitivos\" },\n        { title: \"Operadores Num\u00e9ricos\",      anchor: \"operadores-numericos\" },\n        { title: \"Operadores Relacionales\",   anchor: \"operadores-relacionales\" },\n        { title: \"Operadores L\u00f3gicos\",        anchor: \"operadores-logicos\" },\n        { title: \"Operador Ternario\",         anchor: \"operador-ternario\" },\n        { title: \"Diversi\u00f3n con Funciones\",   anchor: \"diversion-con-funciones\" },\n          { title: \"Quiz\",                anchor: \"Quiz\" },\n        { title: \"Ejercicios\",                anchor: \"ejercicios-cap2\" },\n      ]\n    },\n    {\n      title: \"Variables\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/variables\",\n      sections: [\n        { title: \"C\u00f3digo legado: c\u00f3digo sin var\",       anchor: \"codigo-sin-var\" },\n        { title: \"Cuidados con literales y variables\",  anchor: \"literales-variables\" },\n        { title: \"N\u00fameros M\u00e1gicos\",                     anchor: \"numeros-magicos\" },\n        { title: \"Reasignaciones\",                      anchor: \"reasignaciones\" },\n        { title: \"Misi\u00f3n secundaria: Casting\",          anchor: \"casting\" },\n        { title: \"Quiz\",          anchor: \"Quiz\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicios-cap3\" },\n      ]\n    },\n    {\n      title: \"String y StringBuilder\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/string-y-stringbuilder\",\n      sections: [\n          \n          { title: \"M\u00e9todos Destacados de String\",       anchor: \"metodos-destacados\" },\n        { title: \"String Format\",  anchor: \"string-format\" },\n        { title: \"StringBuilder\",                     anchor: \"stringbuilder\" },\n        { title: \"Misi\u00f3n secundaria: Inmutabilidad\",                      anchor: \"inmutabilidad\" },\n        { title: \"Quiz\",          anchor: \"quiz\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicios-cap4\" },\n        ]\n    },\n    {\n      title: \"Programas en Java\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/programas-en-java\",\n      sections: [     \n          { title: \"Paquetes\",       anchor: \"paquetes\" },\n        { title: \"Importaciones\",  anchor: \"importaciones\" },\n        { title: \"Importaciones Static\",                     anchor: \"importaciones-static\" },\n        { title: \"Constantes de Clase\",                      anchor: \"constantes-clase\" },\n        { title: \"Especificaciones\",                      anchor: \"especificaciones\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicios-cap5\" },\n        ]\n    },\n    {\n      title: \"Ciclos\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/ciclos\",\n      sections: [\n           { title: \"Operadores compuestos\",       anchor: \"operadores -compuestos\" },\n        { title: \"Ciclos For\",  anchor: \"ciclos-for\" },\n        { title: \"Strings\",                     anchor: \"strings\" },\n        { title: \"Ciclos For vs Ciclos While\",                      anchor: \"ciclosfor-cicloswhile\" },\n        { title: \"Ciclos Anidados\",                      anchor: \"ciclos-anidados\" },\n        { title: \"Strings de m\u00faltiples l\u00edneas\",                      anchor: \"strings-multipleslineas\" },\n         { title: \"Ciclos Infinitos\",                      anchor: \"ciclos-infinitos\" },\n          { title: \"Logs\",                          anchor: \"logs\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicios-cap6\" },\n        ]\n    },\n    {\n      title: \"Condicionales\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/condicionales\",\n      sections: [\n          \n           { title: \"Las muchas formas de switch\",       anchor: \"muchasformas\" },\n        { title: \"Las muchas formas de if\",  anchor: \"formas-if\" },\n        { title: \"Flujos de ejecuci\u00f3n con condicionales\",                     anchor: \"ejecuci\u00f3ncondicionales\" },\n        { title: \"Orden de condiciones\",                      anchor: \"condiciones\" },\n        { title: \"Switch vs If\",                      anchor: \"switch\" },\n        { title: \"m\u00faltiples retornos en una funci\u00f3n\",                      anchor: \"retornosfunci\u00f3n\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicios-cap7\" },\n        ]\n    },\n    {\n      title: \"Arreglos\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/arreglos\",\n      sections: [\n          { title: \"Arreglos como Par\u00e1metros\",       anchor: \"Comoparametros\" },\n        { title: \"Mutabilidad en los arreglos\",  anchor: \"mutabilidad\" },\n        { title: \"Par\u00e1metros de salida\",                     anchor: \"parametrossalida\" },\n        { title: \"Arreglos como valores de retorno\",                      anchor: \"arreglos-retorno\" },\n        { title: \"Valores predeterminados\",                      anchor: \"valores-predeterminados\" },\n        { title: \"Arreglos Multidimensionales\",                      anchor: \"a-multidimensionales\" },\n        { title: \"Copiar una matriz\",                      anchor: \"copiar-matriz\" },\n        { title: \"Iteraciones\",                      anchor: \"iteraciones\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicios-cap8\" },\n          ]\n    },\n    {\n      title: \"Miscel\u00e1nea de Ejercicios\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/miscelanea-de-ejercicios\/\",\n      sections: []\n    },\n    {\n      title: \"Tipos de Datos\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/tipos-de-datos\/\",\n      sections: [\n           { title: \"M\u00e9todos no accesores\",       anchor: \"metodosaccesores\" },\n        { title: \"Estatico vs No- Estatico\",  anchor: \"estatico\" },\n        { title: \"Igualdad\",                     anchor: \"igualdad\" },\n        { title: \"Implementaci\u00f3n por defecto de una clase\",                      anchor: \"implementacionclase\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicioscap9\" },\n        ]\n    },\n    {\n      title: \"Constructores\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/constructores\/\",\n      sections: [\n           { title: \"M\u00faltiples Constructores\",       anchor: \"multiplesconstructores\" },\n        { title: \"F\u00e1bricas Est\u00e1ticas\",  anchor: \"fabricasestaticas\" },\n        { title: \"Java Beans\",                     anchor: \"javabeans\" },\n        { title: \"Constructores Con Visibilidad por Defecto\",                      anchor: \"constructoresdefecto\" },\n         { title: \"Side Quest: Builders\",                      anchor: \"sidequestbuilders\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicioscap11\" },\n        ]\n    },\n    {\n      title: \"Referencias y Null\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/referencias-y-null\/\",\n      sections: [\n                  { title: \"Pasar por valor\",       anchor: \"pasarporvalor\" },\n        { title: \"NULL\",  anchor: \"null\" },\n        { title: \"Valores Nulos\",                     anchor: \"valoresnulos\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicioscap12\" },\n        ]\n    },\n    {\n      title: \"Enums\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/enums\/\",\n      sections: [\n           { title: \"Metodos y Atributos\",       anchor: \"metodosyatributos\" },\n        { title: \"Sobreescritura de M\u00e9todos por Constante\",  anchor: \"sobreescrituraconstante\" },\n        { title: \"Ejercicios\",                          anchor: \"ejercicioscapenums\" },\n        ]\n    },\n    {\n      title: \"Inmutabilidad\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/inmutabilidad\/\",\n      sections: [\n           { title: \"Mutabilidad en el interior\",       anchor: \"mutabilidadinterior\" },\n        { title: \"Withers\",  anchor: \"withers\" },\n        { title: \"Ejercicios\",                          anchor: \"ejerciciopuzzle\" },\n        ]\n    },\n    {\n      title: \"Manejo de Errores\",\n      url: \"https:\/\/www.bogotajvm.com.co\/starter-kit\/manejo-de-errores\/\",\n      sections: [\n          { title: \"Estrategia de Manejo de Errores\",       anchor: \"estrategiaerrores\" },\n        { title: \"El usuario final no debe ver un stacktrace\",  anchor: \"stacktrace\" },\n        { title: \"Cambios en el C\u00f3digo\",                     anchor: \"cambiosc\u00f3digo\" },\n        { title: \"Mensajes de Error\",                      anchor: \"mensajeserror\" },\n         { title: \"Librer\u00eda de Validaciones\",                      anchor: \"librer\u00edavalidaciones\" },\n        ]\n    }\n  ];\n\n  \/* \u2500\u2500 Styles \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  const CSS = `\n    #cn-toggle {\n      position: fixed;\n      bottom: 24px;\n      left: 24px;\n      width: clamp(44px, 6vw, 100px);\n      height: clamp(44px, 6vw, 100px);\n      border-radius: 50%;\n      background: #fff;\n      border: 1px solid #d0d0d0;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      z-index: 9000;\n      box-shadow: 0 2px 8px rgba(0,0,0,.12);\n      transition: background .15s;\n      padding: 0;\n    }\n    #cn-toggle:hover { background: #f5f5f5; }\n    #cn-toggle svg {\n      color: black;\n      display: block;\n      width: clamp(18px, 2.4vw, 40px);\n      height: clamp(18px, 2.4vw, 40px);\n    }\n\n@media (prefers-color-scheme: dark) {\n#cn-toggle { background: #2a2a2a; border-color: #444; }\n#cn-toggle:hover { background: #333; }\n}\n\n    #cn-panel {\n      position: fixed;\n      bottom: calc(clamp(44px, 6vw, 100px) + 36px);\n      left: 24px;\n      width: 270px;\n      max-height: 72vh;\n      overflow-y: auto;\n      background: #fff;\n      border: 1px solid #d0d0d0;\n      border-radius: 12px;\n      padding: 10px 0;\n      z-index: 8999;\n      box-shadow: 0 4px 16px rgba(0,0,0,.10);\n      display: none;\n      box-sizing: border-box;\n      font-family: inherit;\n    }\n    #cn-panel.cn-open { display: block; }\n\n    @media (prefers-color-scheme: dark) {\n      #cn-panel { background: #1e1e1e; border-color: #444; box-shadow: 0 4px 16px rgba(0,0,0,.4); }\n    }\n\n    .cn-header {\n      font-size: 11px;\n      font-weight: 600;\n      letter-spacing: .07em;\n      text-transform: uppercase;\n      color: #999;\n      padding: 0 14px 8px;\n      border-bottom: 1px solid #eee;\n      margin-bottom: 4px;\n    }\n    @media (prefers-color-scheme: dark) {\n      .cn-header { color: #666; border-color: #333; }\n    }\n\n    .cn-chapter {\n      display: flex;\n      align-items: center;\n    }\n    .cn-chapter-link {\n      flex: 1;\n      padding: 7px 6px 7px 14px;\n      font-size: 13.5px;\n      line-height: 1.35;\n      color: #222;\n      text-decoration: none;\n      display: block;\n    }\n    .cn-chapter-link:hover { color: #0066cc; }\n    .cn-chapter-link.cn-active {\n      font-weight: 600;\n      color: #0066cc;\n    }\n    @media (prefers-color-scheme: dark) {\n      .cn-chapter-link { color: #ddd; }\n      .cn-chapter-link:hover, .cn-chapter-link.cn-active { color: #5aacff; }\n    }\n\n    .cn-expand-btn {\n      width: 30px;\n      height: 30px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      color: #bbb;\n      border-radius: 6px;\n      margin-right: 8px;\n      flex-shrink: 0;\n      background: none;\n      border: none;\n      padding: 0;\n      transition: color .15s, background .15s;\n    }\n    .cn-expand-btn:hover { color: #555; background: #f0f0f0; }\n    .cn-expand-btn svg { transition: transform .2s; display: block; }\n    .cn-expand-btn.cn-open svg { transform: rotate(90deg); }\n\n    @media (prefers-color-scheme: dark) {\n      .cn-expand-btn { color: #555; }\n      .cn-expand-btn:hover { color: #aaa; background: #2e2e2e; }\n    }\n\n    .cn-section-list {\n      display: none;\n      padding: 2px 8px 6px 28px;\n      border-bottom: 1px solid #f0f0f0;\n      margin-bottom: 2px;\n    }\n    .cn-section-list.cn-open { display: block; }\n\n    @media (prefers-color-scheme: dark) {\n      .cn-section-list { border-color: #2a2a2a; }\n    }\n\n    .cn-section-link {\n      display: block;\n      padding: 4px 0;\n      font-size: 12.5px;\n      line-height: 1.4;\n      color: #666;\n      text-decoration: none;\n    }\n    .cn-section-link:hover { color: #0066cc; }\n\n    @media (prefers-color-scheme: dark) {\n      .cn-section-link { color: #888; }\n      .cn-section-link:hover { color: #5aacff; }\n    }\n  `;\n\n  \/* \u2500\u2500 SVG icons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function iconMenu() {\n    return `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n      stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n      <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"\/>\n      <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"\/>\n      <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"\/>\n    <\/svg>`;\n  }\n\n  function iconClose() {\n    return `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n      stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n      <line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\"\/>\n      <line x1=\"19\" y1=\"5\" x2=\"5\" y2=\"19\"\/>\n    <\/svg>`;\n  }\n\n  function iconChevron() {\n    return `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\"\n      stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n      <polyline points=\"9 18 15 12 9 6\"\/>\n    <\/svg>`;\n  }\n\n  \/* \u2500\u2500 Build UI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\n  \/\/ Inject styles\n  const style = document.createElement(\"style\");\n  style.textContent = CSS;\n  document.head.appendChild(style);\n\n  \/\/ Build toggle button\n  const toggle = document.createElement(\"button\");\n  toggle.id = \"cn-toggle\";\n  toggle.setAttribute(\"aria-label\", \"Toggle navigation\");\n  toggle.innerHTML = iconMenu();\n\n  \/\/ Build panel\n  const panel = document.createElement(\"nav\");\n  panel.id = \"cn-panel\";\n  panel.setAttribute(\"aria-label\", \"Course navigation\");\n\n  const header = document.createElement(\"div\");\n  header.className = \"cn-header\";\n  header.textContent = \"Contenidos\";\n  panel.appendChild(header);\n\n  chapters.forEach(function (chapter, idx) {\n    const isActive = activeIndex !== undefined && idx === activeIndex;\n    const hasSections = chapter.sections && chapter.sections.length > 0;\n\n    \/\/ Chapter row\n    const row = document.createElement(\"div\");\n    row.className = \"cn-chapter\";\n\n    const link = document.createElement(\"a\");\n    link.className = \"cn-chapter-link\" + (isActive ? \" cn-active\" : \"\");\n    link.href = chapter.url;\n    link.textContent = chapter.title;\n    row.appendChild(link);\n\n    if (hasSections) {\n      \/\/ Expand button\n      const btn = document.createElement(\"button\");\n      btn.className = \"cn-expand-btn\" + (isActive ? \" cn-open\" : \"\");\n      btn.setAttribute(\"aria-label\", isActive ? \"Hide sections\" : \"Show sections\");\n      btn.innerHTML = iconChevron();\n      row.appendChild(btn);\n\n      \/\/ Section list\n      const sectionList = document.createElement(\"div\");\n      sectionList.className = \"cn-section-list\" + (isActive ? \" cn-open\" : \"\");\n\n      chapter.sections.forEach(function (section) {\n        const sLink = document.createElement(\"a\");\n        sLink.className = \"cn-section-link\";\n        sLink.href = isActive\n          ? \"#\" + section.anchor\n          : chapter.url + \"#\" + section.anchor;\n        sLink.textContent = section.title;\n        sectionList.appendChild(sLink);\n      });\n\n      btn.addEventListener(\"click\", function () {\n        const isOpen = sectionList.classList.contains(\"cn-open\");\n\n        \/\/ Close all section lists and reset all expand buttons\n        panel.querySelectorAll(\".cn-section-list\").forEach(function (list) {\n          list.classList.remove(\"cn-open\");\n        });\n        panel.querySelectorAll(\".cn-expand-btn\").forEach(function (b) {\n          b.classList.remove(\"cn-open\");\n          b.setAttribute(\"aria-label\", \"Show sections\");\n        });\n\n        \/\/ If it wasn't open before, open it now (clicking an open chapter just closes it)\n        if (!isOpen) {\n          sectionList.classList.add(\"cn-open\");\n          btn.classList.add(\"cn-open\");\n          btn.setAttribute(\"aria-label\", \"Hide sections\");\n        }\n      });\n\n      panel.appendChild(row);\n      panel.appendChild(sectionList);\n    } else {\n      panel.appendChild(row);\n    }\n  });\n\n  toggle.addEventListener(\"click\", function (e) {\n    e.stopPropagation();\n    const open = panel.classList.toggle(\"cn-open\");\n    toggle.innerHTML = open ? iconClose() : iconMenu();\n    toggle.setAttribute(\"aria-label\", open ? \"Close navigation\" : \"Open navigation\");\n  });\n\n  document.addEventListener(\"click\", function (e) {\n    if (!panel.contains(e.target) && !toggle.contains(e.target)) {\n      panel.classList.remove(\"cn-open\");\n      toggle.innerHTML = iconMenu();\n      toggle.setAttribute(\"aria-label\", \"Open navigation\");\n    }\n  });\n\n  document.body.appendChild(toggle);\n  document.body.appendChild(panel);\n}\n\n  \n    initChapterNav();\n  <\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u00a1Hola Mundo! Las funciones son un concepto fundacional en la programaci\u00f3n. Tan importantes son que vale la pena que sean [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":315,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-559","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.bogotajvm.com.co\/en\/wp-json\/wp\/v2\/pages\/559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bogotajvm.com.co\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.bogotajvm.com.co\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.bogotajvm.com.co\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bogotajvm.com.co\/en\/wp-json\/wp\/v2\/comments?post=559"}],"version-history":[{"count":130,"href":"https:\/\/www.bogotajvm.com.co\/en\/wp-json\/wp\/v2\/pages\/559\/revisions"}],"predecessor-version":[{"id":2329,"href":"https:\/\/www.bogotajvm.com.co\/en\/wp-json\/wp\/v2\/pages\/559\/revisions\/2329"}],"up":[{"embeddable":true,"href":"https:\/\/www.bogotajvm.com.co\/en\/wp-json\/wp\/v2\/pages\/315"}],"wp:attachment":[{"href":"https:\/\/www.bogotajvm.com.co\/en\/wp-json\/wp\/v2\/media?parent=559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}