• [^] # Re: En Python

    Posté par . En réponse au message Avent du Code, jour 6. Évalué à 4.

    Je ne suis pas du tout satisfait par le fait de transformer à chaque fois un bout glissant de la chaîne d'entrée en un ensemble

    Ma première solution était à base de deque et n'utilisait pas set. L'idée étant que si tu as dédoublonné la fenêtre précédente, et tu as un nouveau caractère, seul celui-ci peu créer un doublon. Donc au lieu de tout dédoublonner (set), tu dédoublonnes que par rapport à ce nouveau caractère.

    Voici:

    import sys
    from collections import deque
    dq = deque()
    for (i,c) in enumerate(sys.stdin.read()):
     equals = list(filter(lambda x: c == x[1], enumerate(dq))) # find duplicate
     assert len(equals)<2
     if len(equals)==1: # remove left part until a char equal to c, included
     for _ in range(equals[0][0]+1):
     dq.popleft()
     if len(dq) == 13: # if we have 13+1 distinct chars, we're good
     print(i+1)
     break
     dq.append(c)

    Mais honnêtement, c'est bien plus compliqué pour pas grand chose.

    Faudrait faire du profilage cpu et ram pour comparer mais sur la taille de mon input et avec la commande time, rien de visible. Et je crains que construire un set de 14 caractères ne soit pas plus coûteux que de manipuler la deque et et le filter.