Orden y concierto

Informática geek, matemáticas, pensamiento crítico y alguna otra cosa de vez en cuando.

2011-08-23

Si te gusta el té fuerte, he aquí un simple consejo: no le pongas azúcar o leche hasta que el té se haya disuelto por completo. Esto favorecerá que el agua tenga menos soluto, permitiéndole así disolver más cantidad de té.

2011-08-19

Nostalgia - Los programadores de verdad no usan Pascal

Me he reencontrado recientemente con este texto en mis archivos. Releerlo ha sido una experiencia bastante nostálgica. He creído conveniente reproducirlo en versión castellana. La versión inglesa está todavía disponible en línea, así que ofrezco aquí mi traducción. Parece ser que fue publicado en 1983. Helo aquí en toda su gloria:

Los Programadores de Verdad No Usan Pascal

En los buenos tiempos, la "Edad de Oro" de los ordenadores, era fácil separar a los hombres de verdad de los críos (a veces en la literatura se les ha llamado "Hombres de Verdad" y "Comedores de Pastelitos"). Durante ese periodo, los Hombres de Verdad eran los que comprendían la programación de ordenadores y los Comedores de Pastelitos eran los que no. Un auténtico programador de ordenadores decía cosas como:

  DO 10 I = 1, 10
y
  ABEND

Hablaban en mayúsculas, ya me entienden. El resto del mundo decía cosas como "los ordenadores son demasiado complicados para mí", y "no puedo relacionarme con ordenadores: son tan impersonales...". Un escrito anterior (1) puntualiza que los Hombres de Verdad no se relacionan con nada, y no temen ser impersonales. Pero, como suele pasar, los tiempos cambian. Hoy nos enfrentamos a un mundo en el que las señoras tienen ordenadores en su horno de microondas, los niños de 12 años pueden vencer a los Hombres de Verdad jugando al Asteroids o al Pac-Man, y cualquiera puede comprar y comprender su propio ordenador personal. El Programador de Verdad está en peligro de extinción, en peligro de ser reemplazado por estudiantes universitarios con Commodores y Ataris. Hay una clara necesidad de puntualizar las diferencias entre un típico jugador junior de Pac-Man de universidad y el Programador de Verdad. Si se aclara esta diferencia, les dará a esos muchachos algo a lo que aspirar - un modelo, una figura paterna. También ayudará a explicar al que tenga contratado a un Programador de Verdad por qué sería un error reemplazar a los Programadores de Verdad de su plantilla por jugadores-de-PacMan-de-12-años (que le suponen un ahorro considerable).

1.1 Lenguajes

La forma más fácil de distinguir a un Programador de Verdad del resto es por el lenguaje de programación que él o ella usa. Los Programadores de Verdad usan Fortran. Los Comedores de Pastelitos usan Pascal. Nicklaus Wirth, el diseñador del Pascal, dio una conferencia una vez en la que le preguntaron: "¿Cómo pronuncia usted su nombre?" El respondió: "Pueden llamarme por mi nombre, pronunciándolo 'Virt', o pueden llamarme por mi valor, 'Worth'" [valioso, merecedor - N.del T.]. Enseguida se deduce de ese comentario que Nicklaus Wirth es un Comedor de Pastelitos. El único mecanismo de pase de parámetros que usan los Programadores de Verdad es la "llamada por valor - retorno", como se implementa en los compiladores de FORTRAN G y H del IBM/370. Los Programadores de Verdad no necesitan todos esos conceptos abstractos para hacer su trabajo: son perfectamente felices con un teclado perforador, un compilador FORTRAN IV, y una cerveza.

  • Los Programadores de Verdad realizan Proceso de Listas en FORTRAN.
    [N.del T.: Proceso de Listas = List Processing, de donde viene el nombre del lenguaje de programación LISP]
  • Los Programadores de Verdad realizan Manipulación de Cadenas en FORTRAN.
  • Los Programadores de Verdad hacen Contabilidad (si es que la hacen) en FORTRAN.
  • Los Programadores de Verdad hacen programas de Inteligencia Artificial en FORTRAN.

Si no puedes hacerlo en FORTRAN, hazlo en Lenguaje Ensamblador, o no merecerá la pena hacerlo.

1.2 Programación Estructurada

Los académicos de la ciencia de computación se han hecho esclavos de la "Programación Estructurada" durante los últimos años. Afirman que los programas son más fácilmente comprensibles si el programador utiliza ciertas construcciones especiales del lenguaje, por supuesto, y los ejemplos que usan para mostrar su punto de vista caben invariablemente en una sola hoja de alguna que otra oscura publicación, ejemplo claramente insuficiente para convencer a nadie. Cuando salí de la escuela, pensaba que era el mejor programador del mundo. Podía escribir un programa invencible de tres en raya, usar cinco lenguajes de ordenador diferentes, y crear programas de 1000 líneas que funcionaban (¡de verdad!). Entonces salí al Mundo Real. Mi primer trabajo fue leer y comprender un programa en FORTRAN de 20.000 líneas, para acelerarlo al doble de su velocidad. Cualquier Programador de Verdad te dirá que toda la Programación Estructurada del mundo no te ayudará a solucionar un problema como ese: requiere auténtico talento. Algunas observaciones a bote pronto sobre los Programadores de Verdad y la Programación Estructurada:

  • Los Programadores de Verdad no temen usar GOTO.
  • Los Programadores de Verdad pueden escribir bucles DO de cinco páginas sin confundirse.
  • Los Programadores de Verdad disfrutan con las sentencias IF aritméticas: hacen el código más interesante.
  • Los Programadores de Verdad escriben código automodificable, especialmente si pueden ahorrar 20 nanosegundos en mitad de un bucle crítico.
  • Los Programadores de verdad no necesitan comentarios: el código es obvio.

