Ejercicio de Python de acertijo de registros

Para el ejercicio de Log Puzzle, usarás código de Python para resolver dos rompecabezas. En este ejercicio, se usa el módulo urllib, como se muestra en la sección Python Utilities. Los archivos para este ejercicio están en el directorio "logpuzzle" dentro de google-python-exercises (descarga google-python-exercises.zip si aún no lo hiciste; consulta Configuración para obtener más detalles). Agrega tu código al archivo "logpuzzle.py".

Una imagen de un animal se dividió en muchas imágenes de franjas verticales estrechas. Las imágenes de franjas están en Internet, cada una con su propia URL. Las URLs están ocultas en un archivo de registro del servidor web. Tu misión es encontrar las URLs y descargar todas las franjas de imágenes para recrear la imagen original.

Las URLs de Slice están ocultas dentro de los archivos de registro de Apache (el servidor web apache de código abierto es el más usado en Internet). Cada archivo de registro es de algún servidor, y las URL de Slice deseadas están ocultas en los registros. El archivo de registro codifica de qué servidor proviene: el archivo de registro animal_code.google.com es del servidor code.google.com (formalmente, se dirá que el nombre del servidor es el que sigue a la primera barra subyacente). El archivo de registro animal_code.google.com contiene los datos de la imagen del rompecabezas del "animal". Aunque los datos de los archivos de registro tienen la sintaxis de un servidor web de Apache real, los datos más allá de los necesarios para el rompecabezas son datos aleatorios de un archivo de registro real.

Así se ve una sola línea del archivo de registro (en realidad, así se ven los archivos de registro de Apache):

10.254.254.28 - - [06/Aug/2007:00:14:08 -0700] "GET /foo/talks/ HTTP/1.1"
200 5910 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"

Los primeros números corresponden a la dirección del navegador que realiza la solicitud. Lo más interesante es el HTTP "ruta de acceso GET" que muestra la ruta de una solicitud web que recibió el servidor. La ruta de acceso nunca contiene espacios y está separada de GET y HTTP por espacios (la sugerencia de regex: \S (S en mayúsculas) coincide con cualquier carácter sin espacio. Busca las líneas del registro donde aparece la cadena "puzzle" dentro de la ruta, ignorando las demás líneas en el registro.

Parte A: Archivo de registro de las URLs

Completa la función read_urls(nombredelarchivo) que extrae las URL del rompecabezas dentro de un archivo de registro. Busca todas las URLs de ruta de acceso "puzzle" en el archivo de registro. Combina la ruta de cada URL con el nombre del servidor del nombre de archivo para formar una URL completa, p.ej., "http://www.example.com/path/puzzle/from/inside/file". Filtra las URLs que aparecen más de una vez. La función read_urls() debería devolver la lista de URL completas, ordenadas alfabéticamente y sin duplicados. Si se toman las URLs en orden alfabético, las rebanadas de la imagen estarán en el orden correcto de izquierda a derecha para volver a crear la imagen del animal original. En el caso más simple, main() solo debe imprimir las url, una por línea.

$ ./logpuzzle.py animal_code.google.com
http://code.google.com/something/puzzle-animal-baaa.jpg
http://code.google.com/something/puzzle-animal-baab.jpg
...

Parte B: Rompecabezas de descarga de imágenes

Completa la función download_images() que toma una lista ordenada de URLs y un directorio. Descarga la imagen de cada URL en el directorio determinado y crea primero el directorio si es necesario (consulta el módulo "os" para crear un directorio y "urllib.urlretrieve()" para descargar una URL). Nombra los archivos de imagen locales con un esquema simple, como “img0”, “img1”, “img2”, etcétera. Tal vez quieras imprimir una pequeña línea de resultado con el estado "Recuperando..." mientras descargas cada imagen, ya que puede ser lento y es bueno tener alguna indicación de que el programa está funcionando. Cada imagen es un pequeño corte vertical de la original. ¿Cómo unir las porciones para recrear el original? Se puede resolver muy bien con un poco de HTML (no es necesario tener conocimientos de HTML).

La función download_images() también debe crear un archivo index.html en el directorio con una etiqueta *img* para mostrar cada archivo de imagen local. Las etiquetas img deben estar juntas en una sola línea, sin separación. De esta manera, el navegador muestra todas las porciones juntas sin problemas. Para hacer esto, no necesitas tener conocimientos de HTML. Para ello, crea un archivo index.html similar al siguiente:

<html>
<body>
<img src="img0"><img src="img1"><img src="img2">...
</body>
</html>

A continuación, se muestra cómo debería verse cuando puedas descargar el acertijo del animal:

$ ./logpuzzle.py --todir animaldir animal_code.google.com
$ ls animaldir
img0  img1  img2  img3  img4  img5  img6  img7  img8  img9  index.html

Cuando todo funcione correctamente, al abrir el archivo index.html en un navegador, deberías ver la imagen original del animal. ¿Qué es el animal que aparece en la imagen?

Parte C: Descifración de porciones de imágenes

El segundo acertijo involucra la imagen de un lugar muy famoso, pero depende de una ordenación personalizada. Para el primer acertijo, las url se pueden ordenar alfabéticamente para ordenar las imágenes correctamente. En la ordenación, se usa toda la URL. Sin embargo, se dice que si la URL termina en el patrón "-wordchars-wordchars.jpg", p.ej., "http://example.com/foo/puzzle/bar-abab-baaa.jpg", debe representarse con la segunda palabra de la ordenación (p.ej., "baaa"). Por lo tanto, si ordenas una lista de URL que termina con el patrón word-word.jpg, debes ordenarlas por segunda palabra.

Extiende tu código para pedir esas URL correctamente y luego deberías poder decodificar el segundo acertijo de place_code.google.com que muestra un lugar famoso. ¿En qué lugar se muestra?

Atribución CC: Las imágenes que se usan en este rompecabezas fueron proporcionadas por sus propietarios bajo la licencia Creative Commons Attribution 2.5, que fomenta generosamente los remixes de contenido como este. La imagen del animal es del usuario zappowbang en Flickr y la imagen del sitio es del usuario booleansplit en flickr.