Puzzle Python 운동 기록

로그 퍼즐 연습에서는 Python 코드를 사용하여 두 개의 퍼즐을 풀게 됩니다. 이 연습에서는 Python 유틸리티 섹션에 나와 있는 것처럼 urllib 모듈을 사용합니다. 이 연습용 파일은 google-python-exercises 내의 'logpuzzle' 디렉터리에 있습니다. 아직 google-python-exercises.zip을 다운로드합니다. 자세한 내용은 설정을 참조하세요. 'logpuzzle.py' 파일에 코드를 추가합니다.

동물 이미지가 여러 개의 좁은 세로 줄무늬 이미지로 분할되었습니다. 스트라이프 이미지는 인터넷에 있으며 각각 고유한 URL을 가지고 있습니다. URL은 웹 서버 로그 파일에 숨겨져 있습니다. URL을 찾고 모든 이미지 스트라이프를 다운로드하여 원본 이미지를 다시 만들어야 합니다.

슬라이스 URL은 apache 로그 파일 내에 숨겨집니다 (오픈소스 apache 웹 서버는 인터넷에서 가장 널리 사용되는 서버입니다). 각 로그 파일은 일부 서버에서 가져오며 원하는 슬라이스 URL은 로그 내에 숨겨져 있습니다. 로그 파일은 어떤 서버에서 유래한 서버가 다음과 같이 인코딩됩니다. 예를 들어 로그 파일 family_code.google.com은 code.google.com 서버에서 가져온 것입니다 (이전에는 첫 번째 언더바 다음에 오는 서버 이름이라고 함). parent_code.google.com 로그 파일에는 'animal' 퍼즐 이미지에 대한 데이터가 포함되어 있습니다. 로그 파일의 데이터는 실제 Apache 웹 서버의 구문을 가지고 있지만 퍼즐에 필요한 것 이상의 데이터는 실제 로그 파일에서 가져온 무작위 데이터입니다.

로그 파일의 한 줄은 다음과 같습니다 (실제로 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"

처음 몇 개 숫자는 요청한 브라우저의 주소입니다. 가장 흥미로운 부분은 서버에서 수신한 웹 요청의 경로를 보여주는 'GET path HTTP'입니다. 경로 자체는 공백을 포함하지 않으며 GET 및 HTTP와 공백으로 구분됩니다 (정규식 추천: \S (대문자 S)은 공백이 아닌 모든 문자와 일치). 경로 내에서 문자열 'puzzle'이 나타나는 줄을 로그에서 찾고, 로그에 있는 다른 많은 줄은 무시합니다.

파트 A - 파일을 URL로 로그

로그 파일 내에서 퍼즐 URL을 추출하는 read_urls(파일 이름) 함수를 완료합니다. 로그 파일에서 모든 '퍼즐' 경로 URL을 찾습니다. 각 URL의 경로와 파일 이름의 서버 이름을 결합하여 전체 URL을 구성합니다(예: 'http://www.example.com/path/puzzle/from/inside/file'). 두 번 이상 표시되는 URL을 차단합니다. read_urls() 함수는 중복 없이 알파벳순으로 정렬된 전체 URL 목록을 반환해야 합니다. 알파벳순으로 URL을 가져오면 올바른 왼쪽에서 오른쪽 순서로 이미지 슬라이스가 생성되어 원본 동물 이미지를 다시 만들 수 있습니다. 가장 간단한 경우 main()은 URL을 한 줄에 하나씩 출력해야 합니다.

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

파트 B - 이미지 다운로드 퍼즐

정렬된 URL 목록과 디렉터리를 사용하는 download_images() 함수를 완료합니다. 필요한 경우 먼저 디렉터리를 만들어 각 URL에서 지정된 디렉터리로 이미지를 다운로드합니다. 디렉터리를 만드는 방법은 'os' 모듈, URL을 다운로드하려면 'urllib.urlretrieve()' 모듈을 참조하세요. 로컬 이미지 파일의 이름을 'img0', 'img1', 'img2' 등과 같이 간단한 구성표로 지정합니다. 각 이미지를 다운로드하는 동안 '검색 중...' 상태 출력 줄을 출력하는 것이 좋습니다. 속도가 느리고 프로그램이 작동하고 있음을 나타내는 것이 좋기 때문입니다. 각 이미지는 원본과 약간 세로로 잘린 형태입니다. 여러 슬라이스를 결합하여 원본을 다시 만들려면 어떻게 해야 하나요? 약간의 html만으로도 원활하게 해결할 수 있습니다 (HTML 지식이 없어도 됨).

download_images() 함수는 각 로컬 이미지 파일을 표시하는 *img* 태그가 있는 index.html 파일을 디렉터리에 만들어야 합니다. img 태그는 모두 구분되지 않고 한 줄에 있어야 합니다. 이렇게 하면 브라우저에서 모든 슬라이스를 원활하게 함께 표시합니다. HTML에 대한 지식이 없어도 다음과 같은 index.html 파일을 만듭니다.

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

동물 퍼즐을 다운로드하면 다음과 같이 표시됩니다.

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

모두 작동하면 브라우저에서 index.html을 열면 원본 동물 이미지가 표시됩니다. 이미지에 있는 동물이 무엇인가요?

파트 C - 이미지 슬라이스 디스크램블링

두 번째 퍼즐은 매우 유명한 장소의 이미지를 사용하지만 일부 맞춤 정렬에 의존합니다. 첫 번째 퍼즐에서는 URL을 알파벳순으로 정렬할 수 있어 이미지가 올바르게 정렬될 수 있습니다. 정렬에는 전체 URL이 사용됩니다. 그러나 URL이 '-wordchars-wordchars.jpg' 패턴(예: 'http://example.com/foo/puzzle/bar-abab-baaa.jpg')으로 끝나면 URL은 정렬의 두 번째 단어로 표시되어야 합니다(예: 'baaa'). 따라서 Word-word.jpg 패턴으로 각각 끝나는 URL 목록을 정렬하면 URL이 두 번째 단어 순으로 정렬되어야 합니다.

이러한 URL을 적절하게 정렬하도록 코드를 확장하면 유명한 장소를 표시하는 두 번째 place_code.google.com 퍼즐을 디코딩할 수 있습니다. 어떤 장소가 표시되나요?

CC 저작자 표시: 이 퍼즐에 사용된 이미지는 크리에이티브 커먼즈 저작자 표시 2.5 라이선스에 따라 소유자에 의해 제공되며 이와 같은 콘텐츠의 리믹스를 적극 권장합니다. 동물 이미지는 flickr의 사용자 zappowbang에서, 장소 이미지는 flickr의 사용자 booleansplit에서 가져옵니다.