Aunque el FORTRAN no tiene sentencias IF, REPEAT...UNTIL ni CASE estructuradas, los Programadores de Verdad no se preocupan por no poder usarlos. Además, todas esas estructuras pueden ser simuladas mediante GOTOs cuando es necesario.

Las estructuras de datos también han recibido mucha atención últimamente. Los Tipos Abstractos, Estructuras, Punteros, Listas y Cadenas se han hecho muy populares en ciertos círculos. Nicklaus Wirth (el antes mencionado Comedor de Pastelitos) ha conseguido escribir todo un libro (2) defendiendo que se puede escribir un programa basándose en Estructuras de Datos en lugar de todo lo habitual. Como todos los Programadores de Verdad saben, la única estructura de datos útil es el ARRAY. Las cadenas, listas, estructuras, conjuntos... son sólo casos especiales de Arrays y pueden ser tratados de esa forma fácilmente sin necesidad de ensuciar el lenguaje de programación con todo tipo de complicaciones. Lo peor sobre los tipos de datos bonitos es que tienes que declararlos, y todos los Lenguajes de Programación de Verdad, como todos sabemos, tienen tipos implícitos basados en la primera letra del nombre (de seis caracteres) de la variable.

1.3 Sistemas Operativos

¿Qué tipo de sistema operativo usa el Programador de Verdad? ¿CP/M? Por favor, el CP/M, después de todo, es básicamente un sistema operativo de juguete. Hasta las señoras respetables y los estudiantes de primaria pueden usar y entender el CP/M. El UNIX es mucho más complicado, por supuesto: el típico hacker de UNIX nunca es capaz de recordar cómo se llama el comando de imprimir esta semana. Cuando se le conoce bien, el UNIX no es sino un video juego glorificado. La gente no hace trabajo serio en sistemas UNIX: envían chistes por el mundo a través de una red UUCP, y escriben juegos de aventuras y artículos de investigación. No, el Programador de Verdad usa OS/370. Un buen programador puede encontrar en el manual del JCL y comprender la descripción de un mensaje de error IJK3051 que acaba de aparecerle. Un gran programador puede escribir JCL sin recurrir al manual del JCL en absoluto. Un programador realmente bueno puede encontrar bugs enterrados en un volcado hexadecimal de seis Megabytes sin usar una calculadora hexadecimal. El OS/370 es un sistema operativo realmente destacable. Es posible destruir días de trabajo con un simple espacio fuera de lugar (nos ocurre hasta a los mejores), así que se favorece la alerta entre el personal de programación. La forma de acercarse más al sistema es mediante un teclado perforador. Hay gente que afirma que hay un sistema de Compartición de Tiempos que funciona en OS/370, pero tras un cuidadoso estudio he llegado a la conclusión de que estaban equivocados.

Referencias:

(1) Fierstein, B., Real Men Don't Eat Quiche, New York, Pocket Books, 1982
(2) Wirth, N., Algorithms+Data Structures=Programs, Prentice Hall, 1976

1.4 Herramientas de Programación

¿Qué tipo de herramientas usa un programador de verdad? En teoría, un programador de verdad podría ejecutar sus programas tecleándolos en el panel frontal de un ordenador. En los tiempos en los que los ordenadores tenían paneles frontales, esto se hacía en alguna ocasión. El típico programador de verdad se conocía de memoria la rutina de arranque en hexadecimal, y la reemplazaba cuando su programa destruía el arranque. Por entonces, la memoria era memoria: no se iba al quitar la alimentación. Hoy, la memoria bien olvida cosas que no quieres, o recuerda demasiado tiempo lo que sería mejor olvidar. Dice la leyenda que Seymour Cray (el inventor del superordenador Cray-1 y la mayoría de los ordenadores de Control Data) tecleó el primer sistema operativo del CDC-7600 en el panel frontal de memoria la primera vez que fue puesto en marcha. Seymour, por supuesto, es un programador de verdad.

Uno de mis programadores de verdad favoritos era un programador de sistemas de Texas Instruments. Un día, recibió una llamada de larga distancia de un usuario cuyo sistema se había venido abajo a mitad de salvar un trabajo importante. Jim fue capaz de reparar el daño por teléfono, consiguiendo que el usuario metiera las instrucciones de E/S de disco en el panel frontal, reparando las tablas del sistema en hexadecimal, leyendo los contenidos de los registros a través del teléfono. La moraleja de la historia: aunque un programador de verdad normalmente incluye un teclado perforador y una impresora de líneas entre sus herramientas, puede desenvolverse bien con sólo un panel frontal y un teléfono en caso de emergencia.

