J'en suis certain que ma code ne soit pas optimale,
Changement de tactique, et ca s'optimise un peu mieux.
On prends comme input un rapport, une liste des divisions voulu, et des rangees de trous qu'on en as deja.
On genere une liste de rangées de trous possibles, c'est a dire de 1 au division maximum, histoire de pouvoir faire tous les divisions, et on enleve celles qu'on a pre-decidé si necessaire.
Du liste de divisions, on enleve celles qui sont facteur du rapport - ils peuvent etre diviser par n'import lequelle rangée de trous, ou deja fourni par nos rangees pre-existants.
Le parti suivant est repetée jusqu'au moment qu'l ne reste aucun division a resoudre.
Maintenant un cree une liste qui, pour chaque division restant, enumere les rangées donnant le possibilité de faire ce division.
Y a maintenant 2 cas possibles:
1 - il existe un ou plusiers divisions faisable par seulement une rangée de trous. On ajout ce / ces rangee au list des rangees utilisées, les enleve du liste de rangees possibles, et on enleve tous les divisions faisables par ces rangees du liste des divisions restants a resoudre, et on recommence
2 - chaque division restant peut etre resolu par plusiers rangees de trous restants. On donne un valeur a chaque rangee de trous restant, on prends celle ave le valeur le plus haut, ajout a la liste de celles utilisee, enleve du liste des rangees restnt, enleve, bien sur, les divisions possibles avec ce rangee des divisions restant a resoudre, et on recommence.
C'est le valeur a donner aux rangees qui peut changer le tout. Pour l'instant je prends toujours la nombre de divisions restant resolu par ce rangee de trous. Pour un rapport 40:1 et en voulant tous les divisions de 1 a 40, ca me donne 11 rangees de trous au lieu de 12 avant:
> (rings-for-divisions 40 (iota 40 1) '())
(17 19 20 21 23 27 29 31 33 37 39)
>
Et puis ca deviens peut-etre utile pour un question posé plus haut, c'est a dire celle de
@barbacane en message #58
Je suis étonné qu'il y ait des divisions qui semblaient simples qui ne sont pas réalisables, notamment 25, 35, 50, 55, 65, 70, 75, 85, 95, 100, 105, 110, 115, 125
OK, quelles rangees pour en avoir tous les multiples de 5 jusqu'au 150?
> (let ((divisions '(5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 125 130 135 140 145 150))
(myrings '(15 16 17 18 19 20 21 23 27 29 31 33 37 39 41 43 47 49)))
(lset-difference = (rings-for-divisions 72 divisions myrings) myrings))
(35 55 65 85 95 115 125 145)
8 rangees de plus. Evidemment, 72 n'est pas un rapport tres commode.
Le program.