Quebra-cabeça de exercício em Python

Para o exercício de quebra-cabeça de registro, você vai usar código Python para resolver dois quebra-cabeças. Este exercício usa o módulo urllib, conforme mostrado na seção Utilitários do Python. Os arquivos deste exercício estão localizados no "logpuzzle" dentro de google-python-exercises. Faça o download de google-python-exercises.zip, caso ainda não tenha feito isso. Consulte Configurar para ver mais detalhes. Adicione seu código a "logpuzzle.py" .

A imagem de um animal foi dividida em várias imagens com listras verticais estreitas. As imagens listradas estão na Internet em algum lugar, cada uma com um URL próprio. Os URLs ficam ocultos em um arquivo de registros do servidor da Web. Sua missão é encontrar os URLs e fazer o download de todas as listras para recriar a imagem original.

Os URLs das fatias ficam ocultos nos arquivos de registro do Apache. O servidor da Web apache de código aberto é o servidor mais usado na Internet. Cada arquivo de registro vem de algum servidor, e os URLs parciais desejados estão ocultos nos registros. O arquivo de registro codifica de qual servidor ele vem assim: o arquivo de registro animal_code.google.com é do servidor code.google.com (formalmente, diremos que o nome do servidor é o que vem depois da primeira barra inferior). O arquivo de registro animal_code.google.com contém os dados de "animal" de um quebra-cabeça. Embora os dados nos arquivos de registro tenham a sintaxe de um servidor da Web Apache real, os dados além do que é necessário para o quebra-cabeça são dados aleatórios de um arquivo de registro real.

Esta é a aparência de uma única linha do arquivo de registros (essa é a aparência dos arquivos de registro 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"

Os primeiros números são o endereço do navegador solicitante. A parte mais interessante é o "GET path HTTP" que mostra o caminho de uma solicitação da Web recebida pelo servidor. O caminho em si nunca contém espaços e é separado de GET e HTTP por espaços (a sugestão de regex: \S (S maiúsculo) corresponde a qualquer caractere sem espaço). Encontre as linhas no registro em que a string "quebra-cabeça" aparece dentro do caminho, ignorando as várias outras linhas do registro.

Parte A: arquivo de registros nos URLs

Conclua a função read_urls(filename) que extrai os URLs do quebra-cabeça de um arquivo de registro. Encontre todos os quebra-cabeças URLs de caminho no arquivo de registro. Combine o caminho de cada URL com o nome do servidor do nome do arquivo para formar um URL completo. Por exemplo, "http://www.example.com/path/puzzle/from/inside/file". Filtre os URLs que aparecem mais de uma vez. A função read_urls() deve retornar a lista de URLs completos, classificados em ordem alfabética e sem duplicatas. A colocação dos URLs em ordem alfabética resulta nas fatias da imagem na ordem correta da esquerda para a direita para recriar a imagem original do animal. No caso mais simples, main() deve mostrar apenas os URLs, um por linha.

$ ./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 - Quebra-cabeça de imagens de download

Complete a função download_images() que aceita uma lista classificada de URLs e um diretório. Faça o download da imagem de cada URL para o diretório fornecido, criando o diretório primeiro, se necessário (consulte o módulo "os" para criar um diretório e "urllib.urlretrieve()" para fazer o download de um URL). Nomeie os arquivos de imagem locais com um esquema simples como "img0", "img1", "img2" e assim por diante. Talvez você queira imprimir um pequeno texto de "Recuperando..." a linha de saída de status durante o download de cada imagem, já que pode ser lento e é bom ter alguma indicação de que o programa está funcionando. Cada imagem é uma pequena fração vertical da original. Como juntar as fatias para recriar a original? Isso pode ser resolvido bem com um pouco de html (não é necessário conhecimento de HTML).

A função download_images() também deve criar um arquivo index.html no diretório com uma tag *img* para mostrar cada arquivo de imagem local. As tags img devem estar todas juntas em uma linha sem separação. Dessa forma, o navegador exibirá todas as fatias juntas sem problemas. Não é necessário ter conhecimento de HTML para fazer isso. basta criar um arquivo index.html parecido com este:

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

Confira como ele vai ficar quando você fizer o download do quebra-cabeça com animais:

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

Quando tudo estiver funcionando, abrir o index.html em um navegador revelará a imagem original do animal. Qual é o animal na imagem?

Parte C: decompilação da fração de imagem

O segundo quebra-cabeça envolve a imagem de um lugar muito famoso, mas depende de uma classificação personalizada. Para o primeiro quebra-cabeça, os URLs podem ser classificados em ordem alfabética para organizar as imagens corretamente. Na classificação, o URL inteiro é usado. No entanto, digamos que o URL termine no padrão "-wordchars-wordchars.jpg", por exemplo, "http://example.com/foo/puzzle/bar-abab-baaa.jpg", o URL precisa ser representado pela segunda palavra da classificação (por exemplo, "baaa"). Assim, a classificação de uma lista de URLs que termina com o padrão word-word.jpg deve ordenar os URLs pela segunda palavra.

Estenda seu código para ordenar esses URLs corretamente e, em seguida, você poderá decodificar o segundo quebra-cabeça place_code.google.com, que mostra um lugar famoso. Em que lugar ela aparece?

Atribuição CC: as imagens usadas nesse quebra-cabeça foram disponibilizadas pelos proprietários sob a licença Atribuição 2.5 da Creative Commons, que incentiva gentilmente o remix do conteúdo como este. A imagem do animal é do usuário zappowbang no flickr e a imagem do lugar é do booleansplit do usuário no flickr.