steph1978 a écrit 2960 commentaires

  • [^] # Re: backup

    Posté par  . En réponse au lien Pypy passe à Git + Github. Évalué à 3.

    C'est vrai.

    J'ai pas de leçon à donner à un projet comme pypy mais j'aurai plutôt fait un miroir fermé sur GH avec message disant "viendez sur notre forge" (gitea, gitlab, forgejo younameit) quitte à proposer un social login GH pour les contributeurs qui ne veulent pas créer un nouveau compte.

  • [^] # Re: Besoin de précisions

    Posté par  . En réponse au message faire des jeux de cartes en ligne. Évalué à 4. Dernière modification le 03 janvier 2024 à 00:39.

    Je dirai que ce qui se rapproche le plus est le serveur libre de jeu de carte que je vais auto-héberger et jouer avec mes amis.

    Mais si il faut coder, pas de soucis. J'aimerai juste ne pas partir de rien et ne pas passer à côté d'un projet FOSS auquel je pourrais contribuer au lieu de ramer seul.

  • # backup

    Posté par  . En réponse au lien Pypy passe à Git + Github. Évalué à 7.

    Triste constat de réalité : difficile d'échapper à l'hégémonie de GH pour attirer des contributions.

    Pensez juste à backuper le project GH. Je parle pas du repo en lui même qui est par nature décentralisé mais des issues, PR, discussions, wiki.

    Trop de repo ont été retirés par GH sur une décision arbitraire de MS/GH ou du gov US.

  • [^] # Re: Eur0p3 4 Ev3r

    Posté par  . En réponse au lien Japan to crack down on Apple and Google app store monopolies - OSnews. Évalué à 2.

    De très loin aussi. Mais quand je vois ce qui sort, je me dis que le plus fort, c'est pas le législateur mais les lobbies et des fois le lobby des consommateurs.

  • [^] # Re: Détail du staff actuel et passé

    Posté par  . En réponse au lien p3ter reprend la direction de PluXml après l'intérim de bazooka07 + v5.9 RC dispo à fins de test !. Évalué à 2.

    Perturbant ce "About" qui ne dit pas ce que le logiciel fait.
    C'est un CMS ou un SSG, c'est ça ?

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