Bonjour, voici un petit atelier (vaguement inspiré par le billet Lucky numbers d’informaticienzero) pour se creuser la tête. Je n’ai pas trouvé de nom à lui donner, il porte donc le nom qu’il porte.
A propos de porte, cet atelier traite d’escaliers.
Le programme à réaliser
On vous donne deux nombres entiers, a
et b
, a < b
.
Votre programme affiche / retourne une liste d’étapes pour aller de a
à b
. Ces étapes consistent à partir de a
et aller vers le multiple de 10 supérieur ou d’ordre supérieur, puis inférieur jusqu’à atteindre b
.
Vous n’avez pas compris ? Moi non plus. Quelques exemples :
a: 27, b: 399
:
1 2 3 4 5 | 27, 30 (hop, c'est tout rond) 30, 100 (le multiple de 10 d'ordre supérieur !) 100, 300 (on doit pas dépasser `b`…) 300, 390 (on s'en approche) 390, 399 |
a: 1562, b: 62351
:
1 2 3 4 5 6 7 8 9 | 1562, 1570 1570, 1600 1600, 2000 2000, 10000 10000, 60000 60000, 62000 (et paf on redescend par la gauche) 62000, 62300 (toujours plus près) 62300, 62350 (de toi) 62350, 62351 |
a: 5162, b: 6235
:
1 2 3 4 5 6 | 5162, 5170 5170, 5200 5200, 6000 6000, 6200 6200, 6230 6230, 6235 |
Vous comprenez le principe. (C’est un ordre.)
Soyez créatifs, c’est un problème à ma connaissance 100% original, pas très difficile, pas tout à fait trivial non plus.
Pour les débutants
- Ne traitez pas tous les cas d’un coup si vous avez de la peine. Prenez une partie du problème et avancez petit à petit vers une solution globale à base de prendre des petits bouts de trucs et puis les assembler ensemble.
- Versionnez vos essais et aidez-vous d’une suite de tests que vous lancez régulièrement. Ça vous évitera de régresser. Il est facile de régler un problème en cassant un autre, ici comme dans du code plus sérieux qu’un petit défi.
Pour les moins débutants
Faites une solution élégante et lisible. Ou dans un langage obscure. Ou dans un langage pas obscure mais dans un autre paradigme que celui auquel vous êtes habitué (si vous êtes très OO essayez une approche fonctionnelle, si vous êtes très fonctionnel, faites-le de façon 100% impérative) ?
et encore
- Ce topic est inspiré de l’Atelier de Noël) de SpaceFox.
- La façon dont votre programme prend
a
etb
en entrée n’est pas importante, le formatage de la sortie n’est pas important non plus tant que c’est lisible. - Des données de test sont disponibles ci-dessous
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | expect(steps(99, 101)).toEqual([ [99, 100], [100, 101], ]) expect(steps(27, 399)).toEqual([ [27, 30], [30, 100], [100, 300], [300, 390], [390, 399], ]) expect(steps(2, 399)).toEqual([ [2, 10], [10, 100], [100, 300], [300, 390], [390, 399], ]) expect(steps(1, 11)).toEqual([ [1, 10], [10, 11], ]) expect(steps(9, 19)).toEqual([ [9, 10], [10, 19], ]) expect(steps(11, 18)).toEqual([ [11, 18], ]) expect(steps(11, 31)).toEqual([ [11, 20], [20, 30], [30, 31], ]) expect(steps(0, 100)).toEqual([ [0, 10], [10, 100], ]) expect(steps(1562, 62351)).toEqual([ [1562, 1570], [1570, 1600], [1600, 2000], [2000, 10000], [10000, 60000], [60000, 62000], [62000, 62300], [62300, 62350], [62350, 62351], ]) expect(steps(5162, 6235)).toEqual([ [5162, 5170], [5170, 5200], [5200, 6000], [6000, 6200], [6200, 6230], [6230, 6235], ]) |
[edit] Quête annexe : donner une description formelle de la consigne.