En algunas compañías, la edición de textos ya no consiste en diez ingenieros esperando en fila para usar un teclado perforador 029. De hecho, el edificio en que trabajo no tiene ni un solo teclado perforador. El programador de verdad, al verse en esa situación, tiene que trabajar con un programa de edición de textos. La mayoría de los sistemas proporcionan varios editores de textos entre los que seleccionar, y el programador de verdad debe tener cuidado de elegir el que más refleja su estilo personal. Mucha gente cree que los mejores editores de texto del mundo se escribieron en el Centro de Investigación Xerox de Palo Alto para usarse en sus ordenadores Alto y Dorado (3). Por desgracia, ningún programador de verdad usaría un ordenador con un sistema operativo llamado SmallTalk, y desde luego nunca le hablaría a un ordenador con un ratón.

Algunos de los conceptos de esos editores de Xerox han sido incorporados en editores que funcionan en sistemas más razonables, por ejemplo EMACS y VI. El problema con dichos editores es que los programadores de verdad consideran que "lo que ves es lo que hay" [también llamado WYSIWYG - N.del T.] es un concepto tan malo aplicado a los editores como lo es aplicado a las mujeres. No, el programador de verdad prefiere un editor tipo "tú lo has pedido, ahí lo tienes": complicado, críptico, potente, inolvidable, y peligroso. TECO para ser preciso.

Se ha observado que una secuencia de comandos de TECO se parece más al ruido de transmisión de línea que a texto legible (4). Un entretenido juego que se puede jugar con TECO es escribir tu nombre en la línea de comandos e intentar adivinar lo que hará. Casi cualquier error de escritura durante la comunicación con TECO destruirá probablemente tu programa, o aún peor, introducirá bugs misteriosos y sutiles en una subrutina que antes funcionaba.

Por esta razón, los programadores de verdad se muestran recelosos a la hora de editar un programa que está próximo a funcionar. Encuentran mucho más fácil editar el código objeto en binario directamente, usando un maravilloso programa llamado SUPERZAP. Este sistema funciona tan bien que muchos programas en funcionamiento en sistemas IBM no mantienen relación alguna con su código FORTRAN original. En muchos casos el código fuente original ya no está disponible. Cuando llega el momento de modificar un programa como ese, ningún director pensaría siquiera en enviar a cualquiera que no fuera un programador de verdad para hacer el trabajo. Ningún Programador Estructurado Comedor De Pastelitos sabría siquiera por dónde empezar. A esto se le llama Seguridad del Puesto.

He aquí algunas herramientas de programación que los programadores de verdad no usan:

  • Preprocesadores de FORTRAN como MORTRAN o RATFOR. Son como las cocinas de la programación: ideales para hacer pastelitos. Ver arriba los comentarios sobre programación estructurada.
  • Debuggers de Código Fuente. Los Programadores de Verdad pueden leer volcados hexadecimales.
  • Compiladores con chequeo de límite en arrays. Ahogan la creatividad, destruyen la mayoría de los usos interesantes de la sentencia EQUIVALENCE, y hacen imposible modificar el sistema operativo mediante subíndices negativos. Y lo peor de todo, el chequeo de límite es ineficiente.
  • Sistemas de mantenimiento de código fuente. Un programador de verdad mantiene su código cerrado con llave en un fichero de tarjetas, porque eso implica que el dueño no puede dejar programas importantes al descubierto (5).

(3) Xerox PARC Editors...
(4) Finseth, C. Theorey and Practice of Text Editors - or A Cookbook for an EMACS, B.S. Thesis, MIT/LCS/TM-165, Massachusetts Institute of Technology, May 1980.
(5) Weinberg, G. The Psychology of Computer Programming, New York, Van Nostrand Reinhold, 1971, p. 110.

1.5 El Programador de Verdad en el trabajo

¿Dónde trabaja el típico programador de verdad? ¿Qué tipo de programas merecen los esfuerzos de un individuo con tanto talento? Puede estar seguro de que no encontrará a ningún programador de verdad escribiendo programas de contabilidad en COBOL, u ordenando listas de correo para la revista People. Un programador de verdad quiere tareas de una importancia que haga temblar la tierra (¡literalmente!).

Hay Programadores de Verdad trabajando para el Laboratorio Nacional de Los Alamos escribiendo simulaciones de bomba atómica para superordenadores CRAY-1. Hay Programadores de Verdad trabajando para la Agencia de Seguridad Nacional, decodificando transmisiones rusas.

Fue gracias sobre todo al esfuerzo de miles de Programadores de Verdad que trabajaban para la NASA que los americanos llegaron a la luna antes que los rusos. Hay Programadores de Verdad trabajando para Boeing, diseñando sistemas operativos para misiles crucero.

Algunos de los más puros Programadores de Verdad de todos trabajan en el Jet Propulsion Laboratory de California. Muchos de ellos se saben el sistema operativo completo de las naves Pioneer y Voyager de memoria. Con la ayuda de grandes programas en FORTRAN desde tierra y pequeños programas en ensamblador desde la nave espacial, son capaces de hacer increíbles hazañas de navegación y de previsión: acertar en ventanas de diez kilómetros de anchura en Saturno tras seis años en el espacio, reparar o prescindir de plataformas sensoras, radios o baterías dañadas. Se cuenta que un programador de verdad consiguió meter un programa de comparación de patrones en unos cuantos cientos de bytes de memoria no usada en una nave espacial Voyager que buscó, localizó y fotografió una nueva luna de Júpiter. Los planes actuales de la nave espacial Galileo son usar una trayectoria asistida por gravedad a través de Marte en su camino hacia Júpiter. Esta trayectoria pasa a 80 más menos 3 kilómetros de la superficie de Marte. Nadie va a confiar en un programa en Pascal (o en un programador de Pascal, para el caso) para navegar con esas tolerancias.

