OVH Cloud OVH Cloud

Casse-Tête

43 réponses
Avatar
B. Neve
Bonsoir à tous,

Petit casse-tête entre amis...

Je voudrais dans une appli obliger de choisir une quantité qui doit être une
combinaison d'emballages possibles.

Comme chacun sait qu'un bon exemple vaut tous les discours...

J'ai des assiettes que je peux conditionner par 15, 25, 40. Dans une
rubrique texte, on met alors
25/15/40 pour dire que 25 sera la quantité par défaut et les autres des
alternatives.
On peut bien évidemment mélanger plusieurs emballages...

Quels quantités sont valides ?

10 non... ne correspond à aucun conditionnement
15 oui facile
20 non, 1 x 15 puis ???
30 oui, 2 x 15
45 oui, 3 x 15
48 non
50 oui, 2 x 25
55 oui, 2 x 15 + 1 x 25
60 oui, 4 x 15
65, oui 1 x 40 + 1 x 25 ou 2 x 25 + 1 x 15
69, non
... Et ainsi de suite

Comment feriez vous une fonction qui me renverrait Vrai/Faux en lui envoyant
2 paramètres : "Quantité" (60) et "chaine de conditionnement" (25/15/40)

Des remerciements en pagaille au premier qui trouve la sympathique fonction.

B. Nève
nospam-bne@dagico.com

10 réponses

1 2 3 4 5
Avatar
Roumegou
Ben Voyons !
Encore un qui prend des libertés avec l'énoncé ;-)
Le monsieur t'as dit 25/15/40 et pas 20/15/40 et ça marche pas ta solution
nananère heu !
Eric Roumegou

Eric LAURENT wrote:
Ouups ! petit correctif: (au fait, j'ai gagné quelque chose ? -
peut-être Windev 8 gratuit ou la 7.5 enfin deboggée !)



juste le droit de rejouer rofl

------------------------------------------------------------

QuantiteTotale est un entier //A livrer
Cond40 est un entier //Conditionnement par 40
Cond20 est un entier //Conditionnement par 20
Cond15 est un entier //Conditionnement par 15

Reste1 est un entier
Reste2 est un entier
Reste3 est un entier

QuantiteTotaleG80

Cond40= PartieEntière(QuantiteTotale/40)
Reste1= modulo(QuantiteTotale,40)

