Latihan Python Teka-Teki Catatan

Untuk latihan Log Puzzle, Anda akan menggunakan kode Python untuk menyelesaikan dua teka-teki. Latihan ini menggunakan modul urllib, seperti yang ditunjukkan di bagian Utilitas Python. File untuk latihan ini ada di direktori "logpuzzle" di dalam google-python-exercises (download google-python-exercises.zip jika Anda belum melakukannya, lihat bagian Menyiapkan untuk mengetahui detailnya). Tambahkan kode Anda ke file "logpuzzle.py".

Gambar hewan telah dipecah menjadi banyak gambar garis vertikal sempit. Gambar setrip tersebut ada di internet di suatu tempat, masing-masing dengan URL-nya sendiri. URL disembunyikan dalam file log server web. Misi Anda adalah menemukan URL dan mendownload semua setrip gambar untuk membuat ulang gambar aslinya.

URL slice disembunyikan di dalam file log Apache (server web apache open source adalah server yang paling banyak digunakan di internet). Setiap file log berasal dari beberapa server, dan URL slice yang diinginkan disembunyikan dalam log. File log mengkodekan server asalnya seperti ini: file log animal_code.google.com berasal dari server code.google.com (secara formal, kami akan mengatakan bahwa nama server adalah apa pun yang mengikuti bilah bawah pertama). File log animal_code.google.com berisi data untuk gambar teka-teki "animal". Meskipun data dalam file log memiliki sintaksis server web Apache nyata, data selain yang diperlukan untuk teka-teki adalah data acak dari file log asli.

Berikut adalah tampilan satu baris dari file log (seperti inilah file log Apache terlihat):

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"

Beberapa nomor pertama adalah alamat browser yang meminta. Bagian yang paling menarik adalah "GET path HTTP" yang menunjukkan jalur permintaan web yang diterima server. Jalur itu sendiri tidak pernah berisi spasi, dan dipisahkan dari GET dan HTTP dengan spasi (saran ekspresi reguler: \S (huruf besar S) cocok dengan karakter non-spasi apa pun). Cari baris di log tempat string "puzzle" muncul di dalam jalur, dengan mengabaikan banyak baris lainnya di log.

Bagian A - File Log Ke URL

Lengkapi fungsi read_urls(filename) yang mengekstrak URL teka-teki dari dalam logfile. Temukan semua url jalur "puzzle" di logfile. Gabungkan jalur dari setiap URL dengan nama server dari nama file untuk membentuk URL lengkap, mis. "http://www.example.com/path/puzzle/from/inside/file". Menyaring URL yang muncul lebih dari sekali. Fungsi read_urls() akan menampilkan daftar URL lengkap, yang diurutkan sesuai urutan abjad dan tanpa duplikat. Mengambil URL dalam urutan abjad akan menghasilkan irisan gambar dalam urutan kiri-ke-kanan yang benar untuk membuat ulang gambar hewan yang asli. Dalam kasus yang paling sederhana, main() hanya akan mencetak URL, satu per baris.

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

Bagian B - Download Teka-Teki Gambar

Menyelesaikan fungsi download_images() yang mengambil daftar URL dan direktori yang diurutkan. Download gambar dari setiap URL ke direktori yang ditentukan, buat direktori terlebih dahulu jika perlu (lihat modul "os" untuk membuat direktori, dan "urllib.url fetch()" untuk mendownload URL). Beri nama file gambar lokal dengan skema sederhana seperti "img0", "img1", "img2", dan seterusnya. Anda mungkin ingin mencetak sedikit baris output status "Mengambil..." saat mendownload setiap gambar karena mungkin akan lambat dan bagus untuk memiliki beberapa indikasi bahwa program ini berfungsi. Setiap gambar adalah potongan vertikal kecil dari aslinya. Bagaimana cara menyatukan potongan-potongan untuk membuat ulang yang asli? Hal ini dapat diselesaikan dengan baik menggunakan sedikit html (tidak perlu pengetahuan HTML).

Fungsi download_images() juga harus membuat file index.html di direktori dengan tag *img* untuk menampilkan setiap file gambar lokal. Semua tag img harus berada pada satu baris bersama tanpa pemisahan. Dengan cara ini, browser menampilkan semua irisan secara bersamaan. Anda tidak memerlukan pengetahuan HTML untuk melakukannya; cukup buat file index.html yang terlihat seperti ini:

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

Tampilannya akan terlihat seperti berikut saat Anda bisa mendownload puzzle hewan:

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

Setelah semuanya berfungsi, membuka index.html di browser akan menampilkan gambar hewan yang asli. Apa hewan dalam gambar?

Bagian C - Penjelasan Irisan Gambar

Teka-teki kedua melibatkan gambar tempat yang sangat terkenal, tetapi tergantung pada beberapa penyortiran khusus. Untuk teka-teki pertama, URL dapat disortir menurut abjad untuk mengurutkan gambar dengan benar. Dalam pengurutan, seluruh URL digunakan. Namun, kami akan mengatakan bahwa jika URL diakhiri dengan pola "-wordchars-wordchars.jpg", misalnya "http://example.com/foo/puzzle/bar-abab-baaa.jpg", URL harus diwakili oleh kata kedua dalam pengurutan (mis. "baaa"). Jadi, mengurutkan daftar URL yang setiap diakhiri dengan pola kata-word.jpg akan mengurutkan URL berdasarkan kata kedua.

Perluas kode Anda untuk mengurutkan URL tersebut dengan benar, kemudian Anda akan dapat memecahkan kode puzzle place_code.google.com kedua yang menampilkan tempat terkenal. Tempat apa yang ditampilkan?

Atribusi CC: gambar yang digunakan dalam teka-teki ini disediakan oleh pemiliknya di bawah lisensi Creative Commons Attribution 2.5, yang sangat mendorong remix konten seperti ini. Gambar hewan berasal dari pengguna zappowbang di flickr dan gambar tempat berasal dari boolean pengguna yang dipisahkan di flickr.