Como puede imaginar, muchos de los Programadores de Verdad del mundo trabajan para el Gobierno americano, sobre todo en el Departamento de Defensa. Así es como debe ser. Desde hace poco, sin embargo, se ha formado una nube negra en el horizonte de los Programadores de Verdad. Parece que algunos Comedores de Pastelitos con un puesto importante en el Departamento de Defensa decidieron que todos los programas de Defensa deberían ser escritos en un gran lenguaje unificado llamado ADA. Durante un tiempo parecía que el ADA estaba destinado a convertirse en un lenguaje que iba contra todos los preceptos de la programación de verdad: un lenguaje con estructura, con tipos de datos, mucho tecleo, y puntos y comas. En definitiva, un lenguaje diseñado para inutilizar la creatividad del típico programador de verdad. Por suerte, el lenguaje que adoptaron tenía las suficientes cualidades como para hacerlo aprovechable: es increíblemente complejo, incluye métodos para cargarse el sistema operativo y reposicionar memoria, y a Edsger Dijkstra no le gusta (6). Dijkstra, como seguramente ya sabrá, es el autor de "el Go To considarado peligroso", que marcó época en la metodología de programación y fue aplaudido por programadores en Pascal y comedores de pastelitos. Y de todas formas, un programador de verdad puede escribir programas FORTRAN en cualquier lenguaje.

Los Programadores de Verdad podrían comprometer sus principios y trabajar en algo ligeramente más trivial que la destrucción o la vida, si hay suficiente dinero implicado. Hay varios programadores de verdad escribiendo video juegos en Atari, por ejemplo (pero no jugando a ellos: un programador de verdad sabe cómo ganar en cualquier momento; eso no es un reto para ellos). Todos los de LucasFilm son programadores de verdad (sería de locos rechazar el dinero de cincuenta millones de fans de Star Trek). La proporción de programadores de verdad en gráficos por ordenador es ligeramente menor de lo normal, sobre todo porque nadie les ha encontrado un uso a los gráficos por ordenador todavía. Por otra parte, toda la programación de gráficos por ordenador está hecha en FORTRAN, así que hay cierto número de ellos dedicados a los gráficos sólo para evitar escribir programas en COBOL.

1.6 El Programador de Verdad Jugando

Generalmente, el programador de verdad juega de la misma forma que trabaja: con ordenadores. El programador de verdad está constantemente asombrado de que su jefe le pague por lo que él haría de todas formas (aunque tiene cuidado de no expresar esta opinión en voz alta). Ocasionalmente, un programador de verdad sale fuera de la oficina a tomar un respiro de aire fresco y una cerveza o dos. He aquí algunas pistas para reconocer a los programadores de verdad fuera de la sala de ordenadores:

  • En una fiesta, los programadores de verdad son los que están en la esquina hablando sobre seguridad de sistemas y cómo saltársela.
  • En un partido de fútbol, el programador de verdad es el que compara las jugadas con la simulación impresa en papel continuo de 11 por 14.
  • En la playa, el programador de verdad es el que está dibujando diagramas de flujo en la arena.
  • En un funeral, el programador de verdad es el que dice "Pobre George. Y eso que casi había conseguido hacer que su rutina de ordenación funcionara antes de su coronaria".
  • En la tienda de ultramarinos, el programador de verdad es el que insiste en pasar él mismo las latas por el lector de barras, porque nunca confiaría en que un operador de teclado perforador lo hiciera bien la primera vez.

2011-01-13

Piloto automático para naves espaciales

Algún afortunado lector quizá haya jugado con el sensacional Elite de Ian Bell y David Braben. o sus aún más sensacionales continuaciones, Elite II: The Frontier y Frontier: First Encounters. Los tres son simuladores espaciales. El primero no tiene un motor físico muy realista: en Elite, la velocidad no es relativa. Hay un sistema de referencia universal, y la nave tiene una velocidad máxima dentro de ese sistema de referencia.

En cambio, en los otros dos el motor de física es mucho más realista. La velocidad actual está indicada siempre con respecto a un sistema de referencia dado, que generalmente se corresponde con el astro o planeta más próximo, y puede cambiar cuando éste lo hace. Los motores de las naves pueden acelerar y frenar, lo que impone una aceleración máxima, como es lógico, pero no hay limitación para la velocidad. Como pega en contra de ese realismo, aunque a favor de la jugabilidad, cabe nombrar que la aceleración de la nave no depende de la masa de la misma, lo cual sí que ocurriría si los motores ejercieran una fuerza de empuje máxima (F=ma). Otros detalles, aunque de menos importancia, son la falta de efectos relativistas y la omnidireccionalidad del empuje, así como el hecho de que la aceleración a la que la nave es sometida (típicamente rondando los 20 g) no podría ser soportada por un cuerpo humano. Le concedemos esas licencias de buena gana, porque el producto resultante bien lo vale.

