• [^] # Re: Pas d'exemple

    Posté par (Mastodon) . En réponse au message Advent of Code 2023, jour 20. Évalué à 3.

    C'est pas hyper simple à représenter, mais je vais essayer.

    button
    
    broadcaster
     
    ├→hd  lt  rh  gx  xf  tg  ks  tc  qz  rl  pf  pr
     │↑           
     │╰───┌─────────────────────────────────────────────────┐ ┌──┐
     ╰───→│ nl │→│cq│──╮
     └─────────────────────────────────────────────────┘ └──┘ 
     
    ├→zj  kn  xn  gf  gv  vr  qb  hq  nx  bs  rd  vs 
     │↑            
     │╰───┌─────────────────────────────────────────────────┐ ┌──┐ ┌──┐
     ╰───→│ pb │→│vp│→│ 
     └─────────────────────────────────────────────────┘ └──┘  
      
    ├→sq  vh  qc  gp  cp  jt  kb  hj  cf  jg  pd  mt ns│→rx
     │↑             
     │╰───┌─────────────────────────────────────────────────┐ ┌──┐  
     ╰───→│ rr │→│rv│→│ 
     └─────────────────────────────────────────────────┘ └──┘ └──┘
     
    └→jz  ht  jv  zs  dq  jc  xv  dx  fq  xz  zp  mm 
     │↑            
     │╰───┌─────────────────────────────────────────────────┐ ┌──┐ 
     ╰───→│ dj │→│dc│──╯
     └─────────────────────────────────────────────────┘ └──┘

    On va dire qu'un « low pulse » est un 1, et un « high pulse » un 0.
    C'est plus simple pour comprendre.

    Le button envoie un 1 quand on appuie dessus.
    Le broadcaster transmet ce qu'il a reçu à toutes ses destinations.

    Les noms simples, en deux lettres, sans cadre, sont des alternateurs, s'ils reçoivent un 1, ils envoient une fois un 1, et une fois un 0. Mais s'ils reçoivent 0 ils bougent pas.
    À l'état initial ils enverront un 0 au premier 1 reçu.
    Donc notre broadcaster étant relié à des alternateurs, au repos il ne se passe rien, mais quand on appuie sur le gros bouton rouge, il active les quatre alternateurs devant lui.

    Les noms dans les cadres sont des boîtes de remise à zéro, en gros.
    Au début elles sont configurées sur 1 à toutes leurs entrées, mais c'est mis à jour dès qu'elles reçoivent un truc.
    Si toutes leurs entrées sont à 0, alors elles envoient un 1 à toutes leurs sorties ! Sinon, c'est un 0, qui sera ignoré par tous les alternateurs connectés. D'où le nom de boîte de remise à zéro, ça ne va envoyer 1 aux alternateurs que quand ça reçoit du 0 de partout à la fois !

    Quand ça arrive, les boîtes à droites reçoivent un 1 et donc envoient un 0, sinon elles reçoivent un 0 et envoie un 1.
    Avec une seule entrée, ce sont des inverseurs.

    Donc quand nos grosses boîtes s'activent et réussissent à envoyer un 1, le signal est inversé en 0 vers la boîte finale.
    Si toutes les quatre grosses boîtes envoient un 1 en même temps, alors la boîte finale reçoit quatre 0.
    À ce moment là elle va envoyer un 1 vers rx, qui est notre module de sortie et qui n'attends que ça !

    Franchement, une fois représenté comme ça, le problème il est hyper clair hein ?
    Faut trouver le moment où chacune des grosses boîte s'active.

    Là, on a grosso-modo tous fait une simulation : on part de l'état initial, chaque alternateur va envoyer un 0, et les grosses boîtes sont sur 1 dans toutes leurs entrées, et on appuie sur le gros bouton rouge, jusqu'à ce que les boîtes s'activent.

    Là on note quand c'est arrivé.
    Typiquement on va continuer pour voir quand ça va se produire à nouveau, pour chaque boîte, et essayer de déduire un schéma.
    Ici c'est facile, en fait, dès la première fois que ça s'active, on a fait un cycle et c'est retour à l'état initial, en fait pas tout à fait, mais au moins ça boucle sur la même durée.
    On a donc 4 cycles, il ne reste plus qu'à les coordonner, savoir quand est-ce qu'ils vont s'activer tous ensemble.
    Et le plus petit multiple commun aux quatre valeurs mesurées est notre réponse.

    Maintenant en poussant l'analyse.
    Notre série par exemple de la première boîte, consiste en 12 alternateurs, tous éteints donc prêts à envoyer 0.
    On va noter ça 000000000000.
    La boîte n'enverra absolument rien tant qu'on ne l'aura pas activée (enfin, elle envoie des 0 qui sont ignorés par les alternateurs).
    Si on appuie, le premier va s'allumer, et envoyer 0, qui va être ignoré, on est donc dans cette situation :
    100000000000.
    Au second coup, notre premier alternateur va s'éteindre, repasser à 0, mais aura envoyé un 1 à droite, sur le second, qui va s'allumer et envoyer 0 qui sera ignoré.
    01000000000
    Au 3ème coup, on rallume le premier, rien d'autre ne bouge : 110000000000.
    4 : 0010000000
    5 : 1010000000
    6 : 0110000000
    7 : 1110000000
    Ok peut continuer la simulation, mais il apparaît comme évident qu'on est en train de compter. On a exactement la représentation binaire, mais de gauche à droite, des numéros des étapes.

    Là on va regarder notre boîte nl, et constater qu'elle va s'activer dès qu'elle reçoit 0 en même temps de la part de hd, rh, tg, qz, rl, pf et pr, ce qui va arriver quand il vont tous s'être allumés (passer de 0 à 1) comme dernière action.
    Ça arrive dès qu'on a 1 sur chacun d'entre eux, et 0 sur les autres, c'est la première fois où ça va se produire et c'est cette configuration : 101001001111 qu'on retourne en 111100100101 pour avoir le chiffre binaire 3877, qu'on retrouve bien dans mes résultats plus haut.
    Pour les autres, on va simplement lire 111000001111 soit 3847, 110010111111 soit 4051, et enfin 101010110111 soit 3797.

    Diantre c'est juste.
    Là nos nombres sont premiers entre eux, donc le PPCM vaut la multiplication des 4 soit... beaucoup.

    Mais bref, voilà le problème entièrement décortiqué, et finalement une lecture directe des chiffre à trouver, sans aucun calcul, sans besoin d'ordinateur, sauf pour le PPCM (c'est un peu misérable à la main avec des chiffres aussi gros quand même).

    Merci de ta question Ysabeau, je n'aurais pas poussé autant sinon :)

    Pour continuer un petit peu, sur notre exemple 1.
    On active sur 101001001111 mais à ce moment là notre boîte ne se contente pas d'envoyer un 1 vers la sortie, elle envoie aussi un 1 vers tous nos 0 !
    En effet, tous les alternateurs qui n'envoient pas vers la boîte, reçoivent de la boîte.
    Ils sont éteints, ils vont donc s'allumer, envoyer des 0 qui seront ignorés et passer tous à 1 : 111111111111 = 4095.
    Sauf que le tout premier reçoit lui aussi un 1, exactement comme si on avait appuyé sur le bouton une fois tout passé à 1 !
    C'est hd, et il est bien en dernier de la liste des alternateurs activés par nl. On lui envoie un 1 qui va faire s'éteindre tous les alternateurs en chaîne, puisqu'ils envoient un 1 en s'éteignant. Ils vont donc tous avoir envoyé un 1 vers la boîte (ceux qui sont connectés) qui verra bien son état retourner à celui d'origine.
    D'où la boucle et le cycle qui recommence exactement à zéro, on est effectivement retourné précisément à l'état initial.
    On a compté de 0 à 3877, et au moment d'arriver à 3877, on a une remise à 0 avec un signal envoyé vers la sortie.

    • Yth.