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:
importsysfromcollectionsimportdequedq=deque()for(i,c)inenumerate(sys.stdin.read()):equals=list(filter(lambdax:c==x[1],enumerate(dq)))# find duplicateassertlen(equals)<2iflen(equals)==1:# remove left part until a char equal to c, includedfor_inrange(equals[0][0]+1):dq.popleft()iflen(dq)==13:# if we have 13+1 distinct chars, we're goodprint(i+1)breakdq.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.
[^] # Re: En Python
Posté par steph1978 . En réponse au message Avent du Code, jour 6. Évalué à 4.
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:
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.