Como los dos títulos comparten la palabra Frontier y no hay diferencias entre ellos en la parte que aquí nos interesa, me referiré a ambos colectivamente usando dicha palabra. Frontier cuenta con un piloto automático, cuyo principio de funcionamiento exacto desconozco, para viajar de un punto a otro del espacio. Sin embargo, yo al menos soy fan de desconectar el piloto automático y volar a mano, porque disfruto haciéndolo, y porque el piloto automático utiliza el motor delantero para frenar, que siempre tiene menos potencia, mientras que yo doy la vuelta a la nave para hacerlo y así puedo alcanzar una velocidad mayor y frenar a tiempo. (Es un error típico de novatos el acelerar continuamente hasta llegar al destino... y pasarse de largo por mucho, porque la potencia de frenado es la misma que la de aceleración y por lo tanto requiere el mismo tiempo acelerar que frenar).

Cuando quiero ir de punto a punto, observo la distancia al objetivo; entonces acelero hasta la mitad del trayecto y decelero hasta llegar. Los resultados suelen ser bastante buenos; en la primera aproximación quizá no me quede lo bastante cerca, pero con una o dos aproximaciones más (cada vez más cortas) el éxito está prácticamente garantizado.

Sin embargo, las batallas suelen aparecer en medio del viaje, y cuando lo hacen, me estropean los planes de navegación, porque debido a la inercia que llevo, voy acercándome al objetivo mientras dura la batalla, lo cual, cuando se va a 12.000 km/s, resulta significativo. Esto me hizo preguntarme: ¿y cómo calcular entonces el punto de frenada, para llegar cuanto antes al objetivo? La respuesta resulta no ser muy fácil para el caso de una dimensión. Cuando se da la eventualidad de una batalla, los movimientos laterales son pequeños, lo que permite considerar el caso 1D como una buena aproximación.

El método entonces sería el siguiente. El espacio necesario para frenar dada la velocidad actual viene dado por la fórmula v²/(2a), donde a es la aceleración máxima con la que podemos frenar y v la velocidad con la que se reanuda el viaje. Por razones que me costaría explicar, el punto de frenada viene dado por (x0 - v|v|/(2a))/2, donde x0 es el punto inicial, y el punto destino se asume 0. Puede ser que ya nos hayamos pasado de dicho punto, en cuyo caso es inevitable que nos pasemos de largo y tengamos que frenar hasta pararnos.

Pero, ¿qué pasa si estoy de camino hacia un planeta y de repente cambio de opinión y quiero dirigirme a otro? En ese caso, tengo una velocidad inicial cuya alineación probablemente no coincida para nada con el destino final, por lo cual no podemos usar el truco de 1D. ¿Qué puedo hacer, si quiero llegar cuanto antes?

Anticipo que no sé la respuesta. Si para el caso 1D no era fácil, para 3D es diabólico. Esto es lo que sé. Con un cambio de sistema de referencia, siempre se puede transformar el problema en uno en dos dimensiones. Se formularía así: dados un punto inicial, p0, una velocidad inicial, v0, y una aceleración máxima, amax, determinar la función que da la aceleración a aplicar en cada instante, tal que se alcance el punto (0, 0) a velocidad nula en el menor tiempo posible.

O, alternativamente, partiendo parados desde el punto (0, 0), hallar la función de aceleración necesaria para alcanzar el punto pF a una velocidad vF (como vector), en el mínimo tiempo posible. Es lo mismo pero haciendo el camino al revés e invirtiendo la velocidad.

Es un problema frustrante porque, pese a su simple planteamiento y aspecto inocente, resulta bastante esquivo. La aproximación más inmediata, que es resolverlo en 1D para cada eje, no funciona porque al aplicar la aceleración máxima por cada eje, el módulo de la aceleración es mayor que la aceleración máxima. Podemos dividir la aceleración por √2 para compensar, pero es que no es la única pega: nada nos garantiza que el tiempo que se tarda en cada eje coincida. Así que tenemos además que encontrar una aceleración máxima por eje, que cumpla dos requisitos: que el tiempo sea el mismo en cada eje, y que la suma de los cuadrados de las aceleraciones máximas coincida con el cuadrado de la aceleración máxima dada.

¿Es óptima esa solución? Pues una de dos: o no lo es, o hay infinitas soluciones óptimas. Para demostrarlo, basta ver que si rotamos el sistema de referencia en el problema original, deberíamos obtener una versión rotada de la solución, cosa que no ocurre. Los cuatro posibles vectores de la solución forman siempre un rectángulo alineado con los ejes.

En fin, ando quebrándome la cabeza con este problema.

2010-10-08

Colección de Simon Tatham: Range

Un nuevo puzle ha sido añadido a la colección de Simon Tatham. Se llama Range y es interesante. Las reglas pueden recordar un poco al Singles en algunos aspectos, pero en realidad al jugarlo encontramos reminiscencias del Pattern más bien.

Las reglas no están muy bien explicadas en la documentación, así que voy a dar una explicación aquí. Nos presentan un casillero con varios números colocados en varias casillas. Nuestro objetivo es determinar qué casillas hay que rellenar de negro, cumpliendo las siguientes reglas:

  • Todas las casillas que no son negras tienen que formar una figura conexa, es decir, no se permite aislar una casilla blanca o un grupo conexo de casillas blancas en una «isla». Se entiende que están conectadas por arriba, abajo, izquierda o derecha; las diagonales no cuentan.
  • No puede haber dos cuadrados negros adyacentes (igualmente, por arriba, abajo, izquierda o derecha).
  • Las casillas con números no se pueden pintar de negro.
  • Cada número indica la cantidad de casillas totales, incluida ella misma, que pueden alcanzarse hasta tropezar con una casilla negra, moviéndose hacia arriba, abajo, izquierda o derecha a partir de la casilla donde está el número.