SI modulo(Reste1,20)>0 ALORS
SI modulo(Reste1,15)>0 ALORS
Erreur("Erreur de conditionnement","Vous devez compléter votre
commande d'au moins "+ (15-Reste1)+" produits")
RETOUR
SINON
Cond15= PartieEntière(Reste1/15)
FIN
SINON
Cond20= PartieEntière(Reste1/20)
FIN

Info("Votre commande sera conditionné avec "+RC+...
Cond40+" cartons de 40"+RC+...
Cond20+" cartons de 20"+RC+...
Cond15+" cartons de 15")


Avatar
Eric LAURENT
C'était pour vour si vous suiviez .... (lol)
Si vous voulez du tout cuit, essayez cela, réponse à 100% du cahier des
charges:

----------------------------------------------------

QuantiteTotale est un entier //A livrer
Cond40 est un entier //Conditionnement par 40
Cond25 est un entier //Conditionnement par 25
Cond15 est un entier //Conditionnement par 15

Reste1 est un entier
Reste2 est un entier
Reste3 est un entier

QuantiteTotale&

Cond40= PartieEntière(QuantiteTotale/40)
Reste1= modulo(QuantiteTotale,40)

SI modulo(Reste1,25)>0 ALORS
SI modulo(Reste1,15)>0 ALORS
Erreur("Erreur de conditionnement","Vous devez compléter votre commande
d'au moins "+ (15-(modulo(Reste1,15)))+" produits")
RETOUR
SINON
Cond15= PartieEntière(Reste1/15)
FIN
SINON
Cond25= PartieEntière(Reste1/25)
FIN

Info("Votre commande sera conditionné avec "+RC+...
Cond40+" cartons de 40"+RC+...
Cond25+" cartons de 25"+RC+...
Cond15+" cartons de 15")

---------------------------------------------------------------

Alors, j'ai gagné oui ou non !

--------------------------------------------

Roumegou wrote:
Ben Voyons !
Encore un qui prend des libertés avec l'énoncé ;-)
Le monsieur t'as dit 25/15/40 et pas 20/15/40 et ça marche pas ta
solution nananère heu !
Eric Roumegou

Eric LAURENT wrote:
Ouups ! petit correctif: (au fait, j'ai gagné quelque chose ? -
peut-être Windev 8 gratuit ou la 7.5 enfin deboggée !)



juste le droit de rejouer rofl

------------------------------------------------------------

QuantiteTotale est un entier //A livrer
Cond40 est un entier //Conditionnement par 40
Cond20 est un entier //Conditionnement par 20
Cond15 est un entier //Conditionnement par 15

Reste1 est un entier
Reste2 est un entier
Reste3 est un entier

QuantiteTotaleG80

Cond40= PartieEntière(QuantiteTotale/40)
Reste1= modulo(QuantiteTotale,40)

SI modulo(Reste1,20)>0 ALORS
SI modulo(Reste1,15)>0 ALORS
Erreur("Erreur de conditionnement","Vous devez compléter votre
commande d'au moins "+ (15-Reste1)+" produits")
RETOUR
SINON
Cond15= PartieEntière(Reste1/15)
FIN
SINON
Cond20= PartieEntière(Reste1/20)
FIN

Info("Votre commande sera conditionné avec "+RC+...
Cond40+" cartons de 40"+RC+...
Cond20+" cartons de 20"+RC+...
Cond15+" cartons de 15")




Avatar
B. Neve
"B. Neve" schreef in bericht
news:3fb94759$0$15807$
Bonsoir à tous,

Petit casse-tête entre amis...




Bonjour à tous,

Je vois que je titille votre ego... C'est sympa. Je pensais comme
apparemment pas mal d'entre vous que ce serait fait en deux coups de
cuillère à pot.
Teretete... Non non non. La bête n'est pas morte.

Comme vous l'avez remarqué... Jouer avec les plus grands dénominateurs ne
solutionne pas tout loin de là. Je ne cherche pas l'emballage optimal mais
uniquement savoir si c'est possible d'emballer.

Le challenge continue.
Merci en tout cas de tenter le coup... Pas facile. Il faut que cela soit
tout à fait dynamique bien évidemment. Si j'ai 8 emballages possibles...
Cela doit fontionner également.

A plus tard.

B. Nève (qui n'a pas beaucoup dormi)
Avatar
Marcel.berman
Salut !
Je viens de retester mon code et il marche aussi pour 4780.Je peux envoyer
une fenêtre de test en privé à qui le veut.
L'énoncé du problème n'est PAS de trouver le détail du conditionnement mais
bien de renvoyer Vrai ou Faux selon que la quantité et le type de
conditionnement envoyés en paramêtre sont "compatibles".
Bien à vous !
--
Marcel Berman
c/o Managing Business SPRL
Allée du Petit Paris, 11
B - 1410 - Waterloo
Tel : +32 2 351.60.64
Fax : +32 2 351.45.78
Gsm : +32 475.799.477
Avatar
Roumegou
> Alors, j'ai gagné oui ou non !



Ben non !
j'avais déjà corrigé ta 1ere version avec 25 pour dire que cela ne marchait
pas.
Allez, Ré essaye une fois !!!
Eric
Eric LAURENT wrote:
C'était pour vour si vous suiviez .... (lol)
Si vous voulez du tout cuit, essayez cela, réponse à 100% du cahier
des charges:



Avatar
Bob Lamar
Dans l'article <bpcr88$2k8$,
, dit 'Eric LAURENT', a écrit...
Ouups ! petit correctif: (au fait, j'ai gagné quelque chose ? - peut-être
Windev 8 gratuit ou la 7.5 enfin deboggée !)
------------------------------------------------------------

QuantiteTotale est un entier //A livrer
Cond40 est un entier //Conditionnement par 40
Cond20 est un entier //Conditionnement par 20



25 dans le cahier de charges

Cond15 est un entier //Conditionnement par 15

Reste1 est un entier
Reste2 est un entier
Reste3 est un entier

QuantiteTotaleG80


[MODE DEBUGGER ON :) ]
QT = 35


Cond40= PartieEntière(QuantiteTotale/40)



= 0

Reste1= modulo(QuantiteTotale,40)



= 35


SI modulo(Reste1,20)>0 ALORS



= 15 (vrai)

SI modulo(Reste1,15)>0 ALORS



= 5 (vrai)

Erreur("Erreur de conditionnement","Vous devez compléter votre commande
d'au moins "+ (15-Reste1)+" produits")



15-35 = -20 Qte a rajoutée...

(decidement j'en reste mes 2 boucles de bourrin non mathematicien ;)


--
o laisser la ligne contenant la mention de la personne à qui l'on répond
o ne citer que le strict nécessaire, mais citer quelque chose
o répondre point par point, en dessous du texte cité
o répondre sur usenet:<http://www.giromini.org/usenet-fr/repondre.html>
Avatar
Eric LAURENT
J'ai pas vu où ça marchait pas.
Tu peux préciser.



Roumegou wrote:
Alors, j'ai gagné oui ou non !



Ben non !
j'avais déjà corrigé ta 1ere version avec 25 pour dire que cela ne
marchait pas.
Allez, Ré essaye une fois !!!
Eric
Eric LAURENT wrote:
C'était pour vour si vous suiviez .... (lol)
Si vous voulez du tout cuit, essayez cela, réponse à 100% du cahier
des charges:




Avatar
Roumegou
Eric LAURENT wrote:
J'ai pas vu où ça marchait pas.
Tu peux préciser.



Ben en copiant ton code dans un bouton et en mettant 4780 , il me répond
qu'il en manque au moins 10 produits.





Roumegou wrote:
Alors, j'ai gagné oui ou non !



Ben non !
j'avais déjà corrigé ta 1ere version avec 25 pour dire que cela ne
marchait pas.
Allez, Ré essaye une fois !!!
Eric
Eric LAURENT wrote:
C'était pour vour si vous suiviez .... (lol)
Si vous voulez du tout cuit, essayez cela, réponse à 100% du cahier
des charges:







--
Eric Roumegou
Avatar
Firetox
Yes effectivement dans ce cas :
il faut faire une autre petite boucle ou alors demandez a la procedure de
faire
cette manip en descendant les diviseur de 1

j'ai rajouter dans la proc une valeur : nombre de fois a faire
et ansi je descend dans les diviseur de 1 au deuxieme passage donc le 25 se
retrouve a 190 au lieu de 191
et après on continue et hop : ca marche

a vec l'appel :
emballage : "40/25/15"
quantite : "4780'

chaineR ====> 190 x 25 / 2 x 15

SI TestEmballage(emballage,quantite,(NBFois),ChaineR) ALORS
Trace(ChaineR )
SINON
Trace("Impossible")
FIN

VOICI LA PROCEDURE :

//--------------------------------------------------------------------------
------------------------------

PROCEDURE TestEmballage(emballa est une chaîne, quanti est une chaîne,
ChaineRetour est une chaîne = "")

rest est un entier
i,j,id est un entier
qte est un entier = Val(quantite)
res,Res2 est une chaîne

fois est un entier

emb est un tableau dynamique
Divis est un tableau dynamique

emb = allouer un tableau de 0 entier
Divis = allouer un tableau de 0 entiers

Dimension(emb,ChaîneOccurrence(emballage,"/")+1)
Dimension(Divis,ChaîneOccurrence(emballage,"/")+1)

rest = qte

POUR i = 1 A Dimension(emb)
emb[i] = Val(ExtraitChaîne(emballage,i,"/"))
Divis[i] = PartieEntière(qte/emb[i])
SI Divis[i] > fois ALORS
fois = Divis[i]
FIN
FIN

TANTQUE fois > 0
res = ""; Res2 = ""
POUR j = 1 A Dimension(Divis)
rest = qte - ((Divis[j] * emb[j]))
i = j+1
SI Divis[j]> 0 ALORS
id=1
res = Divis[j] + " x "+emb[j] + " / "
TANTQUE i <= Dimension(emb)
SI rest >= emb[i] ALORS
id++
rest = rest - emb[i]
rest = rest - (PartieEntière(rest /emb[i])* emb[i])
i=j+1
FIN
SI rest = 0 ALORS
Res2 += id+" x "+emb[i] + " / "
SORTIR
FIN
Res2 = ""
i++
FIN
FIN
SI rest = 0 ALORS SORTIR
res = ""
FIN
fois--
SI rest > 0 ET fois > 0 ALORS
// on enleve 1 a tous les mutliplicateur
POUR i = 1 A Dimension(emb)
Divis[i] = PartieEntière(qte/emb[i])-1
FIN
rest = 0
FIN

FIN
ChaineRetour = res + Res2
SI rest = 0 ALORS RENVOYER Vrai
RENVOYER Faux

//--------------------------------------------------------------------------
------------------------------

Bon dev
@+

"Roumegou" a écrit dans le message de news:
bpcqus$3qq$
Firetox wrote:
> essaye avec ca :
>
Ca marchera pas ...
Le test qui tue c'est 4780 (par ex)




Avatar
Firetox
Yes effectivement dans ce cas :
il faut faire une autre petite boucle ou alors demandez a la procedure de
faire
cette manip en descendant les diviseur de 1

et ansi je descend dans les diviseur de 1 au deuxieme passage donc le 25 se
retrouve a 190 au lieu de 191
et après on continue et hop : ca marche

a vec l'appel :
emballage : "40/25/15"
quantite : "4780'

chaineR ====> 190 x 25 / 2 x 15

SI TestEmballage(emballage,quantite,ChaineR) ALORS
Trace(ChaineR )
SINON
Trace("Impossible")
FIN

VOICI LA PROCEDURE :

//--------------------------------------------------------------------------
------------------------------

PROCEDURE TestEmballage(emballa est une chaîne, quanti est une chaîne,
ChaineRetour est une chaîne = "")

rest est un entier
i,j,id est un entier
qte est un entier = Val(quantite)
res,Res2 est une chaîne

fois est un entier

emb est un tableau dynamique
Divis est un tableau dynamique

emb = allouer un tableau de 0 entier
Divis = allouer un tableau de 0 entiers

Dimension(emb,ChaîneOccurrence(emballage,"/")+1)
Dimension(Divis,ChaîneOccurrence(emballage,"/")+1)

rest = qte

POUR i = 1 A Dimension(emb)
emb[i] = Val(ExtraitChaîne(emballage,i,"/"))
Divis[i] = PartieEntière(qte/emb[i])
SI Divis[i] > fois ALORS
fois = Divis[i]
FIN
FIN

TANTQUE fois > 0
res = ""; Res2 = ""
POUR j = 1 A Dimension(Divis)
rest = qte - ((Divis[j] * emb[j]))
i = j+1
SI Divis[j]> 0 ALORS
id=1
res = Divis[j] + " x "+emb[j] + " / "
TANTQUE i <= Dimension(emb)
SI rest >= emb[i] ALORS
id++
rest = rest - emb[i]
rest = rest - (PartieEntière(rest /emb[i])* emb[i])
i=j+1
FIN
SI rest = 0 ALORS
Res2 += id+" x "+emb[i] + " / "
SORTIR
FIN
Res2 = ""
i++
FIN
FIN
SI rest = 0 ALORS SORTIR
res = ""
FIN
fois--
SI rest > 0 ET fois > 0 ALORS
// on enleve 1 a tous les mutliplicateur
POUR i = 1 A Dimension(emb)
Divis[i] = PartieEntière(qte/emb[i])-1
FIN
rest = 0
FIN

FIN
ChaineRetour = res + Res2
SI rest = 0 ALORS RENVOYER Vrai
RENVOYER Faux

//--------------------------------------------------------------------------
------------------------------

Bon dev
@+>
"Roumegou" a écrit dans le message de news:
bpcqus$3qq$
> Firetox wrote:
> > essaye avec ca :
> >
> Ca marchera pas ...
> Le test qui tue c'est 4780 (par ex)
>
>




1 2 3 4 5