steph1978 a écrit 3405 commentaires

  • [^] # Re: le bit de poids faible

    Posté par  . En réponse au lien la manière la plus efficace de déterminer si un nombre est pair. Évalué à 3.

    Je sais pas si ça valait une vidéo mais la blague est marrante.

  • [^] # Re: oui mais

    Posté par  . En réponse au lien Kyber, le nouveau projet open source de Jean-Baptiste Kempf (VLC). Évalué à 4. Dernière modification le 27 décembre 2023 à 21:41.

    En gros c'est VNC probablement en plus efficace.

  • [^] # Re: On aime les range, youpi, youpi !

    Posté par  . En réponse au message Advent of Code, jour 19. Évalué à 2.

    J'avais fait la partie 1.
    Mais ton code est tellement clean, j'ai repris tel quel :)

  • [^] # Re: J'ai un peu honte...

    Posté par  . En réponse au message Advent of Code, jour 18. Évalué à 2.

    Tout pareil, mas dès la première partie.
    Ce jour m'a permis de découvrir shapely.
    Qui permet aussi de beau tracés:

  • # python en 44 LoC, 110ms et 10MB RAM

    Posté par  . En réponse au message Advent of Code, jour 14. Évalué à 2. Dernière modification le 16 décembre 2023 à 02:22.

    import sys
    
    I = sys.stdin.read().splitlines()
    G = [list(l) for l in I]
    R = len(G)
    C = len(G[0])
    
    def rotate(G, F):
      for r in range(R):
        for c in range(C):
          F[c][R-1-r] = G[r][c]
    
    def tilt(G):
        for x in range(C):
            for y in range(R):
                if G[y][x] == "O":
                    for j in range(y-1,0-1,-1):
                        if G[j][x] == '.':
                            G[j][x] = "O"
                            G[j+1][x] = "."
                        else:
                            break
    
    score = lambda: sum((R-y)*row.count('O') for y,row in enumerate(G))
    
    cache = {}
    F = [['?' for _ in range(C)] for _ in range(R)]  # pre-allocate saves 10% time (no GC)
    
    end = 1_000_000_000
    i = 0
    while i<end:
        i += 1
        for j in range(4):
            tilt(G)
            if i == 1 and j == 0: print(score())  # part 1
            rotate(G, F); F, G = G, F
        h = ''.join(''.join(row) for row in G)
        if h in cache:
            period = i-cache[h]
            skip = (end-i) // period
            i += skip * period
        cache[h] = i
    
    print(score())
  • [^] # Re: Pourquoi des dictionnaires ?

    Posté par  . En réponse au message Advent of Code, jour 15. Évalué à 2. Dernière modification le 16 décembre 2023 à 00:10.

    Pour économiser 40 lignes de code ?

  • [^] # Re: En express aujourd'hui

    Posté par  . En réponse au message Advent of Code, jour 15. Évalué à 2.

    Tu m'évites un copier-coller :) Aux noms des variables près, j'ai exactement le même code.

    Reposant aujourd'hui :)

  • [^] # Re: désolé, c'est pas ma marotte

    Posté par  . En réponse au lien Vous n’écoutez pas assez de contrebasson. Évalué à 2.

    tu est le premier lésé

    C'est plus mon œil qui est lésé là :D

    Bon je taquine, c'était plus une blague sur ton pseudo et le fait que ça n'a pas grand chose à voir avec Linux et le logiciel libre.

    Mais sinon, j'ai regardé la vidéo (sur invidious quand même). Oui, ça déchire.

  • # désolé, c'est pas ma marotte

    Posté par  . En réponse au lien Vous n’écoutez pas assez de contrebasson. Évalué à 4.

    .

  • [^] # Re: Une solution assez élégante, je trouve.

    Posté par  . En réponse au message Advent of Code 2023 : Jour 10. Évalué à 2. Dernière modification le 10 décembre 2023 à 15:40.

    Chapeau pour l'astuce du doublement

  • [^] # Re: j'ai adoré

    Posté par  . En réponse au message Advent of Code 2023 : Jour 10. Évalué à 2. Dernière modification le 10 décembre 2023 à 15:17.

    Avec un lib de gestion des polygone, j'ai fini par trouver pour la partie 2.
    Mais un peu l'impression de tricher et de sortir le bazooka.

    Le code pour la partie 1:

    import sys
    
    I = sys.stdin.read().splitlines()
    G = [list(l) for l in I]
    W = len(G[0])
    H = len(G)
    
    # look for S
    S = None
    for y in range(H):
        if (x := I[y].find("S")) > -1:
            S = (x,y)
            break
    
    D = {
        'u': {
            '|': ( 0,-1,'u'),
            'F': ( 1,0,'r'),
            '7': (-1,0,'l'),
        },
        'r': {
            '-': (1, 0,'r'),
            'J': (0,-1,'u'),
            '7': (0, 1,'d'),
        },
        'd': {
            '|': ( 0,1,'d'),
            'L': ( 1,0,'r'),
            'J': (-1,0,'l'),
        },
        'l': {
            '-': (-1, 0,'l'),
            'L': (0,-1,'u'),
            'F': (0, 1,'d'),
        },
    }
    
    N = 1
    x0, y0 = S
    P = (x0+1, y0, 'r')  # start at S and go right
    for _ in range(100_000):
        x, y, d = P
        N += 1
        z = G[y][x]
        if z == 'S':
            break
        dx,dy,nd = D[d].get(z)
        P = (x+dx,y+dy,nd)
    print(N//2)

    Sinon, c'est joli

    ..............................................................................╔╗.....................................................
    .......................................................................╔╗╔╗╔╗╔╝║.....................................................
    ...........................................................╔═╗.........║╚╝╚╝║╚╗╚╗....................................................
    ..................................╔╗.......................╚╗║╔╗..╔═╗..╚╗╔═╗╚╗║╔╝....................................................
    ...............................╔══╝║..................╔╗....║╚╝║.╔╝╔╝..╔╝║.╚╗║║╚═╗...................................................
    ...............................╚═╗╔╝..╔╗..╔╗..........║╚═╗..║╔═╝╔╝╔╝...╚═╝..║║║╔═╝.......╔╗..........................................
    ...............................╔═╝║...║║..║╚╗.........╚╗╔╝╔╗║╚╗╔╝╔╝╔╗.╔═╗.╔═╝║║╚═╗╔╗.....║╚╗.........................................
    ...............................╚═╗╚╗..║║╔╗║╔╝╔╗.......╔╝╚╗║╚╝╔╝║╔╝.║║╔╝╔╝╔╝╔╗║║╔═╝║║.....╚╗║...╔╗....................................
    ..............................╔═╗║╔╝╔═╝╚╝╚╝╚╗║║.....╔╗╚╗╔╝╚═╗║╔╝║╔╗║║╚╗║.╚╗║║╚╝║.╔╝╚╗..╔╗.║║.╔╗║╚╗....╔╗.............................
    ..............................╚╗║║╚╗╚════╗╔═╝║╚╗....║╚═╝║╔╗╔╝║╚╗║║╚╝║╔╝║..╚╝╚═╗╚╗╚═╗╚╗.║║╔╝╚═╝║║╔╝....║║..╔╗.........................
    ............................╔═╗║║║╔╝╔═══╗║╚╗.║╔╝....╚══╗║║║║╔╝╔╝║║╔═╝║╔╝╔╗..╔═╝╔╝╔╗╚╗╚╗║║╚═╗╔═╝║║.╔═╗╔╝║╔╗║║╔╗.......................
    .........................╔═╗╚╗║║║║╚╗║╔═╗║║╔╝╔╝╚╗.╔╗╔╗╔╗║║║║║╚╗╚╗╚╝╚╗.║╚╗║╚╗╔╝╔╗╚═╝║╔╝╔╝║╚╗.║╚╗╔╝╚╗║╔╝╚╗╚╝╚╝║║║╔╗.....................
    ..................╔╗╔══╗.╚╗╚═╝║║║║╔╝╚╝╔╝╚╝║╔╝╔╗╚╗║╚╝║║╚╝╚╝╚╝╔╝╔╝╔══╝╔╝╔╝╚╗║╚═╝╚═╗╔╝╚╗╚═╝╔╝╔╝╔╝║╔═╝║║..║╔══╗╚╝╚╝╚╗....................
    .................╔╝║╚═╗║╔╗╚══╗╚╝╚╝║╔╗.╚══╗╚╝╔╝╚═╝╚═╗║╚═╗╔═╗╔╝.╚╗║.╔═╝╔╝╔═╝╚═╗.╔╗║╚═╗╚══╗║╔╝╔╝.║║╔╗║╚╗╔╝╚═╗║╔═╗╔═╝....................
    ...............╔╗╚╗║╔╗║║║║╔═╗║╔╗╔═╝║╚══╗╔╝╔═╝╔╗╔╗╔╗║║╔╗╚╝╔╝╚╗╔╗║╚╗║╔═╝.╚══╗╔╝╔╝║║╔═╝.╔╗║║╚╗╚══╝║║║╚╗║║╔══╝╚╝.╚╝......................
    ...............║║╔╝║║║║╚╝║╚╗║╚╝║╚╗.╚═╗╔╝╚╗║╔═╝║║║║║║║║║╔╗╚╗╔╝║║║╔╝║║.╔╗.╔═╝╚╗╚╗║║║╔╗╔╝║║║╔╝╔═══╝║║╔╝╚╝╚══════╗╔╗.....................
    .........╔╗╔╗.╔╝║╚╗║║╚╝╔═╝╔╝╚═╗╚╗╚╗╔╗║╚╗╔╝╚╝╔╗║║║║╚╝║║║║║╔╝║╔╝║║╚═╝╚═╝╚╗╚═╗╔╝╔╝║║║║║╚╗╚╝╚╝╔╝.╔╗.║║╚══╗╔══════╝║╚═╗...................
    .......╔═╝╚╝║.╚╗╚═╝║╚═╗║╔╗╚╗╔═╝.╚╗║║╚╝╔╝╚╗╔═╝╚╝║╚╝╔╗║║║║║╚╗║║╔╝╚╗╔═════╝.╔╝╚╗╚╗║║║║║╔╝╔═══╝╔╗║╚═╝║╔╗╔╝╚═╗╔╗╔╗.║╔═╝.╔═╗...............
    .......╚═══╗║╔╗╚═╗╔╝╔╗║║║╚╗║╚══╗╔╝║╚╗╔╝╔═╝╚╗╔═╗╚══╝║║║║║║╔╝║║╚╗╔╝║╔╗╔╗.╔╗╚═╗╚╗║║║║║║║╔╝.╔╗.║║║╔═╗║║╚╝╔══╝║║║║╔╝║...╚╗║...............
    ...........║║║╚╗╔╝╚╗║╚╝╚╝╔╝║╔══╝╚╗╚═╝║.║╔╗╔╝║╔╝╔╗╔╗║╚╝╚╝║╚╗║║╔╝║╔╝║╚╝╚╗║╚═╗╚╗║║║║║║║║╚╗╔╝╚╗║║║║.║║╚═╗╚══╗║╚╝╚╝╔╝....║║...............
    .....╔╗╔╗╔═╝╚╝╔╝╚═╗║╚═╗╔╗╚═╝╚╗╔═╗╚══╗╚╗╚╝║║╔╝╚╗║║║║╚═══╗╚═╝╚╝╚╗║║.╚══╗║╚╗╔╝╔╝╚╝║║╚╝║║╔╝║╔╗╚╝╚╝╚╗╚╝╔╗║╔══╝║╔═══╝╔═╗..║║...............
    .╔══╗║║║║╚═══╗╚╗╔╗║║╔╗╚╝╚══╗╔╝║╔╝.╔╗║╔╝╔═╝║║╔═╝║║║║╔╗╔╗╚═════╗║║╚═╗.╔╝║╔╝╚╗║╔═╗║╚═╗║║╚╗╚╝║╔═══╗╚╗╔╝╚╝╚═╗╔╝║╔╗╔╗║╔╝╔╗║║...............
    .╚═╗╚╝╚╝╚═══╗╚╗║║║║║║║╔═╗╔═╝╚═╝╚╗╔╝╚╝╚╗╚═╗║║╚═╗║╚╝║║╚╝╚╗╔═══╗║╚╝╔═╝╔╝╔╝╚╗╔╝╚╝╔╝╚╗.║║║╔╝╔╗║║╔╗.╚═╝║╔════╝╚╗║║║║║║║.║║║╚══╗╔╗..........
    ...╚══╗╔═╗╔╗╚═╝╚╝╚╝║║║╚╗║╚══╗╔══╝╚══╗╔╝╔╗║║║╔═╝╚═╗║╚╗╔═╝╚══╗║║╔═╝╔╗║╔╝╔═╝╚╗╔╗╚═╗║╔╝╚╝╚═╝╚╝╚╝╚╗╔╗.║╚╗╔╗.╔╗║╚╝║║╚╝║╔╝╚╝╔══╝║║╔╗........
    ..╔═══╝╚╗║║╚══════╗║║║.║╚╗╔╗║╚═╗.╔╗╔╝╚╗║║║║║╚╗.╔═╝╚═╝║╔╗╔══╝║║║╔╗║║║╚═╝╔╗╔╝║╚╗╔╝║╚══╗╔═╗╔═══╗║║╚╗║╔╝║╚╗║╚╝╔╗║║╔═╝║╔══╝╔═╗║║║╚╗.......
    ..║╔╗╔═╗║╚╝.╔═════╝╚╝╚╗╚╗║║╚╝╔╗║╔╝╚╝╔╗╚╝╚╝║╚╗╚╗╚═══╗╔╝║║╚══╗║║║║║║╚╝╔╗╔╝╚╝.╚╗║╚╗╚═╗.║║.║╚╗╔╗╚╝╚╗╚╝╚╗╚╗║║╔═╝╚╝║║╔╗║║.╔╗╚╗║║╚╝╔╝.......
    ..║║╚╝.╚╝...╚╗╔═╗╔╗╔═╗╚╗║║╚╗╔╝╚╝╚═╗╔╝╚═╗╔═╝╔╝╔╝╔╗╔═╝╚╗║╚╗╔╗║╚╝╚╝║║╔═╝╚╝╔╗.╔═╝║.╚╗╔╝╔╝╚╗╚═╝║╚╗.╔╝╔══╝╔╝╚╝╚╗╔══╝║║╚╝╚╗║╚╗║╚╝╔═╝........
    ..╚╝.....╔═╗╔╝║.╚╝╚╝.╚╗║║║.║║╔╗.╔╗╚╝╔══╝╚╗╔╝╔╝.║║║╔╗╔╝╚╗║║║╚╗╔═╗║║╚══╗╔╝╚╗╚═╗║╔═╝╚╗║╔╗╚╗.╔╝╔╝╔╝╔╝.╔╗╚═╗╔═╝║╔══╝║╔══╝╚╗║║╔═╝.╔╗╔╗.....
    .........╚╗║╚═╝╔══════╝╚╝╚═╝║║╚╗║╚═╗╚══╗╔╝╚╗║╔═╝║║║╚╝╔═╝║║║.╚╝.║║║╔═╗║╚═╗║╔╗║║╚═╗╔╝╚╝╚╗╚╗╚╗║.║╔╝╔═╝║╔╗║╚═╗║║╔╗.║╚╗╔══╝║║╚═══╝╚╝╚╗....
    ..........║╚╗╔╗╚═══════╗╔╗╔╗╚╝╔╝╚═╗║╔╗╔╝╚╗╔╝║╚═╗║║╚═╗╚═╗║║║╔╗.╔╝╚╝╚╗╚╝.╔╝║║╚╝║╔╗║╚╗.╔╗╚╗╚═╝╚╗║╚╗╚═╗║║╚╝╔═╝║╚╝║╔╝╔╝╚╗╔╗║║╔════╗╔╗║....
    ..........╚╗╚╝╚════════╝║╚╝║╔╗╚╗╔╗║║║║╚╗╔╝╚╗║╔═╝║║╔═╝╔═╝╚╝╚╝║╔╝╔═══╝.╔╗╚╗║╚═╗╚╝║║╔╝╔╝╚╗║╔═══╝║╔╝╔╗║║╚═╗╚══╝╔═╝║╔╝╔╗╚╝║╚╝╚═╗..╚╝╚╝....
    ...........╚═══════════╗╚╗╔╝║╚╗║║║║║║║╔╝║╔╗║╚╝╔═╝║╚═╗╚════╗╔╝╚╗╚╗╔══╗║║╔╝║╔╗║╔╗║║╚╗╚═╗╚╝║╔╗╔╗║╚═╝║║║╔╗║╔═══╝.╔╝╚═╝╚╗╔╝╔═══╝.╔╗..╔╗...
    ..........╔═══════════╗║╔╝║╔╝╔╝║║║║║║║╚╗║║║╚╗╔╝╔╗║╔═╝╔╗.╔╗║║..║╔╝╚╗╔╝║║║╔╝║║╚╝║║║╔╝╔╗║╔═╝║║║║╚╗╔═╝║║║║║║╔═══╗╚╗╔═══╝║╔╝╔══╗.║╚╗╔╝║...
    ..........╚╗╔═╗╔╗╔═══╗║╚╝╔╝║.╚╗╚╝╚╝║║║╔╝║║║╔╝╚╗║║║╚═╗║║╔╝║║╚╗╔╝╚╗╔╝╚╗║║║╚╗║╚╗╔╝║║╚╗║║║║╔╗║║║║╔╝║╔═╝║║╚╝╚╝╔╗╔╝╔╝╚═╗╔╗║╚═╝╔╗╚╗║╔╝║╔╝...
    ........╔╗.║╚╗╚╝╚╝╔══╝╚╗.╚═╝╔╗╚═══╗║║║╚╗╚╝║║▇╔╝║║╚═╗║║║║╔╝║▇║╚╗╔╝╚═╗║║╚╝▇║║▇║║▇╚╝╔╝║║║║║║║║║╚╝╔╝╚╗╔╝║╔═══╝╚╝.║╔══╝║║║╔══╝╚╗╚╝║╔╝╚══╗.
    .......╔╝║.╚═╝╔══╗╚═══╗╚═╗╔═╝╚════╝╚╝║╔╝╔═╝╚╗╚╗║║╔╗║║║║║╚═╝╔╝╔╝║╔═╗║║╚══╗║║╔╝╚╗╔═╝╔╝║║╚╝║║║╚═╗╚╗╔╝║╔╝╚══╗╔╗╔╗║╚══╗║╚╝╚═══╗║╔╗╚╝╔═╗╔╝.
    .......╚╗║╔╗..╚═╗║╔╗╔╗╚╗╔╝╚═════╗╔╗╔╗╚╝╔╝╔╗╔╝╔╝║╚╝╚╝║║║║╔══╝╔╝╔╝║╔╝║║╔╗╔╝║║║╔╗║║╔╗╚╗║╚═╗║║╚╗╔╝▇║║╔╝║╔╗╔═╝║╚╝╚╝╔══╝║╔╗╔═══╝╚╝║╔╗╚╗║╚╗.
    ........║╚╝║.╔═╗║║║╚╝╚═╝╚╗╔════╗╚╝╚╝╚╗▇╚╗║║║▇╚╗╚═╗╔═╝║╚╝╚╗╔╗║▇╚╗║╚╗║║║╚╝▇╚╝║║║║║║╚╗║╚╗╔╝║║╔╝╚╗╔╝║╚═╝║╚╝╔╗╚╗╔══╝╔╗.║║║╚═════╗║║╚═╝╚═╝.
    ........╚═╗╚╗╚╗║║╚╝╔════╗║╚══╗╔╝╔═╗╔╗╚═╗║║║╚═╗║╔╗║║╔╗╚╗╔═╝║║╚═╗║║▇║║║╚╗╔═══╝║╚╝║║╔╝╚╗╚╝▇║║╚╗╔╝╚═╝▇╔═╝╔═╝╚═╝║╔╗╔╝╚═╝║╚════╗╔╝║╚═╗.....
    ........╔╗╚╗╚═╝╚╝╔╗║╔═══╝╚═╗╔╝╚═╝╔╝║║╔╗║╚╝║╔═╝║║║║║║╚╗║║╔═╝║╔═╝║║╔╝║╚═╝╚╗╔╗╔╝╔═╝║╚══╝╔══╝╚╗║║╔═══╗╚══╝╔═══╗╚╝║║╔═══╝.╔╗╔╗╚╝.╚══╝.....
    ........║║.╚════╗║║║╚══╗╔═╗║╚═══╗╚═╝╚╝╚╝╔╗║╚═╗╚╝║║║║╔╝║║║╔═╝╚═╗╚╝╚╗╚═╗▇╔╝║║║╔╝╔╗╚══╗▇╚═══╗║╚╝╚══╗╚╗▇╔╗╚══╗║╔╗╚╝╚═════╝╚╝╚═══╗.╔═╗....
    .....╔══╝║╔╗╔═══╝║╚╝╔══╝║╔╝╚╗╔══╝╔══════╝║╚═╗╚═╗║║║║║╔╝║║║╔╗╔╗╚╗▇╔╝╔╗╚╗╚╗║║║║╔╝╚╗╔═╝╔═╗▇╔╝╚═╗╔╗▇╚╗╚═╝╚═══╝║║║╔═╗╔╗╔╗╔═╗╔╗╔═╗║╔╝╔╝....
    .....╚╗╔╗╚╝╚╝╔╗╔═╝╔═╝╔══╝╚═╗║╚═══╝╔╗╔═╗╔╗╚╗▇║╔╗║╚╝║║║║╔╝║║║╚╝╚╗╚╗║╔╝╚╗╚╗║║║║║║▇╔╝╚╗▇║╔╝╔╝╔═╗║║╚══╝╔═══╗╔╗.║║╚╝.║║╚╝║╚╗╚╝╚╝.╚╝╚╗║.....
    ......╚╝╚═══╗║║║╔═╝╔╗╚╗╔═══╝╚══╗╔═╝╚╝▇╚╝║╔╝╔╝║║╚═╗║║║║╚╗║╚╝▇╔═╝╔╝║╚╗▇╚╗║║║╚╝║║╔╝╔╗╚═╝║▇╚╗╚╗║║╚══╗╔╝▇╔╗║║╚╗║╚══╗║╚═╗╚╗╚╗╔╗╔╗╔╗╔╝╚═╗...
    .......╔══╗.╚╝╚╝╚══╝╚═╝╚══════╗║╚╗╔╗╔══╗║╚╗╚╗║╚╗╔╝╚╝║║╔╝║╔╗╔╝╔╗╚╗║╔╝╔═╝║╚╝╔═╝║║╔╝║╔═╗╚╗▇╚═╝╚╝▇╔═╝║╔═╝╚╝║╔╝╚═══╝║╔═╝.╚╗╚╝╚╝║║║╚╗╔═╝...
    .......╚═╗╚═════╗.╔╗╔╗╔═══════╝╚═╝║║║╔═╝╚╗║╔╝╚╗║╚══╗║║╚═╝║╚╝╔╝╚╗║╚╝╔╝╔╗╚═╗╚═╗║║║╔╝╚╗╚╗╚══╗▇╔═╗╚═╗║╚════╝╚════╗.╚╝╔══╗║╔╗╔═╝║╚═╝║.....
    ......╔╗╔╝╔══╗╔╗╚═╝║║║╚═╗╔══╗╔══╗▇║╚╝║▇╔╗╚╝╚══╝║╔══╝╚╝╔══╝╔╗╚═╗╚╝▇╔╝╔╝╚══╝╔═╝║║║║╔╗╚╗║╔═╗╚╗╚╗║╔╗╚╝╔╗╔╗╔╗╔═╗╔╗╚═╗.║╔═╝║║║╚══╝╔═╗╚╗....
    .....╔╝╚╝╔╝╔═╝║╚╗╔╗╚╝╚═╗╚╝╔╗╚╝╔╗╚═╝╔╗╚═╝║╔═╗╔═╗╚╝╔═══╗╚╗╔╗║║╔╗╚╗╔╗╚╗╚═══╗▇║╔═╝╚╝╚╝║╔╝║╚╗║╔╝╔╝╚╝╚══╝╚╝╚╝╚╝╔╝║║╔═╝╔╝╚═╗╚╝╚═╗╔╗║.║╔╝....
    .....╚╗╔╗║╔╝╔╗║.╚╝╚═══╗╚══╝║╔═╝║╔╗╔╝╚═══╝╚╗║║╔╝╔╗╚╗╔═╝╔╝║║║╚╝╚╗╚╝║╔╝╔╗╔═╝╔╝║╔═════╝╚╗║╔╝║╚╗╚╗╔╗╔╗╔══╗╔══╗╚═╝╚╝╔╗║╔══╝╔══╗║║║╚╗║║.....
    ......╚╝║║╚═╝╚╝╔╗╔═══╗╚═══╗║╚═╗╚╝╚╝▇╔╗╔╗╔╗║╚╝╚╗║║╔╝╚═╗╚╗║║╚╗▇╔╝╔╗║╚╗║║╚═╗╚╗║╚╗╔╗╔╗╔═╝╚╝▇╚╗╚╗╚╝╚╝╚╝╔╗╚╝╔═╝╔╗╔╗╔╝╚╝╚╗╔╗║╔═╝║║║╔╝╚╝.....
    ........╚╝.╔╗╔═╝║╚══╗║╔╗╔╗║║╔╗╚═════╝╚╝╚╝╚╝╔═╗╚╝╚╝╔╗╔╝╔╝║╚═╝╔╝╔╝║╚╗║║╚╗╔╝╔╝║╔╝║╚╝║╚═════╗╚╗║╔═════╝╚══╝.╔╝╚╝╚╝╔═══╝║║║╚═╗╚╝╚╝........
    ........╔═╗║║╚═╗║╔╗╔╝╚╝╚╝╚╝╚╝║╔╗╔╗╔╗╔╗╔╗╔══╝▇╚╗╔╗╔╝║║▇╚═╝╔══╝╔╝╔╝╔╝║║╔╝╚╗║╔╝╚═╝╔═╝╔╗╔╗╔╗╚╗║║║╔═════════╗╚╗╔══╗╚════╝╚╝╔╗╚══╗╔╗.......
    ........╚╗╚╝╚══╝╚╝║╚════════╗╚╝╚╝╚╝╚╝╚╝║╚═╗╔═╗║║║║▇╚╝╔══╗║╔═╗║╔╝╔╝╔╝║║╔╗║║║╔╗╔╗╚╗╔╝║║╚╝╚╗║║║╚╝╔════════╝╔╝╚╗.║╔╗╔═╗╔═╗║║╔═╗╚╝╚═╗.....
    .........╚╗╔╗╔═╗╔╗╚═════════╝╔═════╗╔═╗╚╗╔╝║╔╝╚╝║╚═══╝╔═╝║║╔╝║║╔╝▇║╔╝║║║║╚╝║║║║╔╝╚╗║╚══╗║║║║╔╗╚═════════╝╔╗╚╗║║║╚╗║║╔╝║║╚╗║╔═══╝.....
    ..........║║║║.╚╝╚═╗╔═╗╔═╗╔╗╔╝╔╗╔══╝║╔╝▇╚╝╔╝╚╗╔╗║╔╗╔═╗║╔╗╚╝║╔╝║╚═╗║║▇╚╝║║╔═╝╚╝╚╝╔╗║║╔═╗║║║╚╝║╚╗╔═══════╗╔╝╚═╝╚╝╚═╝║║╚╗║╚═╝║╚═══╗.....
    ..........╚╝╚╝.╔╗.╔╝╚╗╚╝.╚╝╚╝╔╝╚╝╔╗▇║║╔═══╝╔╗╚╝║║║╚╝╔╝╚╝╚═╗║║▇║╔═╝╚╝▇▇╔╝║╚╗╔═╗╔╗║║║║╚╗║║╚╝╔╗╚╗║╚══════╗║╚═════╗╔╗╔╝║╔╝╚╗╔╗╚═══╗║.....
    ...........╔╗╔═╝╚═╝╔═╝╔══╗╔╗.╚═══╝╚═╝╚╝╔═╗╔╝║╔╗║║╚═╗╚╗╔═╗╔╝║║╔╝║▇▇▇▇▇▇╚═╝▇║║╔╝║║║╚╝╚╗║╚╝╔═╝╚═╝╚╗▇╔╗▇╔╗║║╔═╗╔═╗╚╝║║╔╝║╔╗╚╝╚═══╗║║.....
    ..........╔╝║╚══╗╔╗║╔╗╚═╗╚╝╚═══════════╝▇╚╝▇║║║║║╔╗╚╗║║╔╝╚╗╚╝╚╗╚═╗▇▇▇▇▇▇▇╔╝║╚╗║║║╔╗╔╝╚╗▇╚═════╗║╔╝╚╗║╚╝╚╝╔╝╚╗║╔═╝╚╝.║║║╔╗╔═══╝╚╝.....
    ..........╚╗╚═══╝║╚╝║╚╗.╚╗╔╗╔╗╔════════╗╔══╗║║╚╝╚╝╚╗║║║╚╗╔╝▇▇▇║╔╗║▇▇▇▇▇▇▇╚═╝▇║║╚╝║║║╔╗║╔══╗╔╗╔╝╚╝╔╗╚╝╔╗╔╗╚╗╔╝║╚════╗║║║║║╚═══╗.......
    .........╔╗╚═════╝.╔╝╔╝╔╗╚╝║║║║╔═╗╔══╗╔╝║╔═╝║╚════╗║║╚╝╔╝║▇▇▇▇║║╚╝▇▇▇▇▇▇▇▇╔══╝╚╗╔╝╚╝║╚╝╚═╗║║║╚══╗║╚═╗║╚╝╚╗╚╝.╚═╗╔══╝╚╝║║║╔═╗╔╝.......
    .........║╚═══╗.╔═╗╚╗╚═╝╚══╝║╚╝╚╗╚╝╔╗╚╝╔╝╚═╗╚═╗╔╗╔╝║╚╗▇╚═╝▇▇▇▇╚╝▇▇▇▇▇▇▇▇▇▇╚═╗╔═╝╚═══╝╔═══╝╚╝╚═╗▇╚╝╔╗╚╝╔╗╔╝╔╗╔╗.╚╝╔═╗╔╗╚╝║╚╗╚╝╔╗......
    .........╚═══╗╚╗╚╗╚╗╚═══╗╔╗╔╝.╔╗╚══╝╚╗╔╝╔═╗╚═╗╚╝╚╝▇╚═╝▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╚╝╔╗╔══╗▇╚══╗╔═╗╔╗╚═══╝╚══╝╚╝╔╝╚╝║╔╗.╚╗║║╚═╗╚╗╚══╝╚═╗....
    ........╔╗╔═╗╚╗║╔╝╔╝.╔╗.╚╝╚╝╔╗║║╔═══╗╚╝╔╝▇╚══╝╔╗╔╗╔╗▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╔╝╚╝╔╗╚╗▇╔╗║║╔╝║╚════╗╔╗╔══╗║╔═╗╚╝╚══╝╚╝╔╗║╔╝╔═╗╔═╗║....
    .......╔╝║╚╗║.║║╚╗╚╗╔╝╚╗.╔══╝╚╝╚╝╔╗▇╚╗╔╝▇╔════╝╚╝╚╝╚╗▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╚══╗║╚╗╚╗║║╚╝╚═╝╔════╝║╚╝╔═╝║║.╚══╗╔══╗╔╝╚╝╚╗╚╗╚╝.╚╝....
    .......╚╗║╔╝╚═╝╚╗║╔╝╚═╗╚═╝╔╗╔════╝╚═╗║╚══╝╔═╗╔═╗╔═══╝▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╔╝║▇╚╗║║╚═╗▇╔╗╚═══╗╔╝╔═╝╔╗║╚═╗╔╗╚╝..╚╝..╔╗║╔╝.........
    ...╔═╗╔═╝║╚══╗╔╗╚╝╚═══╝╔══╝╚╝╔════╗╔╝║╔══╗╚╗║╚╗╚╝╔═╗╔╗▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╚╗║╔═╝╚╝╔═╝╔╝╚╗▇╔╗╚╝▇╚══╝║║╔═╝║║.╔╗╔╗╔╗.║║╚╝.╔╗.......
    ...╚╗║╚═╗╚╗╔╗╚╝╚═╗╔═╗╔╗║╔═══╗╚═══╗╚╝▇╚╝╔╗╚═╝╚═╝╔═╝╔╝║║▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╚╝╚═╗╔╗╚══╝╔╗╚═╝╚══╗╔═══╝║╚══╝║╔╝╚╝╚╝╚╗║╚╗╔═╝╚══╗....
    .╔══╝╚═╗╚╗║║║.╔═╗╚╝.╚╝╚╝╚══╗╚════╝▇╔══╗║╚══╗▇╔╗╚╗╔╝╔╝╚═╗▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╔═╗╔╗╚╝╚═══╗║╚═════╗║╚════╝╔╗╔═╝║╔═╗╔╗╔╝║╔╝╚╗╔═══╝....
    .╚╗╔╗╔╗╚═╝╚╝╚╗╚╗╚═╗╔═╗╔╗╔╗╔╝╔╗╔════╝╔═╝║╔══╝╔╝║╔╝╚═╝╔══╝▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╔╗▇▇▇╚╗╚╝╚══════╝║╔═════╝║╔╗╔═══╝║╚══╝╚╗╚╝╚╝.║╚═╗║║╔═══╗...
    ..╚╝╚╝╚═╗╔╗╔╗╚═╝╔╗╚╝╔╝║║║║╚═╝║║.╔══╗╚═╗║╚╗╔╗╚╗╚╝╔╗╔╗╚══╗▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇║║▇╔╗▇║╔══════╗╔═╝╚═════╗╚╝╚╝.╔╗.╚════╗╚╗╔╗╔╗║╔═╝║╚╝╔══╝...
    .....╔╗╔╝║╚╝╚╗╔╗║║╔╗╚═╝╚╝╚╗╔═╝║╔╝╔╗╚══╝║╔╝║║╔╝╔═╝╚╝╚═╗╔╝▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇║╚═╝╚╗╚╝▇╔═══╗║║╔═══╗╔═╗╚╗╔══╗║╚╗.╔╗╔╗╚╗╚╝║║║║╚═╗║╔╗╚╗.....
    ....╔╝╚╝╔╝╔╗╔╝║╚╝╚╝╚══╗╔═╗╚╝╔╗║╚═╝╚════╝╚╗║║╚╗╚═════╗║╚╗▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╚═══╗║▇╔╗╚══╗╚╝║╚══╗║╚╗║╔╝║╔═╝║╔╝╔╝╚╝╚╗╚══╝║║║╔═╝║║╚═╝.....
    ....╚╗╔╗║╔╝╚╝╔╝╔══════╝║.╚╗╔╝╚╝.╔╗╔══════╝║║╔╝╔╗╔╗╔═╝╚═╝▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╔══╝╚╗║╚═╗╔╝╔═╝╔══╝╚═╝╚╝╔╝╚══╝╚═╝╔╗╔╗╚═══╗║║║╚══╝╚╗.......
    ....╔╝║║║╚╗╔╗╚╗╚═══════╝╔╗╚╝╔═══╝╚╝▇╔╗╔╗▇╔╝╚╝╔╝║║║╚═╗▇╔═══╗▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╚═══╗║╚╗╔╝╚═╝╔╗╚══╗╔═╗╔═╝▇╔══╗╔══╝╚╝║╔╗╔╗╚╝╚╝╔╗╔══╝╔═╗....
    ....╚╗║╚╝.╚╝╚═╝╔════════╝╚═╗╚═══════╝╚╝╚═╝╔╗╔╝╔╝║╚══╝╔╝╔══╝▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╔══╗║╚═╝╚════╝╚═══╝║╔╝║╔═╗╚═╗║╚═╗╔╗.╚╝║║║╔═══╝║╚═══╝╔╝....
    .....║╚╗╔╗╔═╗╔╗╚╗╔═╗╔╗╔═╗╔═╝╔════╗╔════╗╔╗║╚╝▇╚╗╚═╗▇╔╝╔╝▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇╔═╝╔╗╚╝╔╗╔╗╔╗╔═════╗╔╝╚╗║╚╗╚══╝╚═╗╚╝╚══╗╚╝╚╝╔══╗║╔═╗╔═╝.....
    .....╚═╝║║╚╗║║╚╗╚╝.╚╝╚╝╔╝║╔╗╚═══╗║╚══╗▇╚╝║╚══╗╔╝╔╗╚═╝╔╝▇▇╔╗▇▇▇▇▇╔═╗▇▇▇▇╔╗╚══╝╚╗╔╝╚╝╚╝╚╝╔═══╗╚╝╔═╝║▇╚═════╗╚╗╔╗╔╗╚════╝╔═╝║╚╗╚╝.......
    ......╔═╝╚═╝║╚╗║.╔╗.╔╗.╚╗║║║╔═══╝╚══╗╚══╗╚╗╔═╝╚╗║║╔╗╔╝╔╗╔╝╚═╗▇▇▇╚╗╚╗▇▇╔╝║▇▇╔╗▇║║╔══╗╔══╝╔╗╔╝╔╗╚══╝╔══════╝.╚╝╚╝╚════╗╔╝╔╗╚═╝.........
    ...╔═╗╚════╗╚═╝╚═╝╚═╝╚══╝╚╝║║╔════╗▇╚═══╝▇║╚══╗╚╝║║╚╝▇║║║╔══╝▇▇╔╗║╔╝▇▇╚╗╚╗╔╝╚╗║║╚═╗║╚═══╝║╚═╝║▇╔╗▇╚════════╗╔═════╗.╚╝╔╝╚═╗..........
    ...╚╗║.╔╗╔═╝╔═══════════╗╔╗║╚╝╔╗╔╗╚═════╗╔╝╔═╗╚═╗║║╔══╝║║╚═╗▇▇╔╝║║╚╗▇╔╗║╔╝╚╗╔╝╚╝╔╗║║╔╗▇╔╗╚══╗╚═╝║╔╗╔═══╗╔══╝╚╗╔═══╝╔╗.║╔═╗╚╗.........
    ...╔╝╚═╝╚╝╔╗║╔══════╗╔╗.╚╝║║.╔╝╚╝╚══╗╔═╗║╚╗╚╗╚═╗║╚╝╚╗╔═╝║╔═╝▇▇╚╗║║╔╝╔╝╚╝╚╗▇║╚═╗╔╝╚╝║║╚╗║╚═══╝╔═╗║║║╚══╗╚╝╔╗╔╗║║╔══╗║║╔╝╚╗╚═╝.........
    ...╚══╗╔═╗║║║╚═╗╔╗╔╗╚╝╚═══╝╚╗║╔════╗║╚╗╚╝▇╚╗╚╗▇╚╝╔══╝║╔╗║╚══╗╔═╝╚╝║╔╝╔═══╝╔╝╔═╝╚╗╔╗╚╝╔╝║╔═══╗║╔╝╚╝╚═══╝╔╗║╚╝╚╝║║╔═╝║╚╝╔═╝............
    ....╔═╝╚╗╚╝╚╝╔╗║║╚╝╚═╗╔╗╔══╗║╚╝.╔╗╔╝╚═╝╔══╗╚═╝╔═╗╚══╗╚╝║║╔╗╔╝╚═══╗║╚╗╚╗╔╗▇╚╗╚══╗╚╝╚═╗╚╗╚╝╔╗▇╚╝╚═╗╔╗╔╗╔═╝╚╝╔══╗╚╝╚╗╔╝╔╗╚═╗............
    ..╔╗║╔══╝╔═══╝╚╝║╔══╗╚╝╚╝╔═╝╚╗╔═╝╚╝▇╔╗▇║╔═╝╔╗▇║╔╝▇╔╗║╔═╝║║╚╝▇╔═╗╔╝╚╗╚╗╚╝╚╗╔╝╔══╝╔╗╔╗║╔╝▇╔╝╚═╗╔══╝║╚╝╚╝╔╗╔╗╚╗.╚══╗╚╝╔╝╚╗╔╝............
    ..║╚╝║╔══╝╔═╗╔═╗║╚═╗║.╔╗.╚══╗║╚════╗║╚╗║║╔╗║║╔╝╚╗╔╝║║╚═╗║╚═╗▇╚╗║╚═╗║▇╚═╗╔╝║╔╝▇╔╗║╚╝║║║╔╗╚╗╔═╝╚══╗║╔═══╝╚╝╚╗╚═══╗╚╗╔╝╔╗╚╝╔╗.╔╗........
    ╔═╝╔╗║╚═══╝.║║.╚╝.╔╝╚═╝╚════╝╚═════╝║╔╝║╚╝╚╝╚╝╔═╝╚╗║║╔═╝║╔═╝▇╔╝║╔═╝║╔╗╔╝╚═╝╚═╗║║╚═╗║║╚╝╚═╝╚╗╔╗╔╗╚╝╚══════╗╚╗╔══╝.╚╝.║╚══╝╚╗║╚═╗......
    ║╔╗║║╚╗.╔═══╝╚╗.╔═╝╔╗╔╗╔╗╔══╗╔══╗╔══╝╚╗║╔╗╔═╗╔╝╔═╗║╚╝║╔╗║║╔╗╔╝╔╝╚╗╔╝║║╚╗╔╗╔═╗║║╚═╗║║╚╗╔╗╔═╗╚╝╚╝╚╗╔╗╔╗╔═╗╔╝╔╝╚═══════╝╔═╗╔╗║║╔═╝......
    ║║╚╝╚╗║.╚╗╔═╗╔╝╔╝╔╗║║║╚╝║║╔═╝╚═╗╚╝╔╗╔╗╚╝║╚╝▇╚╝▇╚╗║╚╗╔╝║║║║║║║╔╝╔═╝╚╗║╚╗╚╝║╚╗╚╝╚═╗╚╝╚╗║║║║╔╝╔═╗╔╗╚╝║║║╚╗║╚╗╚═╗╔═╗╔════╝.║║║╚╝╚╗.......
    ╚╝...║║..║║╔╝║.╚═╝╚╝║║╔╗╚╝╚╗╔══╝╔═╝╚╝╚╗╔╝▇╔╗▇╔╗╔╝╚═╝╚╗║║║║║║║╚╗╚══╗║║╔╝╔═╝╔╝▇╔╗▇║╔╗╔╝║║╚╝╚╗║▇║║║╔╗╚╝╚═╝╚═╝╔╗║║╔╝╚═══╗╔╗║║║╔══╝...╔╗..
    .....╚╝..╚╝║╔╝╔══╗╔═╝╚╝║╔╗╔╝║╔══╝╔╗╔═╗║╚══╝╚╗║║╚╗╔══╗╚╝║║║║║╚╗╚══╗║║║╚╗╚╗╔╝╔╗║╚╗╚╝║╚╗╚╝╔══╝║╔╝║║║╚═╗╔═════╝║║║║╔╗╔══╝║║╚╝╚╝╔╗.╔╗╔╝║..
    ...........╚╝╔╝╔╗╚╝╔══╗║║╚╝╔╝╚═══╝╚╝╔╝║╔╗╔═╗╚╝║▇╚╝▇╔╝╔═╝║║║║▇╚╗╔═╝║║╚╗║╔╝║▇║║╚╗║╔╗║╔╝╔╗╚╗╔╗║╚═╝║║╔═╝╚╗╔════╝╚╝╚╝║╚═══╝╚════╝╚╗║║║╔╝..
    .............╚═╝╚═╗║╔═╝║╚══╝╔╗.╔═╗╔╗║╔╝║╚╝▇║╔═╝╔╗▇╔╝╔╝╔╗║╚╝║╔═╝╚═╗║╚╗║║╚╗╚═╝╚╗║║║║║║╔╝╚╗╚╝╚╝╔╗▇╚╝╚═══╝╚═╗.╔══╗╔╗╚═════╗╔╗╔╗╔═╝║║║║╔╗.
    ..........╔╗╔═════╝║╚══╝.╔╗╔╝╚╗╚╗╚╝╚╝╚╗╚══╗╚╝╔╗║║╔╝╔╝▇║║║╔═╝╚╗╔══╝╚╗║║╚╗╚╗╔══╝║╚╝╚╝╚╝╔═╝╔╗╔╗║╚═════════╗╚═╝╔═╝║║╔╗╔╗╔╗╚╝╚╝╚╝.╔╝╚╝╚╝╚╗
    .......╔═╗║║╚══════╝.╔═══╝╚╝╔╗╚═╝╔╗╔═╗╚═══╝╔═╝╚╝╚╝╔╝╔╗║║║╚╗╔═╝╚╗▇╔╗║║╚╗╚═╝║▇╔╗║╔╗╔═╗╔╝╔╗║╚╝║║╔═╗╔═╗╔══╗║╔═╗╚╗╔╝║║╚╝╚╝╚═══╗.╔╗╚╗╔══╗╔╝
    .......╚╗╚╝║╔╗╔═╗╔══╗║╔═════╝╚═══╝╚╝╔╝╔╗╔╗▇╚═╗╔══╗╚╗║║║║║╔╝╚╗╔╗╚╗║╚╝╚╗╚╗╔╗╚═╝║║║║║╔╝╚╗║║╚╗╔╝╚╝╔╝║╔╝╚╗╔╝╚╝.╚═╝║╔╝║╔═══════╝╔╝╚═╝╚╗.║║.
    ........╚═╗║║║╚╗║╚═╗║╚╝╔╗╔══════════╝╔╝║║╚═╗▇╚╝╔╗╚╗╚╝╚╝╚╝║╔╗╚╝╚╗║║╔══╝▇╚╝╚╗╔═╝╚╝╚╝╚╗╔╝║╚╗║╚══╗║╔╝╚╗╔╝╚═══╗╔╗.║╚═╝╚═╗╔════╗║╔════╝.║╚╗
    ........╔═╝╚╝╚╗║╚══╝╚╗╔╝║╚═══════════╝╔╝║╔═╝╔═╗║║▇║╔════╗║║║╔╗▇║║║║▇╔╗╔╗╔═╝║╔╗╔╗▇╔╗║╚╗╚╗║║╔══╝╚╝╔╗╚╝╔╗╔══╝║╚═╝╔╗╔╗╔╝║╔═══╝║╚╗╔═╗╔╗╚═╝
    ........╚════╗║╚════╗║╚╗╚═══╗.╔══════╗╚╗║║╔╗╚╗╚╝║╔╝╚╗▇╔╗╚╝║║║╚═╝╚╝╚╗║║║║╚═╗║║║║╚╗║╚╝╔╝╔╝╚╝╚╗▇╔╗╔╝║╔═╝╚╝.╔╗╚╗╔═╝╚╝╚╝.║║╔╗╔╗║╔╝║╔╝║║...
    ........╔╗╔══╝╚═╗╔══╝╚═╝╔══╗╚╗╚═╗╔══╗║╔╝║║║╚╗╚═╗║╚╗╔╝╔╝║╔╗║║╚═══╗╔═╝║╚╝║╔═╝╚╝║╚╗║╚═╗║╔╝╔═══╝╔╝║║╔╝╚═════╝╚═╝╚═══════╝╚╝╚╝╚╝╚╗║║╔╝╚══╗
    ......╔╗║║╚════╗║╚══════╝╔╗╚╗╚═╗╚╝╔═╝╚╝╔╝╚╝╔╝▇╔╝╚═╝╚═╝╔╝║║║╚═╗╔═╝║╔═╝╔═╝╚══╗╔╝╔╝║▇╔╝║║╔╝╔══╗╚╗║║║╔═══════════╗╔═╗╔╗╔╗╔═╗╔╗╔╗╚╝╚╝╔═╗╔╝
    .....╔╝╚╝╚═════╝╚════════╝╚═╝╔╗╚═╗╚═╗╔╗╚═╗╔╝╔╗╚══╗╔═══╝╔╝║╚═╗║╚═╗║╚╗╔╝▇╔╗╔╗║║▇╚╗║╔╝╔╝║╚╗║╔═╝╔╝║║║╚══╗╔══════╗║║.╚╝║║╚╝.║║║║║╔╗╔═╝.╚╝.
    .....╚═══╗╔╗╔╗╔═╗╔╗╔╗╔═╗╔═╗╔═╝╚═╗╚══╝║║╔╗║║╔╝╚╗╔╗║╚╗╔═╗╚╗╚═╗║╚╗╔╝║╔╝║╔╗║╚╝║║║╔╗║║╚╗╚╗║╔╝║║╔╗╚╗╚╝╚╗╔╗╚╝╔═╗╔══╝╚╝╔═╗║╚══╗╚╝║║╚╝╚╝╔═╗...
    ......╔═╗╚╝╚╝╚╝╔╝║║║╚╝╔╝║.╚╝╔╗.╔╝╔╗╔╗║║║║║║╚╗╔╝║║║╔╝║╔╝▇╚═╗║║╔╝╚╗║║╔╝║║╚═╗║║║║║║║▇╚╗║║║▇║║║║▇║╔══╝║║╔╗╚╗║╚═════╝╔╝╚╗╔╗╚═╗║╚════╝╔╝...
    .╔╗╔══╝╔╝.╔═══╗╚╗║║║╔╗╚═╝╔╗╔╝╚═╝╔╝╚╝║║╚╝╚╝╚╗║║╔╝║║║╔╝║╔╗╔╗║║║╚╗╔╝║║║╔╝╚╗╔╝║║╚╝║║║╔╗║║║║╔╝║║║╔╝╚╗╔╗║╚╝║╔╝╚═╗╔╗╔══╝╔╗╚╝║╔═╝╚╗╔╗╔═╗╚╗...
    .║╚╝╔═╗║╔╗╚══╗║.╚╝╚╝║╚╗╔╗║╚╝╔═══╝.╔═╝╚═╗.╔╗║║║║.║║║║╔╝║║║║║║╚╗║║.║║╚╝╔═╝║.╚╝╔═╝║║║║║║║║║.║║║║╔═╝║╚╝╔═╝╚══╗║║║╚═══╝╚═╗║╚══╗║║║╚╗║╔╝...
    .╚╗╔╝╔╝╚╝╚╗╔╗║║╔══╗╔╝╔╝║╚╝╔╗║╔════╝╔╗╔╗╚╗║║╚╝║╚╗║║║║║╔╝║║║║╚╗║║║╔╝╚═╗║╔╗╚══╗╚═╗║║║║║║║║╚╗║║║║╚═╗╚═╗╚═╗╔╗╔╝╚╝╚╗╔╗╔╗╔═╝╚═══╝╚╝╚═╝╚╝....
    ..╚╝.╚══╗╔╝║║║║╚╗╔╝╚╗╚╗╚══╝║║║╔═══╗║║║║╔╝║╚══╝╔╝╚╝╚╝║╚╗║║║╚╗║║║║╚╗╔╗║║║╚╗╔╗╚╗╔╝║╚╝║║╚╝║╔╝║║╚╝╔═╝╔═╝.╔╝║║╚╗╔╗.║║╚╝║╚═══╗.╔════╗.......
    ...╔══╗╔╝║╔╝║║╚╗║╚═╗║╔╝╔═══╝║║╚═╗╔╝║╚╝║║.║╔╗╔╗╚══╗.╔╝╔╝║║╚╗║║║║╚╗║║║║║╚╗╚╝║╔╝╚╗╚╗╔╝╚╗╔╝║╔╝╚═╗╚═╗╚╗.╔╝╔╝╚╗╚╝╚╗║╚╗.╚═╗╔╗╚═╝╔╗╔═╝.......
    ...╚═╗╚╝╔╝╚╗╚╝╔╝╚═╗║║╚═╝╔╗╔═╝║╔╗║╚╗╚═╗╚╝╔╝║║║║╔══╝╔╝╔╝╔╝║╔╝║╚╝║╔╝╚╝║║║╔╝╔═╝║╔═╝╔╝║╔╗║╚╗║╚╗╔═╝╔═╝╔╝╔╝╔╝╔═╝╔══╝╚╗╚╗╔╗╚╝║╔╗╔╝║╚══╗......
    .....╚═╗║╔╗S╗╔╝..╔╝╚╝╔═╗║║║╔═╝║║╚╗╚═╗╚╗╔╝╔╝║║║╚═╗╔╝╔╝╔╝╔╝║╔╝╔═╝║╔╗╔╝║║╚╗╚╗╔╝║╔╗║.╚╝║╚╗╚╝.║╚╗╔╝╔╗╚╗║╔╝.║╔╗╚═══╗╚╗╚╝╚═╗╚╝╚╝.║╔══╝......
    ....╔══╝╚╝╚═╝║╔╗╔╝╔═╗╚╗║║║║╚╗╔╝╚╗║╔═╝╔╝╚═╝.╚╝╚╗╔╝║╔╝.║╔╝╔╝╚╗║╔╗╚╝║╚╗║║╔╝.║║╔╝║║║╔╗.║╔╝╔══╝╔╝╚╗║║╔╝║╚═╗╚╝╚═╗╔═╝╔╝╔╗╔╗╚═══╗.╚╝.........
    ....║╔╗╔╗╔╗╔╗╚╝╚╝╔╝.║╔╝╚╝║║╔╝║╔╗╚╝║╔╗╚═════╗.╔╝║╔╝║╔═╝║.╚╗╔╝╚╝║╔╗╚╗║║║╚═╗╚╝║╔╝║╚╝╚╗╚╝.╚══╗╚═╗║║║╚╗║╔╗╚═══╗║╚═╗╚═╝║║╚╗╔══╝╔╗.╔╗.......
    ....╚╝╚╝║║║║╚╗╔═╗╚╗╔╝╚══╗╚╝╚╗╚╝╚═╗╚╝╚╗╔═╗╔╗║╔╝╔╝║╔╝║╔╗║╔═╝╚═╗╔╝║║╔╝║║╚╗╔╝╔╗║╚╗╚╗╔╗╚══╗╔══╝╔═╝║║║╔╝║║╚╗╔═╗║║╔═╝╔═╗╚╝╔╝╚═══╝╚═╝╚═╗.....
    ......╔═╝║╚╝.║╚╗╚╗║╚╗╔═╗║╔══╝╔╗╔╗║╔══╝║.║║║║╚╗╚╗║╚╗║║╚╝╚╗╔═╗║╚═╝║║.║║╔╝║.║╚╝╔╝╔╝║╚╗╔╗║╚╗╔╗║.╔╝║╚╝.║║╔╝║.╚╝║║╔╗║╔╝╔╗╚╗╔╗╔══╗╔╗╔═╝.....
    ......║╔╗╚╗╔╗║╔╝╔╝╚╗║╚╗╚╝╚══╗║╚╝║║╚╗╔╗╚╗║║║╚╗╚╗║║╔╝║║╔═╗║║.╚╝╔══╝║╔╝║╚╗║╔╝╔╗║.╚╗╚╗║║║║.║║║╚╗╚╗╚══╗║║╚╗║╔══╝╚╝╚╝╚═╝║.╚╝╚╝..║║╚╝.......
    .....╔╝║╚╗║║╚╝╚╗╚╗╔╝║╔╝╔═╗╔╗║╚╗╔╝║.╚╝║╔╝╚╝║╔╝╔╝║║╚╗║║╚╗╚╝╚══╗╚══╗║╚═╝.╚╝╚╗║║╚╗╔╝╔╝║║╚╝╔╝║╚╗╚╗╚╗╔╗║╚╝.║║╚╗╔╗╔═╗╔╗╔╗╚═════╗.╚╝.........
    .╔╗.╔╝╔╝.║║╚╗╔═╝╔╝╚╗║╚╗╚╗╚╝╚╝╔╝╚╗║╔══╝╚══╗╚╝╔╝╔╝╚╗║║║╔╝╔═╗╔╗╚╗.╔╝╚═╗╔════╝║╚╗║╚╗║╔╝╚═╗╚╗║╔╝╔╝╔╝║╚╝.╔═╝║╔╝║║╚╗║║╚╝║╔╗╔═══╝............
    .║╚═╝╔╝..╚╝.╚╝╔═╝╔═╝║╔╝.╚╗╔╗╔╝╔╗║║║╔═╗╔══╝╔═╝╔╝..╚╝╚╝╚═╝╔╝║║╔╝╔╝╔╗╔╝╚═══╗╔╝.║╚╗╚╝╚╗╔═╝╔╝║╚╗╚╗╚╗║╔══╝╔╗║╚╗║╚╗║║╚═╗║║║╚═══╗............
    .╚═╗╔╝...╔╗╔═╗║╔╗║╔═╝║╔══╝║║║.║║║║║║╔╝╚══╗║╔╗║╔╗╔═══════╝╔╝╚╝.╚╗║║╚══╗╔═╝╚╗╔╝╔╝╔══╝╚═╗║╔╝╔╝╔╝╔╝║║╔═╗║║╚╗║╚╗║║║╔╗║║║║╔╗╔╗╚╗...........
    ...║║....║║╚╗╚╝║║║╚══╝╚╗╔╗║║╚═╝║║║║║╚╗╔╗╔╝╚╝║╚╝║╚═╗╔╗╔╗╔╗║.╔═══╝║╚╗╔═╝╚═╗╔╝║╔╝.╚══╗╔═╝╚╝.╚╗╚╗╚╗║╚╝.╚╝║╔╝║╔╝║║╚╝║║║║║║╚╝╚═╝...........
    ...╚╝...╔╝╚═╝╔═╝║║╔═╗╔═╝║║║║╔╗╔╝║║║║╔╝║║╚═╗.║╔╗╚═╗╚╝╚╝║║║╚╗╚╗╔═╗╚╗║║.╔╗.║╚╗║╚╗╔═══╝╚═════╗╚╗╚╗║╚══╗.╔╝╚╗║║╔╝╚╗.║║╚╝║╚════╗...........
    ........╚╗╔╗╔╝╔═╝╚╝╔╝╚═╗║╚╝║║╚╝╔╝║╚╝╚╗║║╔╗╚╗╚╝║╔═╝╔═══╝║║╔╝╔╝╚╗╚═╝║╚═╝╚╗╚╗║║╔╝╚═══╗╔╗╔╗╔╗╚╗╚╗║╚╗╔═╝╔╝╔╗║╚╝╚═╗║.║║╔═╝╔╗╔═╗╚╗..........
    .........╚╝╚╝.╚╗╔═╗╚╗..╚╝.╔╝║╔═╝╔╝╔══╝║║║╚╗╚═╗║╚═╗╚═══╗║║╚╗╚╗╔╝╔══╝╔═╗╔╝.║║║╚╗╔╗╔╗║║╚╝╚╝╚═╝.╚╝.║╚╗╔╝╔╝║╚═╗╔═╝╚╗╚╝╚╗╔╝╚╝.║╔╝..........
    .............╔═╝╚╗║╔╝.....╚╗║║╔╗╚╗║╔╗╔╝╚╝.╚╗╔╝║╔╗║╔═══╝║║╔╝.║║.╚╗╔╗║.║╚╗╔╝║║╔╝║╚╝╚╝╚═════╗╔════╝╔╝╚╗║╔╝╔═╝║╔╗╔╝...╚╝....╚╝...........
    .............╚═╗╔╝╚╝.......╚╝║║║╔╝║║║║...╔═╝╚╗║║╚╝╚╗╔╗╔╝║╚═╗║║╔═╝║║╚╗║╔╝║╔╝║║.╚══╗╔╗╔═╗╔═╝║╔═══╗║╔╗╚╝╚╗╚═╗║║║╚╗╔╗....................
    ..............╔╝║............╚╝║║.╚╝║╚╗..╚═╗╔╝║╚╗..╚╝║╚╗║╔═╝╚╝║╔╗║╚╗║║╚╗║║╔╝╚══╗╔╝║║║╔╝╚╗.╚╝╔══╝╚╝╚╗.╔╝╔═╝╚╝╚╗╚╝║....................
    ..............╚╗║..............╚╝...╚═╝..╔═╝╚╗╚═╝.╔══╝╔╝║╚═══╗╚╝║║╔╝║║╔╝║║║╔╗╔╗║╚═╝║║║╔╗╚══╗║╔═╗╔═╗╚╗╚╗╚═╗...╚═╗╚╗...................
    ...............╚╝........................╚╗╔╗║....╚══╗║╔╝╔═╗╔╝.╔╝║╚╗║║║╔╝║║║║║║╚══╗║║╚╝║╔╗╔╝╚╝.║╚╗║╔╝╔╝╔╗║.....║╔╝...................
    ..........................................╚╝╚╝.......╚╝║╔╝.╚╝..╚╗║╔╝║║║║╔╝╚╝║║║╔╗╔╝║║.╔╝║╚╝.╔══╝╔╝╚╝.╚╗║╚╝.....╚╝....................
    ......................................................╔╝╚╗......╚╝╚╗║╚╝║╚══╗╚╝╚╝║╚╗╚╝.╚╗╚╗..╚══╗║.╔╗╔═╝╚═══╗.........................
    ......................................................║╔╗║.........║║.╔╝╔╗╔╝....║╔╝....╚╗║.....║╚═╝║║╔╗╔══╗╚╗........................
    ......................................................╚╝╚╝.........╚╝.╚╗║║║.....╚╝......╚╝.....║╔═╗║╚╝║╚╗.╚═╝........................
    .......................................................................╚╝║║...................╔╝╚╗╚╝..║╔╝............................
    .........................................................................╚╝...................╚═╗║....╚╝.............................
    ..............................................................................................╔═╝╚╗..................................
    ..............................................................................................╚═══╝..................................
    
  • # j'ai adoré

    Posté par  . En réponse au message Advent of Code 2023 : Jour 10. Évalué à 2.

    Le labyrinthe de tuyaux change des labyrinthe classique.

    Cela m'a pris un peu (trop) de temps d'encoder les déplacements. Mais au final, ça se fait.

    Par contre la partie 2, je ne vois pas du tout comment procéder.

  • [^] # Re: Résolution péripatéticienne...

    Posté par  . En réponse au message Advent of Code 2023 : Day 9. Évalué à 2.

    Chapeau pour avoir fait le challenge depuis le phone. Moi qui passe par le PC pour un message de plus de trois lignes, j'aurai souffer.

  • # recursion

    Posté par  . En réponse au message Advent of Code 2023 : Day 9. Évalué à 3.

    Pour ma part, le jour le plus facile depuis le début

    import sys
    
    L = [list(map(int,l.split(' '))) for l in sys.stdin.read().splitlines()]
    
    def extrapolate(L):
        if all(a == 0 for a in L):
            return L+[0]
        M = [b-a for a,b in zip(L,L[1:])]
        return L+[L[-1]+extrapolate(M)[-1]]
    
    print(sum(extrapolate(l)[-1] for l in L))
  • [^] # Re: Découpage d'intervalles en Python

    Posté par  . En réponse au message Advent of Code 2023 : Day 5. Évalué à 2.

    Je crois que tu réponds à ta propre question. Au lieu de tourner pendant 10 minutes, cela aurait tourné pendant une poignée de secondes.

  • # sans PPCM, t'est cuit

    Posté par  . En réponse au message Advent of Code 2023, day 8. Évalué à 1.

    J'ai bien brûlé du CPU avant de comprendre qu'il fallait pas tout faire tourner en même temps mais juste calculer le nombre d'étapes de chaque fantôme puis de prendre leur PPCM.

    En 20 lignes de python:

    import sys
    from itertools import cycle
    from math import lcm
    
    I, _, *P = [l for l in sys.stdin.read().splitlines()]
    # BCN = (HFN, KFC)
    # 0123456789012345678
    P = {l[0:3]:(l[7:10],l[12:15]) for l in P}
    
    G = [p for p in P.keys() if p[2] == 'A']
    R = []
    for g in G:
        C = g
        N = 0
        for i in cycle(I):
            if C[2] == 'Z':
                break
            C = P[C][i == 'R']
            N += 1
        R.append(N)
    print(lcm(*R))
  • [^] # Re: Découpage d'intervalles en Python

    Posté par  . En réponse au message Advent of Code 2023 : Day 5. Évalué à 2. Dernière modification le 08 décembre 2023 à 16:09.

    Je te confirme.

    Après une partie 1 torchée en cinq minutes, j'ai eu la flemme d'écrire les algo d'intersection. J'avais laissé de côté.

    Puis j'ai quand même tenté en brute force (vraiment crassouille d'itérer sur une range de plusieurs millions). Mais en compilant le programme, réponse en 7 minutes.

    J'aurai fait ça à l'ouverture du challenge, j'aurai tapé le top 100 :D

  • # en mode brute, et c'est passé

    Posté par  . En réponse au message Advent of Code 2023, day 6. Évalué à 2. Dernière modification le 08 décembre 2023 à 16:02.

    j'ai énuméré toutes les unités de temps.

    import sys
    
    (t,r) = (int(sys.argv[1]), int(sys.argv[2]))
    
    print(
            # i : time of charging, between 0 and t
            # v = i # speed in m/s
            # d = v * (t-i)  # distance = speed * remaining time
            sum(i*(t-i) > r for i in range(t))
    )

    je pensais que ça allait coincer pour la partie 2, car ça sentait le gros chiffre pour exploser le cpu ou la mémoire.
    mais il n'est est rien.

  • [^] # Re: excusez ma naïveté

    Posté par  . En réponse au journal Périphérique d'authentification TOTP. Évalué à 4.

    donc son mobile poll une URL et si elle a un truc à envoyer c'est le mobile qui l'envoie.

    roo, malin

    faut rester sous le radar de l'opérateur parce que t'es pas sensé utiliser ton forfait pour un usage pro mais j'imagine que la barre de détection est haute.

  • [^] # Re: excusez ma naïveté

    Posté par  . En réponse au journal Périphérique d'authentification TOTP. Évalué à 4.

    pourquoi ne pas utiliser le bete 2FA par sms?

    parce qu'il faut donner son numéro de téléphone et moi, je veux pas.

    et pourquoi vouloir absolument un TOTP/appli mobile sur… des sites de développement?

    pour éviter de se faire voler son compte.

  • [^] # Re: horloge interne se dérègle

    Posté par  . En réponse au journal Périphérique d'authentification TOTP. Évalué à 4.

    Time sync Yes¹
    ¹ - Time synchronization is performed using one of the USB configuration tools. The expected time drift is between 1 and 30 seconds per year (depending on ambient temperature), and a periodic sync of the system clock may be required (i.e., every 1 or 2 years, depending on the drift tolerance of the authentication system).

    _

    Oui, le constructeur m'a sorti la même excuse,

    Tu veux dire qu'ils ont ajouté cette note après ton achat et ta réclamation ?

    Dans tous les cas, merci pour ton journal qui rappelle qu'il faut se méfier de ce qu'on peut acheter.

  • [^] # Re: Le bon token et le mauvais token

    Posté par  . En réponse au journal Périphérique d'authentification TOTP. Évalué à 3.

    Idem, c'est juste bien caché. On en parlait ici.

  • # horloge interne se dérègle

    Posté par  . En réponse au journal Périphérique d'authentification TOTP. Évalué à 7. Dernière modification le 03 décembre 2023 à 14:28.

    C'est le cas de toute horloge (non connectée au réseau).

    J'ai une Pebble que j'adore mais je ne m'en sers pas en mode connecté car je ne veux pas être enquiquiné par les notifications.
    Je dois néanmoins la connecter régulièrement pour qu'elle se recale. Je note un décalage après quelques semaines. En arrière qui plus est, ce qui est pénible car risque de mettre en retard. D'ailleurs Wikipedia mentionne un décalage d'environ 1s/jour.

    Or le TOTP tourne toutes les 30 secondes et les systèmes ont généralement une tolérance de quelques codes (quelque ~= 1). C'est pour ça que tu constate que seulement certains se dérèglent, c'est simplement qu'ils n'ont pas la même tolérance vis-à-vis des codes trop en retard ou trop en avance. Donc un appareil TOTP doit être remis à l'heure environ tous les 30 jours.

  • [^] # Re: Elm

    Posté par  . En réponse au lien Un langage de plus : Roc. Évalué à 2.

    C'est là que le typage intervient

    Prend la fonction map par exemple.

    map arg1 arg2

    Pas évident de savoir ce que son arg1 et arg2.

    Si je te donne le type de cette fonction

    map : (a -> b) -> List a -> List b

    Tu comprends que map prend une fonction qui transforme un a en b, l'applique à une liste de a pour faire une liste de b.

    Et ton IDE (moi j'utilise helix avec elm-language-server) va t'aider en te mettant un tooltip avec le type.

  • [^] # Re: debian

    Posté par  . En réponse au lien No Bing, no Edge, no upselling: De-crufted Windows 11 coming to Europe soon. Évalué à 2.

    Je vois l'idée.
    Pour ma part j'ai arrêté de faire du support ouinouin pour mes proches.
    Je trouve bien plus rentable pour eux et moi de les basculer sur linuxmint.