Oznake

utorak, 28. rujna 2010.

Python challenge - level 3

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.

1 komentar:

  1. Regex je zakon stvar, ako znaš da ga python podržava :D. Evo bruteforce metode:

    import 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"

    OdgovoriIzbriši