Na redu je Level 3. Uputa na stranici govori da pronađem slovo sa tri velika bodyguarda sa svake strane. Pretpostavljam da bi to trebalo biti u stilu xXXXxXXXx. Također naslov sitea upućuje na modul re i korištenje regularnih izraza pri rješavanju ovog problema.
U duhu prethodnog koraka otvaram source kod stranice i pronalazim niz podataka koje zbog jednostavnosti spremam u level3.data i započinjem obradu podataka. Obrada se temelji na pronalasku gore opisanog uzorka. Mali trik u ovom rješavanju je kako od arraya znakova dobiti string. To se postiže slaganjem arraya sa vezivom tipa ''. U rješenju je vidljiv taj trik. Također je potrebno primijetiti da se koristi standardna sintaksa za opis regularnih izraza. Zagradama (nekiIzraz) se vraća rezultat izraza u povratnu vrijednost funkcije.
Kod:
# ukljuci modul re
import re
# otvori datoteku s podatcima
src = open('level3.data').read()
# pretrazi podatke za uzorkom i spoji rezultate
rez = ''.join(re.findall('[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]',src))
# ispisi rezultat
print(rez)
Rezultat je programa string 'linkedlist'. Što nas upućuje na sljedeći nivo - Level 4.
P.S. Pri instalaciji Pyhtona na Windowse, ako ga automatski ne doda u PATH varijablu, napravite ovo.
Regex je zakon stvar, ako znaš da ga python podržava :D. Evo bruteforce metode:
OdgovoriIzbrišiimport string
import urllib
#funkcija koja vraca index trazenog substringa
def find_pos(html, pos):
index = html.find(pos, 0, len(html))
return index
#
begining = ''
lowerList = []
html = urllib.urlopen('http://www.pythonchallenge.com/pc/def/equality.html').read()
#cita od indexa gdje se pojavljuje komentar pa do indexa gdje zavrsava
for i in range(find_pos(html, begining), find_pos(html, end)-3, 1):
sequence = ''#kasnije sprema jedan string oblika xXXXxXXXx
if((not(html[i-1].isupper())) & # x
(html[i].isupper()) & # X
(html[i+1].isupper()) & # X
(html[i+2].isupper()) & # X
(html[i+3].islower()) & # x
(html[i+4].isupper()) & # X
(html[i+5].isupper()) & # X
(html[i+6].isupper()) & # X
(not(html[i+7].isupper()))): # x
lowerList += html[i+3]
for k in range(0, 7, 1):
sequence += html[i+k]
print "\nThis is the list of lowercase chars that match xXXXxXXXx:\n"
print lowerList, "\n"