steph1978 a écrit 3345 commentaires

  • [^] # 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.

  • [^] # Re: Toujours comparer avec les patates

    Posté par  . En réponse au lien Les 1 % les plus riches émettent autant de gaz à effet de serre que les 66 % les plus pauvres. Évalué à 2.

    On a vraiment l'économie la plus fragile de l'histoire pour avoir aussi peur de la contrôler ?

    Tout à fait. Surtout que quand les entreprises ont été dans la mouise pendant la pandémie, elles n'ont pas refusée la manne publique au nom du quoi qu'il en coûte.

  • # moi aussi j'ai rien compris

    Posté par  . En réponse au lien Free n'a rien compris : son agence de publicité appelle au vandalisme de Wikipédia. Évalué à 2.

    Reef c'est Free ? ou c'est de blagueurs qui n'ont rien à voir avec Iliad ?

  • # debian

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

    Moi aussi j'ai "decrufted" mon windows, au point d'enlever l'OS et de mettre une Debian.

    Entièrement satisfait !

  • [^] # Re: Elm

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

    Pour compléter la réponse de Andréas,

    Si je prends le hello world de Elm

    module Main exposing (..)
    
    import Html exposing (text)
    
    
    main =
        text "hello world"

    Le compilateur génère - après optimisation - un fichier JS de 17ko qui embarque le runtime et le code applicatif transformé en JS.

    [3590 lines omitted]
    var $elm$json$Json$Decode$map = _Json_map1;
    var $elm$json$Json$Decode$map2 = _Json_map2;
    var $elm$json$Json$Decode$succeed = _Json_succeed;
    var $elm$virtual_dom$VirtualDom$toHandlerInt = function (handler) {
            switch (handler.$) {
                    case 0:
                            return 0;
                    case 1:
                            return 1;
                    case 2:
                            return 2;
                    default:
                            return 3;
            }
    };
    var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text;
    var $elm$html$Html$text = $elm$virtual_dom$VirtualDom$text;
    var $author$project$Main$main = $elm$html$Html$text('hello world');

    Et cela s'intègre dans une page HTML comme ceci :

    <!DOCTYPE HTML>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>Main</title>
      <style>body { padding: 0; margin: 0; }</style>
      <script src="elm.js"></script>
    </head>
    <body>
    <div id="elm"></div>
    <script>Elm.Main.init({ node: document.getElementById("elm") });</script>
    </body>
    </html>
  • [^] # Re: Elm

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

    Par contre, le code Elm n'est pas compatible Node.js,

    Exact. Je crois que cela fonctionnait sur les version avant la 0.19 mais je ne faisais pas de Elm à l'époque. Et il était alors possible de faire du backend en Elm. Pour simplifier encore plus le langage et son usage, le BDFL a décidé de supprimer cette possibilité. Et c'est ce manque que veut tenter de combler Roc.

  • [^] # Re: Elm

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

    On peut douter de la capacité d'elm a tuer js, mais ce qu'il apporte me parait indéniable.

    Tout à fait d'accord. JS a un énorme écosystème et énormément de pratiquants, il ne sera pas remplacé de sitôt. Et ELM ne sait pas tout faire. Mais pour tout ce que ELM sait faire : réagir à des événements pour transformer un modèle et en faire un rendu DOM, c'est du bonheur. Et la communauté est top.

    J'ai hâte d'expérimenter ce qu'est capable de faire Roc.

  • [^] # Re: Utile pour certains services, mais loin d'être au niveau de Firefox

    Posté par  . En réponse au lien Google Chromium – Le diable est dans les détails et ce projet les élimine (Korben). Évalué à 3.

    J'ai exactement le même usage : un profile FF aux petits ognons affiné depuis deux décennies, si ça passe pas un profile FF plus tolérant mais que je nettoie après ; si ça passe pas, j'enrage et le lance un chromium que je nettoie après.

    À part cet usage, lié au lobbying/marketing de google, je ne vois d'ailleurs pas l'intérêt de Chrome(-ium).

  • [^] # Re: Toujours comparer avec les patates

    Posté par  . En réponse au lien Les 1 % les plus riches émettent autant de gaz à effet de serre que les 66 % les plus pauvres. Évalué à 6.

    pour en être convaincu ?

    On peut en tout cas facilement être convaincu du contraire : les patates étant un aliment économiquement accessible, on peut émettre l'hypothèse que 99% des pauvres mangent plus que 99% des patates produites ne laissant ainsi au 1% les plus riches moins de 1% des patates. Heureusement qu'ils peuvent se rattraper sur le caviar.

    Cela dit, je ne vois pas le rapport avec la choucroute si ce n'est qu'il y a aussi des patates.

  • [^] # Re: complément

    Posté par  . En réponse au lien Privacy is Priceless, but Signal is Expensive. Évalué à -1. Dernière modification le 17 novembre 2023 à 10:24.

    Et quel est l'intérêt de vouloir absolument récupérer le numéro de téléphone de l'utilisateur ?

    Je croyais d'ailleurs que Signal avait travaillé à permettre de créer un compte sans numéro de téléphone.

    Sinon, en quoi est-ce bien différent d'un service propriétaire style Telegram ?

  • [^] # Re: complément

    Posté par  . En réponse au lien Privacy is Priceless, but Signal is Expensive. Évalué à 1. Dernière modification le 17 novembre 2023 à 08:43.

    We use third-party services to send a registration code via SMS or voice call in order to verify that the person in possession of a given phone number actually intended to sign up for a Signal account.
    […]
    We use third-party services to send a registration code via SMS or voice call in order to verify that the person in possession of a given phone number actually intended to sign up for a Signal account.

    Remplacent le SMS/Phonecall par TOTP et ils économisent $6M.

    À votre service.