본문 바로가기
Algorithm/WarGame - The Python Challenge

The Python Challenge 3

by 꼬부기가우는소리 2016. 8. 29.
728x90

작성 일자 : 2016. 08. 29

재작성 일자 : 2018. 07. 31


참고 사이트 :

- [Tutorialspoint] Python String islower() Method

- [Tutorialspoint] Python String isupper() Method

- [The Python Challenge Solutions] Level 3

[docs.python] 7.2. re — Regular expression operations



http://www.pythonchallenge.com/pc/def/equality.html





python challenge 3단계이다.

힌트는 "One small letter, surrounded by EXACTLY three big bodyguards on each of its sides."

찾고자 하는 소문자 (One small letter)는 양 옆의 각각 세 개의 대문자 (three big bodyguards) 사이에 존재하는 것을 알 수 있다.

F12 (크롬 개발자 도구)를 눌러 소스 코드를 확인해 보도록 하자.





이번에도 주석으로 처리된 부분이 나오는 것을 확인할 수 있다.




<!--

kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJIHEmbT

MUKLECKdCthezSYBpIElRnZugFAxDRtQPpyeCBgBfaRVvvguRXLvkAdLOeCKxsDUvBBCwdpMMWmuELeG

ENihrpCLhujoBqPRDPvfzcwadMMMbkmkzCCzoTPfbRlzBqMblmxTxNniNoCufprWXxgHZpldkoLCrHJq

vYuyJFCZtqXLhWiYzOXeglkzhVJIWmeUySGuFVmLTCyMshQtvZpPwuIbOHNoBauwvuJYCmqznOBgByPw

TDQheAbsaMLjTmAOKmNsLziVMenFxQdATQIjItwtyCHyeMwQTNxbbLXWZnGmDqHhXnLHfEyvzxMhSXzd

BEBaxeaPgQPttvqRvxHPEOUtIsttPDeeuGFgmDkKQcEYjuSuiGROGfYpzkQgvcCDBKrcYwHFlvPzDMEk

MyuPxvGtgSvWgrybKOnbEGhqHUXHhnyjFwSfTfaiWtAOMBZEScsOSumwPssjCPlLbLsPIGffDLpZzMKz

jarrjufhgxdrzywWosrblPRasvRUpZLaUbtDHGZQtvZOvHeVSTBHpitDllUljVvWrwvhpnVzeWVYhMPs

kMVcdeHzFZxTWocGvaKhhcnozRSbWsIEhpeNfJaRjLwWCvKfTLhuVsJczIYFPCyrOJxOPkXhVuCqCUgE

luwLBCmqPwDvUPuBRrJZhfEXHXSBvljqJVVfEGRUWRSHPeKUJCpMpIsrVMuCmDTZPcAezRnyRTJkYyXk

oLEmjtaCsKmNOKNHygTixMKNaSifidWNbeZYYHCGMtgJiTSlzRMjzOAMuhmYwincvBydQMDPaZclRsYU

SeEnkclzGopkBozDQfXrQqHjRvlAQsijPCsrnUawvyskbTAnjctFftReVrIBFBKiLSFGmrLSrcnZKfOU

wnCGYaMNKNhadSGMXwBaefDrMXoNeJsUaSGlWgttAqovosuhyBWwqQLkVKnRseXaaPwrMtdWjGiVXPvd

......(생략)......




알파벳 대소문자가 뒤섞여 있지만 우리는 힌트로 주어진 규칙에 해당되는 소문자만 찾아내면 된다.

먼저 주석에 해당하는 값을 받아도록 한다.


import urllib.request
import re

html = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/equality.html").read().decode()
data = re.findall("<!--(.*?)-->", html, re.DOTALL)[-1]


Level 2에서와 같이 정규 표현식을 이용하고자 한다.

순서대로 적용해 보면 아래와 같다.

(참고: Level3 해설)


[a-z] : 찾고자 하는 값은 소문자이다

[A-Z][a-z][A-Z] : 소문자는 대문자 사이에 위치해야 한다

[A-Z]{3}[a-z][A-Z]{3} : 대문자는 3번씩 반복되어야 한다

[^A-Z][A-Z]{3}[a-z][A-Z]{3}[^A-Z] : 3번씩 반복된 대문자의 앞과 뒤에는 대문자가 아닌 다른 문자가 와야만 한다

[^A-Z]+[A-Z]{3}[a-z][A-Z]{3}[^A-Z]+ : 다른 문자는 한 개 이상 올 수 있다

[^A-Z]+[A-Z]{3}([a-z])[A-Z]{3}[^A-Z]+ : 신경써야 하는 문자는 소문자이다


해당 정규식을 이용하여 파이썬 코드를 완성시키면 아래와 같다.


import urllib.request
import re

html = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/equality.html").read().decode()
data = re.findall("<!--(.*?)-->", html, re.DOTALL)[-1]
print("".join(re.findall("[^A-Z]+[A-Z]{3}([a-z])[A-Z]{3}[^A-Z]+", data)))



실행한 결과값은 linkedlist이다.

즉, "www.pythonchallenge.com/pc/def/linkedlist.html" 가 python challenge 3단계의 정답이 된다.




'Algorithm > WarGame - The Python Challenge' 카테고리의 다른 글

The Python Challenge 5  (0) 2016.09.07
The Python Challenge 4  (0) 2016.08.31
The Python Challange 2  (0) 2016.08.29
The Python Challenge 1  (0) 2016.08.29
The Python Challenge warming up  (0) 2016.08.29

댓글