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 deles. Este exercício usa o módulo urllib, como mostrado na seção Utilitários do Python. Os arquivos deste exercício estão no diretório "logpuzzle", em google-python-exercises. Faça o download de google-python-exercises.zip se ainda não tiver feito isso. Consulte Configuração para mais detalhes. Adicione seu código ao arquivo "logpuzzle.py".

A imagem de um animal foi dividida em várias imagens estreitas de listras verticais. 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 registro do servidor da Web. Sua missão é encontrar os URLs e fazer o download de todas as listras de imagem para recriar a imagem original.

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

Esta é a aparência de uma única linha do arquivo de registros (os arquivos de registro do Apache realmente são parecidos):

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 HTTP "GET path", 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 (sugestão de regex: \S (com S maiúsculo) corresponde a qualquer caractere que não seja um espaço). Encontre as linhas no registro em que a string "puzzle" aparece dentro do caminho, ignorando as outras linhas.

Parte A: arquivo de registro para URLs

Complete a função read_urls(filename) que extrai os URLs do quebra-cabeça de um arquivo de registro. Encontre todos os URLs do caminho do "quebra-cabeça" 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/caminho/puzzle/de/dentro/arquivo" Eliminar 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. Com os URLs em ordem alfabética, as fatias de imagens estarão na ordem correta da esquerda para a direita para recriar a imagem original do animal. No caso mais simples, main() deve apenas gerar 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: fazer o download do quebra-cabeça com imagens

Complete a função download_images() que pega uma lista ordenada de URLs e um diretório. Faça o download da imagem de cada URL no diretório especificado, 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 uma pequena linha de saída do status "Recuperando..." durante o download de cada imagem, já que isso pode ser lento e é bom ter alguma indicação de que o programa está funcionando. Cada imagem é uma pequena fatia vertical da original. Como juntar as fatias para recriar o original? Isso pode ser resolvido bem com um pouco de html (não é necessário ter 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 em uma linha juntas sem separação. Dessa forma, o navegador exibe todas as fatias juntas perfeitamente. Não é preciso ter conhecimento de HTML para fazer isso. Basta criar um arquivo index.html com a seguinte aparência:

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

Confira como ele vai ficar quando você puder fazer 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, abra o index.html em um navegador para ver a imagem original do animal. Qual é o animal na imagem?

Parte C: decodificação de frações de imagem

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

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

Atribuição de CC: as imagens usadas nesse quebra-cabeça foram disponibilizadas pelos proprietários sob a licença Creative Commons Attribution 2.5, que incentiva generosamente a remixagem 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.