Python Challengeに挑戦しています。次はLevel3。
#Level 3
タイトルはre
One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.
文字ひとつが、「正確に」三つの大きな随行員に挟まれている。
ヒントを求めてソースコードを見てみると、
<html>
<head>
<title>re</title>
<link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body>
<center>
<img src="bodyguard.jpg"/><br>
<font color="#ffd000">
One small letter, surrounded by <b>EXACTLY</b> three big bodyguards on
each of its sides.
</center>
<br><br>
To see the solutions to the previous level, replace pc with pcc, i.e. go
to: http://www.pythonchallenge.com/pcc/def/equality.html
<br><br>
Join us on IRC: irc.freenode.net #pythonchallenge
</body>
</html>
<!--
kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJIHEmbT
省略
PBuijeoTSpsVLaOGuLVjMZXkBvVXwUuHfBihziiavGSYofPNeKsTXruMUumRRPQJzvSzJkKbtSipiqBd
-->
コメントアウトされた大量のアルファベットの文字列があります。ここから目的のものを見つけ出せばいいようです。
タイトルがreとあるので正規表現(regular expression)を用いれば良さそうです。画像とそのヒントからすると目的の文字は3つの大文字(大きな随行員)に挟まれた小文字であるようです。例えば、"ABCdEFG"というような文字列を探し出せばいいようです。早速プログラムにしてみると、
#!/usr/bin/env python3
import re
reg = re.compile(r'[A-Z]{3}([a-z])[A-Z]{3}')
coText = """
kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJIHEmbT
省略
PBuijeoTSpsVLaOGuLVjMZXkBvVXwUuHfBihziiavGSYofPNeKsTXruMUumRRPQJzvSzJkKbtSipiqBd
"""
ms = reg.findall(coText)
print("".join(ms))
で良さそうです。実行してみると、
jfeiauzroivgzbmpszazlutnwsdofbiwqdjbzshfrblqgsbydajygcbjwggtdfjeobcmdlzxajvitecgpkcfwqbvkoietpiijanvqjjgtcpadjkgcluaidgumcdskunujfcjfmbzkzsasdxsqqqlaeisjefjfdaoljaywxjthqjknednxnsahxqedoeqsdcmltcsnwakjxtytaalhgabekfmyimwrkffydghiunlriwgkuzqljjbsxguytfsatejmdwkfbzifdknpcqimvehxujszbuyutsompijjojspbwlroefiwmrsjstdjhfwxhnthsoosmoqtufoxvpvpjkgiaqgfrhufxxdnjiwtfqusbkeakunjgknpibklgjounivhgxsnekxgrrbslpuaouvhzbilbirmqqxtktgcnkdljoasnexwtgvwjegurnksokjtrovpmykzgeolwysfidemflmkwmj
わけのわからん文字列が出力されてしまった。何が間違いなのか。
##再考
ヒントを改めて読んでみると、『文字ひとつが、「正確に」三つの大きな随行員に挟まれている。』ということだった。「正確に」とはどういうことだろうか。現在の探索方法だと、"AABCdEFGH"みたいに四つの大文字に挟まれているものも探しだしてしまう。ここがまずいのかということで「正確に」三つの大文字に挟まれた小文字を探し出せるようにする。
具体的には
reg = re.compile(r'[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]')
というものに置き換えてみる。
結果
linkedlist
が出力され、意味のある単語が出てきた。
Level 4
linkedlist.html
http://www.pythonchallenge.com/pc/def/linkedlist.html
にアクセスすると、linkedlist.html じゃなくてlinkedlist.php だと変更を求められる。
というわけで次のレベルが開かれた。
http://www.pythonchallenge.com/pc/def/linkedlist.php