<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Códice | Entradas sobre «criptografía»</title><description>Feed RSS de publicaciones etiquetadas con criptografía</description><link>https://javguerra.github.io/</link><item><title>El algoritmo de Karaca</title><link>https://javguerra.github.io/blog/karaca</link><guid isPermaLink="true">https://javguerra.github.io/blog/karaca</guid><description>Solución en JavaScript al reto semanal n. 50 de @MoureDev</description><pubDate>Thu, 15 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://javguerra.github.io/_astro/cifrado.Hb5hRkab_Z2qxri.webp&quot; alt=&quot;Cifrado&quot; style=&quot;max-width: 100%; height: auto;&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Etiquetas:&lt;/strong&gt; &lt;em&gt;#código&lt;/em&gt;, &lt;em&gt;#javascript&lt;/em&gt;, &lt;em&gt;#criptografía&lt;/em&gt;, &lt;em&gt;#ciberseguridad&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;En este post resuelvo, en JavaScript el &lt;a href=&quot;https://github.com/mouredev/Weekly-Challenge-2022-Kotlin/blob/main/app/src/main/java/com/mouredev/weeklychallenge2022/Challenge50.kt&quot;&gt;reto de programación&lt;/a&gt; consistente en desarrollar una función que es capaz de encriptar y desencriptar texto utilizando el algoritmo de encriptación de Karaca.&lt;/p&gt;
&lt;p&gt;Descubrí esta semana, un poco tarde, los &lt;a href=&quot;https://retosdeprogramacion.com/semanales2022&quot;&gt;retos de programación semanales de Mouredev para 2022&lt;/a&gt; y me atrajo el enunciado de este ejercicio.&lt;/p&gt;
&lt;p&gt;Busqué información en Internet sobre el algoritmo, encontrando lo siguiente:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Make a function that encrypts a given input with these steps:&lt;br&gt;
Input: “apple”&lt;br&gt;
Step 1: Reverse the input: “elppa”&lt;br&gt;
Step 2: Replace all vowels using the following chart:&lt;br&gt;
a =&amp;gt; 0, e =&amp;gt; 1, i =&amp;gt; 2, o =&amp;gt; 3, u =&amp;gt; 4  # “1lpp0”&lt;br&gt;
Step 3: Add “aca” to the end of the word: “1lpp0aca”&lt;br&gt;
Output: “1lpp0aca”&lt;br&gt;
All inputs are strings, no uppercases and all output must be strings.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Y me tomé la libertad de corregir la relación entre vocales y números que, en &lt;a href=&quot;https://edabit.com/challenge/JzBLDzrcGCzDjkk5n&quot;&gt;la fuente original&lt;/a&gt; publicada por Furkan Karaca, en el &lt;a href=&quot;https://edabit.com/&quot;&gt;portal de retos Edabit&lt;/a&gt; parece no ser correcta.&lt;/p&gt;
&lt;p&gt;El algoritmo, sin una aparente utilidad práctica, es un buen ejercicio de programación que combina el uso de expresiones regulares, uso de arreglos y cadenas y lógica.&lt;/p&gt;
&lt;h1 id=&quot;entendiendo-el-problema&quot;&gt;Entendiendo el problema&lt;/h1&gt;
&lt;p&gt;Lo que pide el ejercicio es que nuestra función debe poder codificar y decodificar un texto, en minúsculas, que le pasemos por parámetro. Este texto, lógicamente, no puede estar vacío.&lt;/p&gt;
&lt;p&gt;Cualquier dato que le pasemos que no sea texto debe impedir la ejecución de la codificación/decodificación. La función puede devolver un error, o bien el dato original suministrado. Opto por esta segunda posibilidad.&lt;/p&gt;
&lt;p&gt;La cadena de caracteres suministrada a la función puede tener espacios al inicio y/o al final, incluso puede contener sólo espacios, por lo que amerita limpiar la cadena, y que esta contenga algo más que sólo espacios.&lt;/p&gt;
&lt;p&gt;La cadena no puede contener sólo números, esto equivaldría a suministrar un número entero a la función. De hecho, el algoritmo presenta un problema importante con esto. Si se le suministra un frase que contenga dígitos en el rango del mapeo de vocales (0-1-2-3-4) no realizará bien el cifrado, pues tomará estos dígitos como parte del descifrado, mostrando un galimatías. Ej. «100 horas» -&amp;gt; «s0r3h 001aca» -&amp;gt; «eaa horas».&lt;/p&gt;
&lt;p&gt;Para saber si se puede decodificar una cadena proporcionada, es decir, para saber si está codificada con el algoritmo de Karaca, se debe cumplir que esta termine con un «aca», que contenga algún número entre el 0 y el 4, y que su longitud sea mayor que la de la cadena de control «aca». De no cumplirse esto, se entiende que la cadena que se proporciona a la función no está codificada, y entonces puede ser codificada.&lt;/p&gt;
&lt;p&gt;Para realizar la conversión, se debe recorrer la cadena teniendo en cuenta el mapeo de vocales del enunciado (a =&amp;gt; 0, e =&amp;gt; 1, i =&amp;gt; 2, o =&amp;gt; 3, u =&amp;gt; 4) y viceversa.&lt;/p&gt;
&lt;h1 id=&quot;resolución&quot;&gt;Resolución&lt;/h1&gt;
&lt;p&gt;El algoritmo de Karaca en JavaScript, atendiendo a las consideraciones anteriores, es el siguiente:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;02.  * Función en JavaScript que encripta y desencripta texto en minúsculas en &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;03.  * inglés, sin números, utilizando el algoritmo de encriptación de Karaca.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;04.  * &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@param&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; {String}&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;05.  * &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@returns&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; String&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;06.  * &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@author&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Javier Guerra&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;07.  */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;08.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; karacaAlgorithm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;09.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;10.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    str &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;11.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;12.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;typeof&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;string&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;trim&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\D&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;13.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;14.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        str &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;trim&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toLowerCase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;reverse&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;15.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;16.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; vowels&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;aeiou&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;17.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; control&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;aca&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;18.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;19.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;startsWith&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(control) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;21.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;22.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            str.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; control.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;23.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        ) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;24.&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;            // decode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;25.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            str &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;slice&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(control.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;26.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            vowels.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;chr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;27.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i)) str &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;replaceAll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(i, chr);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;28.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;29.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30.&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;            // encode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;31.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            vowels.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;chr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;32.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(chr)) str &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;replaceAll&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(chr, i);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;33.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;34.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            str &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; control;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;35.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;36.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;37.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;38.&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; str.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;39.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En la línea 8, con el valor por defecto &lt;code&gt;&quot;&quot;&lt;/code&gt; del parámetro se evita el error si llamemos a la función sin ningún parámetro, devolviendo una cadena vacía.&lt;/p&gt;
&lt;p&gt;en la línea 10 se comprueba que el parámetro recibido no está colando un valor &lt;code&gt;null&lt;/code&gt; o &lt;code&gt;undefined&lt;/code&gt; con el operador coalescente nulo (&lt;code&gt;??&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;En la línea 12 se comprueba que el dato recibido es una cadena, que tiene al menos un carácter, y cuenta con alguna consonante. De no ser así, se devuelve el parámetro recibido.&lt;/p&gt;
&lt;p&gt;En la línea 14 se realizan varias conversiones al parámetro recibido: se limpian los espacios iniciales y/o finales, se pasa la  cadena a minúsculas, y se invierte la cadena. Esto último se hace mediante la concatenación de varios métodos: &lt;code&gt;split&lt;/code&gt;, para convertir la cadena en un arreglo, &lt;code&gt;reverse&lt;/code&gt; para invertir el orden del contenido del arreglo y &lt;code&gt;join&lt;/code&gt; para unir el contenido del arreglo en una cadena.&lt;/p&gt;
&lt;p&gt;Las líneas 16 y 17 definen las variables que usaremos en el algoritmo.&lt;/p&gt;
&lt;p&gt;En la comprobación de las líneas de la 19 a la 23 se decide si se va a decodificar la cadena recibida, es decir, si se cumple que la cadena termina en «aca», contiene algún dígito y su longitud es mayor que la longitud de «aca». Si es así, se lleva a cabo la codificación a partir de la línea 25. en caso contrario, se lleva a cabo la codificación a partir de la línea 31.&lt;/p&gt;
&lt;p&gt;Para la decodificación, primero se elimina el control «aca» y luego se recorre el arreglo de vocales con forEach, de tal forma que si alguno de los elementos del arreglo es encontrado en la cadena a decodificar, este se sustituye por la vocal correspondiente.&lt;/p&gt;
&lt;p&gt;Para la codificación se lleva a cabo el proceso contrario. Al recorrer el arreglo de vocales, se sustituye el dígito por la vocal correspondiente. Luego se añade la cadena de control «aca».&lt;/p&gt;
&lt;p&gt;Por último, se devuelve el resultado de las operaciones sobre la cadena recibida convertida a cadena, por si el valor recibido fue un número, ya que la función debe devolver una cadena.&lt;/p&gt;
&lt;h1 id=&quot;prueba&quot;&gt;Prueba&lt;/h1&gt;
&lt;p&gt;El siguiente código de prueba debe poder codificar y decodificar la cadena original suministrada obteniendo la cadena original como resultado.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// Testing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Solving an equation produces, instantly, great euphoria.&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;console.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;karacaAlgorithm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(str));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;console.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;karacaAlgorithm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;karacaAlgorithm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(str)));&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El resultado esperado debe ser:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.02r3hp41 t01rg ,yltn0tsn2 ,s1c4d3rp n32t04q1 n0 gn2vl3saca&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;solving an equation produces, instantly, great euphoria.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La frase, en inglés, incluye las palabras &lt;code&gt;equation&lt;/code&gt; y &lt;code&gt;euphoria&lt;/code&gt; que cuentan con todas las vocales.&lt;/p&gt;
&lt;h1 id=&quot;enlaces&quot;&gt;Enlaces&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://retosdeprogramacion.com/semanales2022&quot;&gt;Retos de programación semanales de Mouredev para 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mouredev/Weekly-Challenge-2022-Kotlin/blob/main/app/src/main/java/com/mouredev/weeklychallenge2022/Challenge50.kt&quot;&gt;Reto de programación semanal n. 50 de Mouredev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://edabit.com/challenge/JzBLDzrcGCzDjkk5n&quot;&gt;La fuente original del reto por Furkan Karaca&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://edabit.com/&quot;&gt;Portal de retos Edabit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JavGuerra/retos-programacion&quot;&gt;Ver el código de este y otros retos de programación en GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><enclosure url="https://javguerra.github.io/_astro/cifrado.Hb5hRkab_Z2qxri.webp"/><category>código</category><category>javascript</category><category>criptografía</category><category>ciberseguridad</category><author>JavGuerra</author></item><item><title>Museos de computación en Londres</title><link>https://javguerra.github.io/blog/museos-computacion-londres</link><guid isPermaLink="true">https://javguerra.github.io/blog/museos-computacion-londres</guid><description>Un paseo por Bletchley Park, The National Museum Of Computing y The Science Museum</description><pubDate>Fri, 27 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://javguerra.github.io/_astro/TNMOC_IBM_PC.RzqfNVsY_1kj0xJ.webp&quot; alt=&quot;IBM PC&quot; style=&quot;max-width: 100%; height: auto;&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Etiquetas:&lt;/strong&gt; &lt;em&gt;#algoritmia&lt;/em&gt;, &lt;em&gt;#computación&lt;/em&gt;, &lt;em&gt;#historia&lt;/em&gt;, &lt;em&gt;#londres&lt;/em&gt;, &lt;em&gt;#museo&lt;/em&gt;, &lt;em&gt;#criptografía&lt;/em&gt;, &lt;em&gt;#fotografía&lt;/em&gt;, &lt;em&gt;#internet&lt;/em&gt;, &lt;em&gt;#retro&lt;/em&gt;, &lt;em&gt;#servidor&lt;/em&gt;, &lt;em&gt;#sinclair ql&lt;/em&gt;, &lt;em&gt;#tic&lt;/em&gt;, &lt;em&gt;#viaje&lt;/em&gt;, &lt;em&gt;#enigma&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Recientemente he estado de viaje familiar en Londres y creo que he aprovechado bien el tiempo. En esta entrada cuento brevemente la visita a distintos museos relacionados con la informática en la ciudad.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/?dir=2024-12-COMPUTER-LONDON&quot;&gt;&lt;button&gt;Ver galería de fotos&lt;/button&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Reino Unido es el país que vio nacer la informática como la conocemos hoy y de esto tiene mucha culpa la Segunda Guerra Mundial y &lt;a href=&quot;https://es.wikipedia.org/wiki/Bletchley_Park&quot;&gt;Bletchley Park&lt;/a&gt;, la base donde &lt;code&gt;Alan Turing&lt;/code&gt; y las mujeres de inteligencia del ejercito descifraron el código de Enigma y Lorenz. Allí pude ver estas máquinas y las que se usaron para descifrarlas.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Bletchley_Park_Turing.jpg&quot;&gt;&lt;img src=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Bletchley_Park_Turing.jpg&quot; alt=&quot;Alan Turing&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;
&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Bletchley_Park_Turing.jpg&quot;&gt;Alan Turing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Bletchley_Park_Enigma.jpg&quot;&gt;&lt;img src=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Bletchley_Park_Enigma.jpg&quot; alt=&quot;Enigma&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;
&lt;a href=&quot;ttps://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Bletchley_Park_Enigma.jpg&quot;&gt;Enigma&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hablando de códigos, en el Museo Británico está la original piedra de Rosetta, que también pude ver.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Rosetta_British_Museum.jpg&quot;&gt;&lt;img src=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Rosetta_British_Museum.jpg&quot; alt=&quot;Piedra de Rosetta&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;
&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Rosetta_British_Museum.jpg&quot;&gt;Piedra de Rosetta&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Justo detrás de Bletchley Park, a escasos metros, está &lt;a href=&quot;https://www.tnmoc.org/&quot;&gt;The National Museum Of Computing&lt;/a&gt;. Esta es una visita que no debes perderte, pues cuenta con grandes sorpresas, como una versión operativa de &lt;code&gt;The Bombe&lt;/code&gt; reconstruida, asi como las reconstrucciones de la máquina &lt;code&gt;Tunny&lt;/code&gt; y del no menos famoso &lt;code&gt;Colossus&lt;/code&gt; que ayudaron a romper los códigos del ejercito alemán en la WWII.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_Bombe.jpg&quot;&gt;&lt;img src=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_Bombe.jpg&quot; alt=&quot;The Bombe&quot; width=&quot;300&quot;/&gt;&lt;/a&gt;
&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_Bombe.jpg&quot;&gt;The Bombe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_Colossus.jpg&quot;&gt;&lt;img src=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_Colossus.jpg&quot; alt=&quot;Colossus&quot; width=&quot;300&quot;/&gt;&lt;/a&gt;
&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_Colossus.jpg&quot;&gt;Colossus&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;También allí puede encontrarse la máquina &lt;code&gt;WITCH&lt;/code&gt;, que tiene el mérito de ser el ordenador de primera generación más antiguo aún en funcionamiento, y junto a él, está el ordenador &lt;code&gt;EDSAC&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Además de mainframes, un par de ordenadores &lt;code&gt;CRAY&lt;/code&gt;’s, de una buena colección de PCs, discos, válvulas y calculadoras, encontré, como no, un &lt;code&gt;Sinclair QL&lt;/code&gt; y sus dos hermanos, el &lt;code&gt;OPD&lt;/code&gt; y el &lt;code&gt;Merlin TONTO&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_OPD.jpg&quot;&gt;&lt;img src=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_OPD.jpg&quot; alt=&quot;OPD&quot; width=&quot;300&quot;/&gt;&lt;/a&gt;
&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_OPD.jpg&quot;&gt;OPD&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_Merlin_TONTO.jpg&quot;&gt;&lt;img src=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_Merlin_TONTO.jpg&quot; alt=&quot;Merlin TONTO&quot; width=&quot;300&quot;/&gt;&lt;/a&gt;
&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/TNMOC_Merlin_TONTO.jpg&quot;&gt;Merlin TONTO&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Este museo es muy pequeño, pero tiene voluntarios que explican con pasión lo que allí se encuentra, y merece la pena dedicarle el tiempo necesario para apreciar todo lo que tiene en tan poco espacio. Salí algo desencantado de allí por estacuestión, pensando qué mejor aprovechamiento podría hacerse de la exposición con más terreno, porque uno no es conciente de las maravillas que ese museo guarda.&lt;/p&gt;
&lt;p&gt;Se puede visitar en un &lt;a href=&quot;https://www.tnmoc.org/3d-virtual-tour-2026&quot;&gt;tour 3D online&lt;/a&gt; y ver todo con detalle. Y su página web está muy bien organizada.&lt;/p&gt;
&lt;p&gt;Antes de regresar, después de ver los dinosaurios del Museo de Historia Natural, visitamos lo poco que pudimos ver del Museo de la Ciencia, por falta de tiempo, donde además de cosas del espacio, encontramos máquinas tan interesantes como lo que queda del &lt;code&gt;LEO&lt;/code&gt; de Lyons, el primer ordenador comercial, un &lt;code&gt;PDP 10&lt;/code&gt;, un &lt;code&gt;IBM 360&lt;/code&gt; o un &lt;code&gt;Control Data 6600&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Science_Museum_LEO_Lyons_computer.jpg&quot;&gt;&lt;img src=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Science_Museum_LEO_Lyons_computer.jpg&quot; alt=&quot;LEO&quot; width=&quot;300&quot;/&gt;&lt;/a&gt;
&lt;a href=&quot;https://javguerra.badared.com/galeria/photos/2024-12-COMPUTER-LONDON/Science_Museum_LEO_Lyons_computer.jpg&quot;&gt;LEO&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si viajáis a Londres, ya tenéis plan turístico retro.&lt;/p&gt;
&lt;h2 id=&quot;enlaces&quot;&gt;Enlaces&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://javguerra.badared.com/galeria/?dir=2024-12-COMPUTER-LONDON&quot;&gt;Galería de fotos completa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bletchleypark.org.uk/&quot;&gt;Bletchley Park&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://es.wikipedia.org/wiki/Mujeres_en_Bletchley_Park&quot;&gt;Mujeres en Bletchley Park&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tnmoc.org/&quot;&gt;The National Museum Of Computing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sciencemuseum.org.uk/home&quot;&gt;Museo de la Ciencia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><enclosure url="https://javguerra.github.io/_astro/TNMOC_IBM_PC.RzqfNVsY_1kj0xJ.webp"/><category>algoritmia</category><category>computación</category><category>historia</category><category>londres</category><category>museo</category><category>criptografía</category><category>fotografía</category><category>internet</category><category>retro</category><category>servidor</category><category>sinclair ql</category><category>tic</category><category>viaje</category><category>enigma</category><author>JavGuerra</author></item></channel></rss>