Por ejemplo, en el tablero por defecto de 9×6, si aparece un 14, eso quiere decir que no hay ninguna casilla negra en la fila ni en la columna donde aparece dicho número, pues hay 8 casillas horizontales y 5 casillas verticales además de la propia casilla, en total 14. Si aparece un 13, quiere decir que hay una casilla negra en uno de los cuatro extremos, no sabemos en principio en cuál, y todas las demás son blancas.

En la documentación pone como ejemplo el número 1. Si apareciera un 1, al contarse a sí misma ya estaría el cupo lleno, por lo tanto ese 1 debería estar rodeado de casillas negras. Pero eso formaría una región de una casilla que estaría aislada del resto de casillas blancas, quebrantando otra de las reglas. Por lo tanto, no puede aparecer un 1 en ningún tablero.

Como ayuda para resolver los problemas, podemos marcar casillas con un punto que indica «esta casilla no es negra». Así, por ejemplo, en cuanto colocamos una casilla negra podemos rodearla de puntos para recordarnos que ahí no puden ir otras casillas negras, de acuerdo con las reglas.

Como de costumbre, la solución de cada problema es única. El grado de adicción lo compararía con el del Pattern también. Podría decirse que Range (Kurodoko) es a Pattern (Nonograms, Picross) como Unequal (Futoshiki) es a Solo (Sudoku).

2010-08-14

Enhorabuena, acaban ustedes de sobrevivir a otro fin del mundo.

2010-08-12

Batallitas

Batallitas - Cómic

2010-08-11

Las psicofonías son el arte de decirte lo que has de oír. Y es que, cuando te dicen lo que has de oír, lo oyes esté o no ahí. Un ejemplo:

