Le Problème

Imaginez un cadran circulaire (comme un cadenas à combinaison) avec 100 positions numérotées 0 à 99. Le cadran commence à pointer à 50.

Vous recevez une séquence d'instructions de rotation :

  • L = tourner à gauche (vers des nombres inférieurs)

  • R = tourner à droite (vers des nombres supérieurs)

  • Le nombre suivant indique combien de "clics" à tourner

Parce que le cadran est circulaire :

  • Aller à gauche depuis 0 revient à 99

  • Aller à droite depuis 99 revient à 0

Partie 1 : Compter les Positions Finales à Zéro

Objectif : Comptez combien de fois le cadran atterrit sur 0 à la fin d'une rotation.

dial = (((dial + sign * distance) % range) + range) % range;

La Formule de Retour Modulo

Cette formule gère l'arithmétique circulaire :

  1. dial + sign * distance → Calculez la nouvelle position brute

    • sign est -1 pour la gauche, +1 pour la droite

  2. % range → Le premier modulo l'amène dans la plage, mais il peut être négatif !

    • Exemple : (5 - 10) % 100 = -5

  3. + range → Ajoutez 100 pour gérer les résultats négatifs

    • -5 + 100 = 95

  4. % range → Le modulo final garantit que nous sommes dans [0, 99]

    • Si le premier résultat était positif, cela annule l'extra + range

Pourquoi cela fonctionne : En JavaScript, -5 % 100 retourne -5, et non 95. Le truc du double modulo garantit que nous obtenons toujours un résultat positif dans la plage valide.

Partie 2 : Compter Chaque Clic à Travers Zéro

Objectif : Comptez chaque fois que le cadran passe par 0, pas seulement quand il s'y arrête.

C'est la partie délicate ! Si vous êtes à la position 50 et que vous tournez L200, vous passerez par 0 deux fois.

L'Insight Clé : Calculer la Distance jusqu'au Premier Zéro

const firstZero =
    dial === 0 ? range : direction === "L" ? dial : range - dial;

Position Actuelle

Direction

Distance jusqu'au Premier Zéro

dial = 50

Gauche (L)

50 clics (50→49→...→1→0)

dial = 50

Droite (R)

50 clics (50→51→...→99→0)

dial = 0

Les deux

100 clics (rotation complète nécessaire)

Exemple visuel allant à gauche depuis 50 :

50 → 49 → 48 → ... → 2 → 1 → [0]

Exemple visuel allant à droite depuis 50 :

50 → 51 → 52 → ... → 98 → 99 → [0]

Compter Tous les Passages par Zéro

if (distance >= firstZero) {
    zeroCount += Math.floor((distance - firstZero) / range) + 1;
}

La logique :

  1. Vérifiez si nous atteignons même zéro : distance >= firstZero

    • Si nous ne voyageons pas assez loin, nous n'atteignons jamais zéro

  2. Comptez les passages :

    • +1 → Nous avons définitivement atteint zéro au moins une fois (au firstZero)

    • (distance - firstZero) / range → Après le premier zéro, combien de rotations complètes de 100 clics s'adaptent ?

    • Chaque rotation complète = un passage de plus à zéro

Exemple : Position 50, instruction L250

  • firstZero = 50 (distance pour atteindre 0 en allant à gauche)

  • distance = 25050 ✓ nous allons atteindre zéro

  • Reste après le premier zéro : 250 - 50 = 200

  • Rotations complètes : Math.floor(200 / 100) = 2

  • Total de zéros : 2 + 1 = 3 🎯

Start at 50
├── 50 clicks left → hit [0] (1st time)
├── 100 more clicks → hit [0] (2nd time)  
├── 100 more clicks → hit [0]

Résumé

Partie

Question

Stratégie

1

Combien de fois atterrissons-nous sur 0 ?

Simple : vérifiez dial === 0 après chaque mouvement

2

Combien de fois passons-nous par 0 ?

Calculez la distance jusqu'au premier 0, puis comptez les rotations complètes