logo El diario de Pepe Molina (Caricatos)

yo

Empezamos con un sencillo ejemplo cuya miniatura hemos adjuntado a este párrafo de muy fácil resolución, y hemos terminado con una extensa lista de diferentes dificultades; pero hubiéramos podido obtener una lista mucho más amplia basándonos en ese primer ejemplo y simples modificaciones que iremos explicando.


Última caricatura

IV Asamblea de la AEC: IV Asamblea General de la Asociación Española de Caricaturistas

IV Asamblea de la AEC

RSS de las imágenes: rss


La Cita

He ofendido a Dios y a la humanidad porque mi trabajo no tuvo la calidad que debía haber tenido

Leonardo Da Vinci, pintor, escultor e inventor italiano (1452-1519).


En esta zona están las páginas personales del autor.


Mis clientes ahora también son mis amigos (aunque les cobre).


En Mis amigos Informáticos hay una pequeña colección de páginas de colegas webmasters..


En Mis amigos artistas podemos encontrar artistas de cualquier índole (dibujantes, pintores, escritores...)


Las recomendaciones que proponemos son de índole variada.


Aquí un cajón de sastre de enlaces.


Nos referencian desde sitios de toda índole.


Puede contribuir a mantener esta página con su donativo.


botón pay-pal

1001 sudokus

emoticón de Caricatos Publicado el día 28 de mayo de 2013
id=121; categorías: Vicisitudes de un Webmaster, Mentes pensantes, Globalización, Programación

sudoku alternativo Empezamos con un sencillo ejemplo cuya miniatura hemos adjuntado a este párrafo de muy fácil resolución, y hemos terminado con una extensa lista de diferentes dificultades; pero hubiéramos podido obtener una lista mucho más amplia basándonos en ese primer ejemplo y simples modificaciones que iremos explicando.

La lista de sudokus que acabamos de citar puede encontrarse en el siguiente enlace: sudokus.txt, donde encontraremos una definición de un array del lenguaje php que podemos incrustar en cualquier fichero php con una sencilla instrucción include:

include("sudokus.txt");

Pero para poder usarlo en nuestras páginas lo hemos incluído en un fichero php que convierte ese arreglo php en un fichero xml válido mediante el siguiente código:

<?php
include("sudokus.txt");
header("Content-type: text/xml");
echo <<< xml
<?xml version="1.0" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="sudokus.xsl" ?>

<sudokus>

xml;
while (count($sudokus) > 0)	{
	$s = array_shift($sudokus);
	$n = $s["sudoku"];
	echo "<sudoku>$n</sudoku>n";
}
echo "</sudokus>";
?>

Ese listado es el que usaremos en los distintos apuntes que dedicamos a este juego, pero seguiremos con nuestro asunto principal.

Invertir el sudoku

Hemos visto que podemos referir o definir a un sudoku con una lista de 81 números, donde el 0 se corresponde con la casilla vacía, y con cualquier lenguaje de programación es muy sencillo invertir esa lista... usaremos por ejemplo javascript, que no tiene definida esa función para cadenas de texto (String), pero sí para arrays (reverse()). El código podría ser asi:

String.prototype.inverso = function()	{
	return this.split("").reverse().join("");
}
sudoku = "014500032369001004000000010007604090690087020020300000100800070000000008802400603";
ukodus = sudoku.inverso();
// ukodus = "306004208800000000070008001000003020020780096090406700010000000400100963230005410"

Ya hemos visto como con pocas líneas de código de un sudoku obtenemos otro. Per aún hay mucho más.

Otras sencillas modificaciones

Cuando queremos tratar filas y columnas, tenemos que convertir nuestra lista de números en una tabla. Hasta ahora hemos usado el siguiente código con el que convertíamos nuestra lista grande en un lista de pequeñas listas:

s = [];
for (i = 0; i < 9; i++)
	s[i] = cadena.substr(i * 9, 9);

Vamos a plantear otra forma de obtener el mismo resultado:

s = ["", "", "", "", "", "", "", "", ""];
for (i = 0; i < 81; i++)
	s[parseInt(i / 9)] += cadena.charAt(i);