(La canción está en Hindi, su título original es Mehboob Mere y pertenece a la película Fiza; la letra real en Hindi —o mejor dicho, una transcripción a nuestro alfabeto— está por ejemplo aquí: http://www.hindilyrix.com/songs/get_song_Mehboob%20mere,%20mehboob%20mere.html).

2010-03-12

Frases para el recuerdo

En los tiempos de los apostóles
los hombres eran muy barbáros:
se subían a los arbóles
y se comían los pajáros.

(Tildes añadidas para enfatizar la pronunciación).

2010-02-24

Solución al problema de la cebra

Vamos con la solución al puzle de la cebra.

Recordemos las pistas:

  1. 1=B5
  2. 3=E3
  3. A1=D2
  4. A2=B1
  5. A5=E1
  6. B2=E4
  7. B3=D1
  8. B4=C5
  9. C4=D3
  10. D4=E5
  11. A4|B5
  12. C1|D5
  13. C3|D2
  14. A3|A5
  15. A3<A5

Ponemos en un casillero los símbolos, de tal forma que en cada casilla estén todos los símbolos de una fila. Para esto se puede emplear OOCalc, que es lo que he hecho.

12345
AA1A2A3A4A5A1A2A3A4A5A1A2A3A4A5A1A2A3A4A5A1A2A3A4A5
BB1B2B3B4B5B1B2B3B4B5B1B2B3B4B5B1B2B3B4B5B1B2B3B4B5
CC1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5
DD1D2D3D4D5D1D2D3D4D5D1D2D3D4D5D1D2D3D4D5D1D2D3D4D5
EE1E2E3E4E5E1E2E3E4E5E1E2E3E4E5E1E2E3E4E5E1E2E3E4E5

Aplicamos las pistas 1, 2 y 11 para hallar la posición de B5, E3 y A4.

12345
AA1A2A3A4A5A4A1A2A3A4A5A1A2A3A4A5A1A2A3A4A5
BB5B1B2B3B4B5B1B2B3B4B5B1B2B3B4B5B1B2B3B4B5
CC1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5
DD1D2D3D4D5D1D2D3D4D5D1D2D3D4D5D1D2D3D4D5D1D2D3D4D5
EE1E2E3E4E5E1E2E3E4E5E3E1E2E3E4E5E1E2E3E4E5

Cada vez que consigamos averiguar el símbolo de una casilla, lo tachamos (borramos) de todas las demás casillas de esa fila:

12345
AA1A2A3A5A4A1A2A3A5A1A2A3A5A1A2A3A5
BB5B1B2B3B4B1B2B3B4B1B2B3B4B1B2B3B4
CC1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5
DD1D2D3D4D5D1D2D3D4D5D1D2D3D4D5D1D2D3D4D5D1D2D3D4D5
EE1E2E4E5E1E2E4E5E3E1E2E4E5E1E2E4E5

Ahora vamos recorriendo las pistas repetidamente. Para cada igualdad, hemos de comprobar si en las columnas donde aparece cada uno de los dos miembros también está el otro; si no es así, debemos tachar el extra. Por ejemplo, aplicando la pista 3 (A1=D2), puesto que en la 2ª columna no hay A1, hemos de quitar D2 de la misma:

12345
AA1A2A3A5A4A1A2A3A5A1A2A3A5A1A2A3A5
BB5B1B2B3B4B1B2B3B4B1B2B3B4B1B2B3B4
CC1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5
DD1D2D3D4D5D1D3D4D5D1D2D3D4D5D1D2D3D4D5D1D2D3D4D5
EE1E2E4E5E1E2E4E5E3E1E2E4E5E1E2E4E5

Repetimos con las pistas 4, 5, 6, 7, 8 y 10:

12345
AA1A3A5A4A1A2A3A1A2A3A5A1A2A3A5
BB5B2B3B4B1B3B4B1B2B3B4B1B2B3B4
CC1C2C3C4C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5
DD2D3D4D5D1D3D4D5D1D2D3D5D1D2D3D4D5D1D2D3D4D5
EE1E2E5E2E4E5E3E1E2E4E5E1E2E4E5

Al examinar la pista 13, observamos que en la columna 2 no hay D2, por lo tanto en la columna 1 no puede haber C3. Al aplicar la pista 14, podemos tachar A3 y A5 de la columna 1. Como se queda solo A1 en la primera fila, lo tachamos de las demás celdas de esa fila (a partir de ahora lo haremos sin avisar). De acuerdo con la pista 15, A3 no puede estar a la derecha del todo, así que lo tachamos también. Después de todos esos cambios, queda esto:

12345
AA1A4A2A3A2A3A5A2A5
BB5B2B3B4B1B3B4B1B2B3B4B1B2B3B4
CC1C2C4C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5
DD2D3D4D5D1D3D4D5D1D2D3D5D1D2D3D4D5D1D2D3D4D5
EE1E2E5E2E4E5E3E1E2E4E5E1E2E4E5

Cuando al comprobar una de las igualdades, uno de los miembros está solo, el otro debe estarlo también. Aplicando ese principio a la pista 3 en este punto, hay que dejar solo D2 en la columna 1:

12345
AA1A4A2A3A2A3A5A2A5
BB5B2B3B4B1B3B4B1B2B3B4B1B2B3B4
CC1C2C4C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5
DD2D1D3D4D5D1D3D5D1D3D4D5D1D3D4D5
EE1E2E5E2E4E5E3E1E2E4E5E1E2E4E5

Aplicamos las pistas 5 y 10, quitando E1 y E5, respectivamente, de la columna 1. Ya sabemos quién bebe E2=agua:

12345
AA1A4A2A3A2A3A5A2A5
BB5B2B3B4B1B3B4B1B2B3B4B1B2B3B4
CC1C2C4C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5C1C2C3C4C5
DD2D1D3D4D5D1D3D5D1D3D4D5D1D3D4D5
EE2E4E5E3E1E4E5E1E4E5

Es B5, el noruego. Aplicamos las pistas 13, 8, 9 y ya no podemos seguir por este método:

12345
AA1A4A2A3A2A3A5A2A5
BB5B2B3B1B3B4B1B2B3B4B1B2B3B4
CC1C2C3C1C2C4C5C1C2C4C5C1C2C4C5
DD2D1D4D5D1D3D5D1D3D4D5D1D3D4D5
EE2E4E5E3E1E4E5E1E4E5

Vamos a hacer un ensayo para falsar una hipótesis. Supongamos que en la columna 2 va E5 y no E4. Entonces, por la pista 10, tiene que ir D4 ahí. Por la pista 7, no puede ir B3 en esa columna, luego tiene que ser B2; pero ahora esto se contradice con la pista 6, que dice que donde va B2 tiene que ir E4. La conclusión es que en la columna 2 no puede ir E5. Lo tachamos y continuamos, aplicando las pistas 6, 10 y 7:

12345
AA1A4A2A3A2A3A5A2A5
BB5B2B1B3B4B1B3B4B1B3B4
CC1C2C3C1C2C4C5C1C2C4C5C1C2C4C5
DD2D5D1D3D1D3D4D1D3D4
EE2E4E3E1E5E1E5

Nuevo punto muerto. Este es más complicado. Vamos a ensayar primero poniendo E1 en la columna 4 y viendo si nos conduce a una contradicción. Aplicamos las pistas 5, 10, 9, 15, 4, 8 y llegamos a este resultado provisional:

12345
AA1A4A3A5A2
BB5B2B3B4B3B4B1
CC1C2C3C1C2C4C5C1C2C4C5C1C2
DD2D5D1D3D1D3D4
EE2E4E3E1E5

Ahora, si ponemos B3 en la columna 3, por la pista 7 tiene que ir D1 en la misma columna, luego en la columna 4 tiene que ir D3, y por la pista 9 va C4 en la misma. Pero esto se contradice con la pista 8, ya que en la columna 4 sólo puede ir B4. Y si ponemos B3 en la columna 4 en vez de la 3, tenemos exactamente el mismo problema. Pongamos donde pongamos B3, llegamos a una contradicción. La única conclusión posible es que E1 no puede ir en la columna 4.

Antes de seguir, una nota. En este punto se puede recurrir a una técnica del Sudoku que consiste en lo siguiente. Las columnas 1 y 5 tienen ambas C1 y C2, aunque no sabemos en qué orden. Esto quiere decir que o la 1 tiene C1 y la 5 C2, o viceversa, no hay otra posibilidad. En cualquiera de los dos casos, podemos tachar C1 y C2 de las columnas 3 y 4. Después de hacerlo, podemos recurrir a la pista 12 para asignar C1 a la columna 1, con lo que en la columna 5 iría C2. Esta es la solución parcial errónea a la que aludía al plantear el problema: C2 está en la columna correcta, como veremos, pero B1 no es la respuesta.

Volvemos al punto muerto anterior, ponemos E5 en la columna 4 y continuamos. Aplicamos las pistas 10, 5, 14, 4, 7, 9, 8, 12 y obtenemos la solución:

12345
AA1A4A2A3A5
BB5B2B1B4B3
CC1C3C4C5C2
DD2D5D3D4D1
EE2E4E3E5E1

O sea, el dueño de C2 (la cebra) es B3 (el japonés).

2010-02-19

¿Quién es el dueño de la cebra?

Cuando era niño, vi en una revista un pasatiempo que me resultó muy curioso. Lo copié y lo repartí a mis compañeros y hubo cierto revuelo con el mismo. Se ha divulgado en otras formas, pero aún permanecen en mi memoria las frases del planteamiento y la solución tal y como figuraban en la revista.

Decía así (disculpas por la propaganda de tabacos, que sospecho que estaba detrás de esa publicación, pero he preferido dejar el texto original tal y como lo conocí):

  1. Hay cinco casas de distinto color con individuos de diferentes nacionalidades. También hay distintos animales, cigarrillos y bebidas en cada una de ellas.
  2. El inglés vive en la casa roja.
  3. El español es el propietario del perro.
  4. En la casa verde se bebe café.
  5. El ucraniano bebe té.
  6. La casa verde está contigua y a la derecha (la derecha del lector) de la casa de marfil.
  7. El fumador de Winston tiene caracoles.
  8. En la casa amarilla se fuma Camel.
  9. En la casa del centro se bebe leche.
  10. El noruego vive en la primera casa de la izquierda.
  11. El hombre que fuma Chesterfield vive en la casa contigua a la del dueño del zorro.
  12. En la casa contigua a aquella donde se encuentra el caballo se fuma Camel.
  13. El fumador de Lucky Strike bebe naranjada.
  14. El japonés fuma Philip Morris.
  15. El noruego vive al lado de la casa azul.

Las preguntas eran: ¿quién bebe agua? y ¿quién es el dueño de la cebra?

La respuesta a la primera pregunta es relativamente fácil, pues surge al poco tiempo de ir aplicando pistas. La segunda requiere llegar hasta el final, lo cual requiere bastante más esfuerzo.

Se puede abstraer este problema de la siguiente manera: sea un casillero de 5 filas y 5 columnas, en el que se deben colocar los símbolos A1, A2, A3, A4, A5, B1 a B5, C1 a C5, D1 a D5 y E1 a E5, cada uno en una casilla. Las letras indican la fila en la que colocarlos, pero los dígitos NO indican la columna; en este caso he escogido una permutación al azar de los números del 1 al 5 para cada fila. Para saber en qué columna colocar cada uno, necesitaremos las pistas. Usaremos la siguiente notación:

  • n=símbolo indica que en la columna n ha de ir el símbolo dado. Por ejemplo, 1=A4 indica que el símbolo A4 se debe colocar en la fila A, columna 1.
  • símbolo1=símbolo2 indica que ambos están en la misma columna.
  • símbolo1|símbolo2 indica que están en columnas adyacentes.
  • símbolo1<símbolo2 indica que símbolo1 está a la izquierda de símbolo2 (no necesariamente adyacentes).

Las pistas equivalentes para este problema (no en el orden original) son:

  1. 1=B5
  2. 3=E3
  3. A1=D2
  4. A2=B1
  5. A5=E1
  6. B2=E4
  7. B3=D1
  8. B4=C5
  9. C4=D3
  10. D4=E5
  11. A4|B5
  12. C1|D5
  13. C3|D2
  14. A3|A5
  15. A3<A5

Y las preguntas son: ¿qué simbolo hay en la fila B en la misma columna donde está E2? ¿Qué símbolo hay en la fila B en la misma columna donde está C2? Es decir, hallar x e y tales que Bx=E2 y By=C2.

Al principio iba a preguntar en qué columna van E2 y C2, pero después me lo he pensado, dado que hay una solución parcial errónea que tiene C2 en la columna correcta, pero no tiene el símbolo bueno en la fila B de dicha columna. Aquí se busca la solución correcta.

Nótese que las dos últimas pistas juntas equivalen a la Nº. 6 del problema original, pero he querido hacerlo más general por si revisitamos este tipo de acertijos en el futuro.

La equivalencia con el problema anterior es: A1=Amarilla, A2=Roja, A3=Marfil, A4=Azul, A5=Verde; B1=Inglés, B2=Ucraniano, B3=Japonés, B4=Español, B5=Noruego; C1=Zorro, C2=Cebra, C3=Caballo, C4=Caracoles, C5=Perro; D1=Philip Morris, D2=Camel, D3=Winston, D4=Lucky Strike, D5=Chesterfield; E1=Café, E2=Agua, E3=Leche, E4=Té, E5=Naranjada.

2010-02-17

SignPost es otro nuevo juego en la colección de puzles de Simon Tatham. Partiendo de la casilla 1, hay que avanzar un número indeterminado de casillas en cada paso en la dirección de la flecha, hasta acabar en la que tiene una estrella tras haber recorrido el resto del tablero visitando cada casilla una sola vez. A veces se nos indica en qué paso hay que tocar cierta casilla. Durante la resolución, lo normal es que vayamos conectando partes separadas hasta que tengamos todo conectado.

Como de costumbre, genera problemas con solución única.

No me ha enganchado, pero me ha entretenido, que también es importante.