Day 6: Tuning Trouble

(besedilo naloge)

Dobimo nek niz, recimo mjqjpqmgbljsphdztnvjfqwrcgsmlb. Iščemo zaporedje štirih znakov, med katerimi ni nobenega ponovljenega znaka. Zanima nas, koliko znakov tega niza moramo prebrati, da naletimo na takšno četvorko.

Drugi del je podoben, le da namesto četvorke iščemo štirinajsterico, ki ne vsebuje ponovljenega znaka.

data = open("example.txt").read().strip()

Gremo čez možne indekse, for i in range(n, len(data)), in opazujemo nize data[i - n:i], kjer je n v prvem delu 4 in v drugem 14. Vsi njegovi elementi so različni, če množica njegovih elementov vsebuje točno n elementov. Če je tako, izpišemo i. Rešitev naloge (obeh delov) je torej

for n in (4, 14):
    for i in range(n, len(data)):
        if len(set(data[i - n:i])) == n:
            break
    print(i)
7
19

Bolj zanimiva različica iste ideje sestavi generator, ki bi - če bi ga pustili - zgeneriral vse i-je, pri katerih imamo n različnih znakov, (i for i in range(len(data)) if len(set(data[i-n:i])) == n). Zanima nas samo prvi: dobimo ga z next.

for n in (4, 14):
    print(next(i for i in range(len(data)) if len(set(data[i-n:i])) == n))
7
19

Ta rešitev je sicer manj pregledna, časovno pa nič slabša od gornje, saj v resnici ne zgenerira vseh takšnih n temveč samo prvega.