También tres líneas de código, tal vez un poco más complejas pero con el mismo resultado final. Si nos fijamos en la última línea encontramos que el índice del bucle lo dividimos para obtener el valor de la línea del sudoku, pero qué pasaría si en vez de obtener el resultado de la división entera, nos quedamos con el resto (su módulo)...

s = ["", "", "", "", "", "", "", "", ""];
for (i = 0; i < 81; i++)
	s[i % 9] += cadena.charAt(i);

... el resultado que obtenemos, en términos matemáticos es la matriz traspuesta.

Si a cada una de esas listas menores se aplica el método "inverso()" que hemos definido al principio del apunte, obtendremos el efecto reflejo horizontal. Si a la matriz traspuesta le aplicamos el reflejo horizontal, el efecto resultante es el de rotación de 90º. Por cierto, la inversión de de los 81 números sería una rotación de 180º.

Intercambio de filas y columnas

Si intercambiamos las dos primeras filas de cualquier sudoku válido, sigue siendo un sudoku válido. Igualmente seguirá siendo válido con la misma operación entre la segunda y tercera, o cualquier combinación agrupando las filas de tres en tres (no valdría por ejemplo con la tercera y cuarta. También sería válido si intercambiásemos cualquiera de los grupos de tres filas; por ejemplo, intercambiar las tres primeras por las tres últimas.

Todo lo que se puede aplicar en las filas, se puede aplicar con las columnas...

Breve recuento

En principio con los efectos de reflejo horizontal y rotación de 90º hacia la derecha; si hacemos esa rotación tres veces se convierte en rotación hacia la izquierda. También podemos obtener el reflejo vertical en tres pasos: rotar a la derecha, realizar el reflejo horizontal y rotar a la izquierda (Una simplificación con respecto a código podría ser rotando solo una vez y luego invertir la lista).

Con las rotaciones y reflejos obtenemos ocho (8) variantes del sudoku original, pero tan sólo intercambiando dos filas cualesquiera válidas para intercambiar (recordemos lo comentado sobre las agrupaciones de filas y columnas), duplicamos la cifra resultante, o sea solo manipulando las tres primeras filas ya tenemos cuarenta y ocho (48) variantes. Nos quedan muchas combinaciones más que justifican el título de este apunte.

Viendo los resultados

Vamos a intentar usar algunos controles para probar lo expuesto.

:
Controles Básicos: | Rotaciones: | Reflejos:
Intercambios de columnas:
| |
Intercambios de filas:
| |
Intercambios de columnas agrupadas:
Intercambios de filas agrupadas:
|

Hemos añadido un botón para comprobar que aunque realicemos infinitas modificaciones al sudoku inicial, el resultado será otro sudoku válido.

Zona de comentarios

Este apunte aún no tiene comentarios.

Evaluación

Valoración de esta página: (apunte.121) valor

Valoración evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar

Respuesta: Zona de mensajes (proceso de evaluación)

Historial de navegación

Esta página ha sido visitada en 8611 ocasiones


Disponemos de rss sindicar

Y del Mapa del sitio, además del sitemap.xml.


Aquí podemos encontrar los apuntes más visitados.

"Top 10" reemplaza a la sección Últimos apuntes.


Una buena forma de buscar un apunte es a partir de su categoría.


También es posible buscar apuntes por medio de las etiquetas (tags).


Hemos decidido poner al alcance de todos algunos comodines.

Adjuntamos una versión reducida del "buscador interno" que vemos en la lista anterior:

Buscar en apuntes

También estamos recopilando antiguas páginas del sitio.


Desde este recuadro se puede hacer una búsqueda cronológica.


Se puede crear una postal nueva desde el enlace del sector "Otras páginas del dominio", o editar la que sale en el recuadro, pulsando sobre ella..

http://www.pepemolina.com/postales/Fondos/santa.gif
http://www.pepemolina.com/postales/animales/gato8t.gif
Feliz Navidad
Feliz Navidad
enlace a la postal
Copyright © 2002-2024 www.pepemolina.com
RSS rss | Ver Mapa del sitio