<?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 «algoritmia»</title><description>Feed RSS de publicaciones etiquetadas con algoritmia</description><link>https://javguerra.github.io/</link><item><title>Fizz buzz</title><link>https://javguerra.github.io/blog/fizzbuzz</link><guid isPermaLink="true">https://javguerra.github.io/blog/fizzbuzz</guid><description>Prueba de programación</description><pubDate>Fri, 22 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://javguerra.github.io/_astro/code.BoBme8u9_ZyVCnB.webp&quot; alt=&quot;Programación&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;#algoritmia&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;«Fizz buzz» es un ejercicio que habitualmente se usa como prueba para la selección de candidatos en programación. Su origen es un &lt;a href=&quot;https://en.wikipedia.org/wiki/Fizz_buzz&quot;&gt;juego de niños&lt;/a&gt; para aprender a dividir.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Escribir un programa que muestre en pantalla los números del 1 al 100, sustituyendo los múltiplos de 3 por la palabra “fizz”, los múltiplos de 5 por “buzz” y los múltiplos de ambos, es decir, los múltiplos de 3 y 5 (o de 15), por la palabra “fizzbuzz”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Este simple enunciado encierra toda una gama de posibilidades en su algoritmo de resolución, y en él es de importancia tanto la rapidez con la que se resuelve el problema como la optimización (u originalidad) del código.&lt;/p&gt;
&lt;p&gt;Esta es mi propuesta de resolución en JavaScript.&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;js&quot;&gt;&lt;code&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; result&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&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:#F97583&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; value &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;&apos;&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) value &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;fizz&apos;&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:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) value &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;buzz&apos;&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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  result.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(value &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&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;(result.&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;&apos;, &apos;&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;Básicamente el programa comprueba en bucle si cada número del 1 al 100 es divisible por 3 ó por 5. Si lo es, guarda  «fizz», «buzz» o «fizzbuzz» en el caso de ser divisible por los dos (3 y 5). Si no lo es, guarda el número que estoy evaluando y pasa al siguiente número.&lt;/p&gt;
&lt;p&gt;Esta es una versión que además de correcta, es muy legible. Pero si quisiéramos hacer una versión al estilo funcional, por ejemplo para usarla en React, podríamos emplear map.&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;js&quot;&gt;&lt;code&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; result&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Array&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;keys&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;  .&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;map&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:#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:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; n&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&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:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;fizz&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;buzz&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&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;  .&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;&apos;, &apos;&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&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;(result);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;¿Crees que puede optimizarse más?&lt;/p&gt;
&lt;ul&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/code.BoBme8u9_ZyVCnB.webp"/><category>código</category><category>javascript</category><category>algoritmia</category><author>JavGuerra</author></item><item><title>Lógica interactiva</title><link>https://javguerra.github.io/blog/logica-interactiva</link><guid isPermaLink="true">https://javguerra.github.io/blog/logica-interactiva</guid><description>Opciones, eventos, disparadores y estados</description><pubDate>Sat, 30 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://javguerra.github.io/_astro/decisiones.Dh9wsimN_1ihbMt.webp&quot; alt=&quot;Decisiones&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;#algoritmia&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Programar es una diversión difícil. En ocasiones las interacciones entre los disparadores de eventos y los estados de las variables y los objetos interelacionados multiplican sus opciones, haciendo complicado establecer, de memoria, todas las permutaciones posibles para no dejar ninguna de ellas sin implementar en nuestro código.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.github.io/ejercicios-web-javascript/12-nodos.html&quot;&gt;&lt;button&gt;Página web de ejemplo&lt;/button&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En la página que he preparado para ilustrar esta entrada, tenemos cinco botones de un menú de opciones. Cada opción interactúa con los estados de los otros botones mientras se van añadiendo, quitando o cambiando elementos del DOM (en este caso artículos de una sección), y activando o desactivando los botones según sea necesario en cada momento. Es fácil entender la mecánica del ejemplo probándolo.&lt;/p&gt;
&lt;p&gt;Los disparadores son los botones que generan eventos, y algunas condiciones del propio programa, como cuando hemos borrado todos los elementos del DOM o cuando añadimos el primer elemento tras ello. Los estados corresponden a los botones ON/OFF, y al valor de las variables que se emplean para llevar a cabo las acciones asignadas a cada botón.&lt;/p&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;Decisiones&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;@/assets/img/opciones.png&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;Imaginemos que con el botón «Cambiar» alteramos el contenido del último elemento de la lista de elementos que hemos añadido al DOM (como se ve en la imagen). Esto hará que el botón «Cambiar» se desactive en este momento, porque ya no tenemos que cambiar el elemento recien cambiado, y el botón «Limpiar» se active, si no lo estaba ya, para ofrecer al usuario la opción de limpiar los elementos cambiados. Si borramos seguidamente este último elemento con «Borrar», deberemos comprobar si el botón «Limpiar» debe desactivarse si ya no hay elementos cambiados, y si el botón «Cambiar» debe activarse de nuevo si el que ahora es el último elemento no fue cambiado anteriormente, o mantenerse desactivado en tal caso. Añadir nuevos elementos altera otra vez el estado del botón «Cambiar» que debe activarse ofreciendo la opción de cambiar este nuevo elemento. Estas son algunas de las permutaciones posibles.&lt;/p&gt;
&lt;h2 id=&quot;tabla-disparadoresestados&quot;&gt;Tabla «disparadores/estados»&lt;/h2&gt;
&lt;p&gt;Mediante una tabla en una sencilla hoja de cálculo podemos contabilizar en el eje de las &lt;strong&gt;Y&lt;/strong&gt; (primera columna) todos aquellos disparadores (eventos y condiciones) de nuestra aplicación, y en el eje de las &lt;strong&gt;X&lt;/strong&gt; (filas) todos los estados, tanto de las variables como de los objetos (botones u otros), y ver cómo se interelacionan en tiempo de ejecución. &lt;u&gt;Lo difícil entonces será determinar con claridad cuáles son los disparadores y cuáles los estados&lt;/u&gt;. Si lo hacemos bien, con esta herramienta podemos clarificar, sin olvidar nada, cada interacción lógica derivada de las opciones de la aplicación, de forma similar a como se ve en la siguiente imagen.&lt;/p&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;Decisiones&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;@/assets/img/tabla-disparadores-estados.png&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;En este ejemplo, «Arranque» se refiere al estado de los botones al inicio. «Click btn…» corresponde a la pulsación de cada uno de los cinco botones. «Sin elementos» corresponde a la situación en la que se han borrado todos los elementos. «Añadir primer elemento» corresponde a los cambios a realizar cuando esta condición se presenta. Por último, «Click de inicio» y «Click de parada» corresponden al estado de los botones cuando los pulsamos y cuando se termina de realizar su tarea asignada. Como se aprecia, los botones son desactivados al pulsarlos para impedir que puedan ser pulsados de nuevo en tanto no terminen su ejecución, momento en el que (algunos de ellos) son reactivados.&lt;/p&gt;
&lt;p&gt;Esta tabla resumida incluye sólo la interacción de estados de los botones, -obviando el estado de las variables para no complicar el ejemplo-, anotando en las celdas de cada columna el estado del botón según los disparadores indicados al principio de cada fila. A la hora de pasar a la fase de codificación de nuestra aplicación, nos será fácil determinar si hemos implementado todas y cada una de las interacciones posibles reflejadas en la tabla simplemente cotejándola. Cuando tengas ante ti un abanico de opciones inabarcables, esta puede ser una solución para salir del atolladero.&lt;/p&gt;
&lt;p&gt;De paso, este ejercicio sirve para mostrar el uso de JavaScript en el manejo de nodos del DOM.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://javguerra.github.io/ejercicios-web-javascript/12-nodos.html&quot;&gt;&lt;button&gt;Ver el ejercicio interactivo on-line&lt;/button&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Descargar la tabla de decisiones completa del ejercicio en formato &lt;a href=&quot;https://javguerra.github.io/ejercicios-web-javascript/12-nodos-tabla.ods&quot;&gt;.ods (Open Document)&lt;/a&gt; o &lt;a href=&quot;https://javguerra.github.io/ejercicios-web-javascript/12-nodos-tabla.xls&quot;&gt;.xls (Excel)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Actualización&lt;/strong&gt;. Ver este ejemplo de uso de botonera aún más complicado: &lt;a href=&quot;/blog/cronometro-js&quot;&gt;Cronómetro en JavaScript&lt;/a&gt;&lt;/p&gt;
</content:encoded><enclosure url="https://javguerra.github.io/_astro/decisiones.Dh9wsimN_1ihbMt.webp"/><category>código</category><category>javascript</category><category>algoritmia</category><author>JavGuerra</author></item><item><title>Algoritmia</title><link>https://javguerra.github.io/blog/algoritmia</link><guid isPermaLink="true">https://javguerra.github.io/blog/algoritmia</guid><description>Los algoritmos nos enseñan el camino</description><pubDate>Sat, 24 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://javguerra.github.io/_astro/algoritmo.CalgIDT7_Z20MBaj.webp&quot; alt=&quot;Organigrama&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;#formación&lt;/em&gt;, &lt;em&gt;#alumnos&lt;/em&gt;, &lt;em&gt;#algoritmia&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Cuando tenemos que resolver problemas, ya sea en el ámbito de la programación o en el de nuestras vidas, reflexionamos sobre cómo podemos llegar a una solución ajustada a la medida del reto al que nos enfrentamos. Ese proceso requiere crear un algoritmo eficaz compuesto de una serie de pasos bien definidos. En esta entrada veremos, con algo de detalle, las bases para generar algoritmos de resolución exitosos.&lt;/p&gt;
&lt;h1 id=&quot;definición&quot;&gt;Definición&lt;/h1&gt;
&lt;p&gt;Un algoritmo es una secuencia ordenada de &lt;strong&gt;pasos&lt;/strong&gt;, descrita sin ambigüedades, que conducen a la &lt;strong&gt;solución de un problema&lt;/strong&gt; dado. &lt;a href=&quot;https://es.wikipedia.org/wiki/Algoritmo&quot;&gt;+info&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Puedes ver este &lt;a href=&quot;https://youtu.be/U3CGMyjzlvM&quot;&gt;video&lt;/a&gt; para tener una idea más clara de lo que es un algoritmo.&lt;/p&gt;
&lt;h1 id=&quot;qué-necesitamos&quot;&gt;¿Qué necesitamos?&lt;/h1&gt;
&lt;p&gt;Para resolver problemas necesitamos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lápiz y papel&lt;/li&gt;
&lt;li&gt;Datos&lt;/li&gt;
&lt;li&gt;Conocimientos específicos en la materia y capacidad lógica&lt;/li&gt;
&lt;li&gt;Que el problema sea resoluble&lt;/li&gt;
&lt;li&gt;Paciencia y compromiso (tolerancia a la frustración)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Mediante lápiz y papel empezamos a esbozar el problema, acercándolo a nuestro entendimiento, incluyendo los datos de que disponemos y los que nos faltan, aplicando los conocimientos que tenemos sobre el tema en cuestión y haciendo uso de la lógica para organizarlo todo. Ciertamente el problema debe tener solución, al menos en un plazo de tiempo asumible, y va a requerir de nosotros implicación para resolverlo.&lt;/p&gt;
&lt;h1 id=&quot;pensamiento-lógico&quot;&gt;Pensamiento lógico&lt;/h1&gt;
&lt;p&gt;El pensamiento lógico alude a la capacidad para resolver problemas, conceder ideas y formalizar conclusiones de manera coherente y sin contradicciones. Es un modo de pensamiento que relaciona las ideas, hechos, acciones o cosas de forma congruente.&lt;/p&gt;
&lt;h2 id=&quot;lógica-para-la-resolución-de-problemas&quot;&gt;Lógica para la resolución de problemas&lt;/h2&gt;
&lt;p&gt;La base de la programación es la capacidad para resolver problemas, por eso, de entrada, no debemos enfocarnos en la herramienta (aplicación, lenguaje de programación…), sino en la lógica que nos ayudará a implementar un algoritmo de resolución.&lt;/p&gt;
&lt;h2 id=&quot;pasos&quot;&gt;Pasos&lt;/h2&gt;
&lt;p&gt;Antes de ofrecer o implementar una solución, debemos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Anotar las indicaciones recibidas sobre el problema: Escuchar, mirar y entender.&lt;/li&gt;
&lt;li&gt;Preguntar o resolver dudas y completar los datos de los que no dispongamos.&lt;/li&gt;
&lt;li&gt;Realizar un &lt;em&gt;briefing&lt;/em&gt; de condiciones sobre el problema.&lt;/li&gt;
&lt;li&gt;Pensar el algoritmo (pasos): escribir o dibujar qué vamos a hacer.&lt;/li&gt;
&lt;li&gt;Verificar el algoritmo.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Oir, ver y anotar no es lo mismo que escuchar, mirar y entender. El proceso de comprender el problema requiere una implicación activa por nuestra parte que nos permita procesar la información que recibimos para entender lo que nos piden, los mensajes implícitos, lo que no se dice, lo que se sobreentiende.&lt;/p&gt;
&lt;h2 id=&quot;habilidades-del-pensamiento&quot;&gt;Habilidades del pensamiento¹&lt;/h2&gt;
&lt;p&gt;Para resolver un problema lógico, serán de ayuda los siguientes procesos cognitivos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Observación&lt;/strong&gt;, &lt;strong&gt;comparación&lt;/strong&gt; y &lt;strong&gt;descripción&lt;/strong&gt;: Fijar la atención para identificar y comunicar características, semejanzas y diferencias del problema con otros casos conocidos por nosotros.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Análisis&lt;/strong&gt; (descomposición), &lt;strong&gt;clasificación&lt;/strong&gt; y &lt;strong&gt;relación&lt;/strong&gt;: Dividir el problema en partes más pequeñas para simplificarlo, poder organizarlo y establecer nexos entre las partes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Síntesis&lt;/strong&gt; y &lt;strong&gt;reconocimiento de patrones&lt;/strong&gt;: Buscar similitudes entre las partes e integrar las características del problema para encontrar soluciones aplicables a este conjunto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abstracción&lt;/strong&gt; y &lt;strong&gt;evaluación&lt;/strong&gt;: Centrarse los puntos fundamentales del problema para valorar soluciones generales que sean aplicables al mayor número de casos posibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Bibliografía: Amestoy de Sánchez, M. (2010). Desarrollo de habilidades del pensamiento: procesos básicos del pensamiento. 2ª edición. México: Editorial Trillas.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;el-algoritmo&quot;&gt;El algoritmo&lt;/h1&gt;
&lt;p&gt;Para la consecución de un algoritmo se llevarán a cabo procesos inteligentes mediante los cuales la información que recibimos es transformada, reducida, elaborada, almacenada, recuperada y empleada en la solución de problemas y la toma de decisiones.&lt;/p&gt;
&lt;p&gt;La inteligencia determina nuestra capacidad para adaptarnos: comprender, razonar y emplear recursos de forma efectiva para resolver problemas.&lt;/p&gt;
&lt;h2 id=&quot;cómo&quot;&gt;¿Cómo?&lt;/h2&gt;
&lt;p&gt;Todo algoritmo consta de tres partes: &lt;strong&gt;entrada → proceso → salida&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Para llegar a un algoritmo válido, debemos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hacer una adecuada recogida de información (&lt;em&gt;briefing&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Tomarnos un tiempo para analizar el problema.&lt;/li&gt;
&lt;li&gt;Idear una solución que se ajuste al problema.&lt;/li&gt;
&lt;li&gt;Expresarla en un lenguaje intermedio que nos permita describir el algoritmo.&lt;/li&gt;
&lt;li&gt;Programar el algoritmo usando un lenguaje de programación.&lt;/li&gt;
&lt;li&gt;Ejecutar el programa para comprobar si se ha conseguido llegar a la solución.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;características&quot;&gt;Características&lt;/h2&gt;
&lt;p&gt;Un algoritmo válido debe contar con una serie de características:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debe tener un punto de inicio bien definido.&lt;/li&gt;
&lt;li&gt;El algoritmo debe ser general y resolver el problema con distintos datos de entrada.&lt;/li&gt;
&lt;li&gt;Los procesos de entrada y salida descritos deben ser explícitos.&lt;/li&gt;
&lt;li&gt;Ante los mismos datos de entrada se deben obtener siempre los mismos resultados de salida.&lt;/li&gt;
&lt;li&gt;Los pasos deben ser secuenciales y ordenados.&lt;/li&gt;
&lt;li&gt;Cada paso debe quedar claro y no dar pie a dobles interpretaciones.&lt;/li&gt;
&lt;li&gt;El algoritmo debe ser finito respecto a su tamaño (pasos) y tiempo de ejecución.&lt;/li&gt;
&lt;li&gt;Ante varios algoritmos que resuelvan el mismo problema, siempre será preferible el que tenga un camino más corto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La &lt;strong&gt;práctica&lt;/strong&gt; y &lt;strong&gt;la experiencia&lt;/strong&gt;, a través de los procesos de ensayo y error, son de gran ayuda en la consecución de algoritmos cada vez más refinados y en menor tiempo.&lt;/p&gt;
&lt;h1 id=&quot;representación-algorítmica&quot;&gt;Representación algorítmica&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Pseudocódigo&lt;/strong&gt;: Es una forma de descripción escrita de algoritmos que usa las convecciones estructurales de un lenguaje de programación. &lt;a href=&quot;https://es.wikipedia.org/wiki/Pseudoc%C3%B3digo&quot;&gt;+info&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagrama de flujo&lt;/strong&gt;: Es una forma de representación gráfica de algoritmos que usa las convecciones estructurales de un lenguaje de programación. Es un tipo de representación más formal. Se usa para documentar y trabajar en equipo siguiendo normativas concretas. &lt;a href=&quot;https://es.wikipedia.org/wiki/Diagrama_de_flujo&quot;&gt;+info&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Puedes utilizar la herramienta multiplataforma &lt;a href=&quot;https://pseint.sourceforge.net/&quot;&gt;PSeInt&lt;/a&gt; para crear pseudocódigo en español y sus diagramas de flujo asociados. La página cuenta con &lt;a href=&quot;https://pseint.sourceforge.net/index.php?page=documentacion.php&quot;&gt;documentación&lt;/a&gt; en línea para el uso de esta herramienta.&lt;/p&gt;
&lt;h1 id=&quot;error-defecto-fallo&quot;&gt;Error, defecto, fallo&lt;/h1&gt;
&lt;p&gt;¿De qué hablamos cuando verificamos?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Error&lt;/strong&gt;: equivocación realizada por una persona (en la actividad del desarrollo software).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Defecto&lt;/strong&gt;: resultado de introducir un error en un programa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fallo&lt;/strong&gt;: representación del defecto en el comportamiento del sistema.&lt;/p&gt;
&lt;p&gt;La detección de errores implica la revisión del código (depuración) y posiblemente la re-evaluación del algoritmo en el que se basa.&lt;/p&gt;
&lt;h1 id=&quot;verificación-del-algoritmo&quot;&gt;Verificación del algoritmo&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;«La prueba de un programa sólo puede mostrar la presencia de defectos, no su ausencia» - Edsger Wybe Dijkstra&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un análisis «empírico» es el que se basa en experimentación y observación real de los resultados. Para ello sometemos al algoritmo a una serie de pruebas empíricas en la que, partiendo de ciertos valores de entrada, debemos obtener resultados ajustados a lo esperado o, en caso contrario, detectar defectos en el algoritmo.&lt;/p&gt;
&lt;p&gt;Se suele traducir el algoritmo a código informático para efectuar sobre él pruebas denominadas «&lt;a href=&quot;https://es.wikipedia.org/wiki/Pruebas_de_caja_blanca&quot;&gt;de caja blanca&lt;/a&gt;» y «&lt;a href=&quot;https://es.wikipedia.org/wiki/Caja_negra_(sistemas)&quot;&gt;de caja negra&lt;/a&gt;», y experimentar con valores de entrada de un rango representativo de la solución buscada, y también con un rango de valores límite y de valores aleatorios (&lt;em&gt;testing&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Para la integración del algoritmo dentro de un programa de mayores dimensiones se llevan a cabo otro tipo de pruebas, por ejemplo de &lt;a href=&quot;https://es.wikipedia.org/wiki/Prueba_de_integraci%C3%B3n&quot;&gt;integración&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;verificación-vs-validación&quot;&gt;Verificación vs. validación&lt;/h2&gt;
&lt;p&gt;No es lo mismo verificar que validar. El algoritmo puede funcionar correctamente, pero puede que el algoritmo no resuelva correctamente el problema.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verificación&lt;/strong&gt;: ¿Estamos construyendo correctamente el algoritmo?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validación&lt;/strong&gt;: ¿Estamos construyendo el algoritmo correcto?&lt;/p&gt;
&lt;p&gt;La validación de la solución que propone el algoritmo la efectúa el usuario que necesita resolver el problema una vez implementada la solución. Por eso es muy importante realizar un buen &lt;em&gt;briefing&lt;/em&gt; de requisitos, para que la solución resuelva exactamente el problema planteado y no otro.&lt;/p&gt;
&lt;h1 id=&quot;ejercicios&quot;&gt;Ejercicios&lt;/h1&gt;
&lt;p&gt;Una vez entendidos los conceptos y pasos descritos anteriormente, te propongo que realices estos ejercicios:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Continua la secuencia: 1, 5, 9, 13, 17, ?&lt;/li&gt;
&lt;li&gt;Relaciona «disciplina» y «éxito».&lt;/li&gt;
&lt;li&gt;Clasifica e indica la categoría de: manzana, limón, naranja, sandía, pera, piña.&lt;/li&gt;
&lt;li&gt;Enumera las partes de un coche.&lt;/li&gt;
&lt;li&gt;¿Cómo podemos garantizar la calidad de un producto de consumo?&lt;/li&gt;
&lt;li&gt;Describe un perro.&lt;/li&gt;
&lt;li&gt;¿Cómo funciona un ascensor?&lt;/li&gt;
&lt;li&gt;Inventa una máquina de untar tostadas.&lt;/li&gt;
&lt;li&gt;Describe las &lt;strong&gt;habilidades cognitivas&lt;/strong&gt; implicadas en los ejercicios anteriores.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;reto-el-barco&quot;&gt;Reto: El barco&lt;/h1&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;Barco&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;@/assets/img/barco.png&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;Intenta realizar el ejercicio considerando las instrucciones siguientes. Tienes la solución para consultar una vez lo hayas completado.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/assets/doc/barco.pdf&quot;&gt;Instrucciones para realizar el ejercicio del barco (PDF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/assets/doc/barco_solucion.txt&quot;&gt;Solución (TXT)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;saber-más&quot;&gt;Saber más&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://es.khanacademy.org/computing/computer-science/algorithms&quot;&gt;Algortitmos&lt;/a&gt; - Ciencias de la computación, Habilidades. Khan Academy. Incluye material introductorio y también explicaciones sobre cómo funcionan distintos tipos de algoritmos y los algoritmos de ordenación.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><enclosure url="https://javguerra.github.io/_astro/algoritmo.CalgIDT7_Z20MBaj.webp"/><category>formación</category><category>alumnos</category><category>algoritmia</category><author>JavGuerra</author></item><item><title>Curso de Python y algoritmia</title><link>https://javguerra.github.io/blog/curso-python</link><guid isPermaLink="true">https://javguerra.github.io/blog/curso-python</guid><description>Materiales para el alumnado</description><pubDate>Mon, 22 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://javguerra.github.io/_astro/algoritmo.CalgIDT7_Z20MBaj.webp&quot; alt=&quot;Internet.&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;#python&lt;/em&gt;, &lt;em&gt;#programación&lt;/em&gt;, &lt;em&gt;#formación&lt;/em&gt;, &lt;em&gt;#alumnos&lt;/em&gt;, &lt;em&gt;#algoritmia&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Durante el mes de julio del pasado año llevé a cabo una formación sobre introducción a Python orientado a la automatización para la Fundación GoodJob en el que incluí el material sobre &lt;a href=&quot;/blog/algoritmia&quot;&gt;algoritmia&lt;/a&gt; disponible en esta entrada, así como varios ejercicios.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/JavGuerra/curso-python-algoritmia&quot;&gt;&lt;button&gt;Ir al curso de Python&lt;/button&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Su duración fue de dos semanas, y el objetivo era «cambiar el chip» para orientar los conocimientos del alumnado hacia la resolución de problemas lógicos, lo que implicó también algunos otros conceptos como los de gestión de procesos, cercanos a la automatización, que era el área de especialización en la que iban a trabajar en Telefónica.&lt;/p&gt;
&lt;p&gt;Primaba pues en esta formación, no tanto la adquisición de conocimientos sobre programación en un lenguaje concreto como Python, -que si bien es fácil de aprender no puede ser entendido en toda su extensión en dos semanas-, sino la adquisición de habilidades de pensamiento propicias para el desempeño lógico.&lt;/p&gt;
&lt;h1 id=&quot;contenido-impartido-materiales&quot;&gt;Contenido impartido (Materiales)&lt;/h1&gt;
&lt;h2 id=&quot;algoritmia&quot;&gt;Algoritmia&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Algoritmia&lt;/li&gt;
&lt;li&gt;Ejercicios de algoritmia&lt;/li&gt;
&lt;li&gt;Ejercicio: El barco (.odt)&lt;br&gt;
Solución: El barco&lt;/li&gt;
&lt;li&gt;Ejercicios: carretera, café&lt;br&gt;
Solución: Carretera (.png)&lt;/li&gt;
&lt;li&gt;Ejercicio: La máquina del tiempo&lt;/li&gt;
&lt;li&gt;Ejercicios: carrera, cumpleaños&lt;/li&gt;
&lt;li&gt;Ejercicio: Helpdesk&lt;br&gt;
Solución: Helpdesk&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;python&quot;&gt;Python&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Introducción a la programación (.odt)&lt;/li&gt;
&lt;li&gt;Recursos Python (.odt)&lt;/li&gt;
&lt;li&gt;Retos Python (.odt)&lt;/li&gt;
&lt;li&gt;Variables, operadores, funciones y métodos (.odt)&lt;/li&gt;
&lt;li&gt;Condicionales (.odt)&lt;/li&gt;
&lt;li&gt;Operaciones lógicas: apuntes (.odt)&lt;/li&gt;
&lt;li&gt;Condicionales II, bucles (.odt)&lt;/li&gt;
&lt;li&gt;Colecciones, funciones II (.odt)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;repositorio&quot;&gt;Repositorio&lt;/h2&gt;
&lt;p&gt;Los listados de código de los contenidos impartidos pueden encontrarse en la carpeta &lt;code&gt;src&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Materiales: &lt;a href=&quot;https://github.com/JavGuerra/curso-python-algoritmia&quot;&gt;Curso sobre Python y algoritmia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ver-también&quot;&gt;Ver también&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/blog/algoritmia&quot;&gt;Algoritmia&lt;/a&gt;, Los algoritmos nos enseñan el camino.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;actualizaciones&quot;&gt;Actualizaciones&lt;/h2&gt;
&lt;p&gt;Se han actualizado los contenidos de los siguientes repositorios con nuevos materiales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JavGuerra/curso-competencias-digitales&quot;&gt;Curso sobre competencias digitales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JavGuerra/apuntes-tic&quot;&gt;Apuntes TIC - materiales&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><enclosure url="https://javguerra.github.io/_astro/algoritmo.CalgIDT7_Z20MBaj.webp"/><category>python</category><category>programación</category><category>formación</category><category>alumnos</category><category>algoritmia</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>