Ordre Croissant Ou Décroissant En Lua [résolu]


Messages recommandés

Posté(e) (modifié)

Salut,

j'aurais besoin d'un coup de main pour un code lua.

Voilà j'ai 10 donnés nommées : A, B, C, D, E, F, G, H, I, J. Chaques lettres correspondent à une image ou un son. Elles ont toutes été prises au hasard sur 100.

aga = Sound.load("aga.wav")baba = Sound.load("baba.wav")...............A=math.random(100)B=math.random(100)..............if A == 10 then	screen:blit(100,100,aga)	endif A == 11 then	screen:blit(100,100,baba)	endif B == 15 then	screen:blit(100,100,baba)	end....

En fonction du nombre qui leur a été attribuée par les math.random, j'aimerai faire un code ou une fonction pour classer les lettres dans un ordre croissant ou décroissant.

C'est à dire si les math.random me donne :

A = 13

B = 12

C = 14

D = 10

E = 9

F = 20

G = 17

H = 23

I = 2

J = 8

J'aimerai qu'un code les classent dans l'ordre croissant : I J E D B A C G F H pour faire apparaitre les images ou les sons dans l'ordre définit par les math.random.

Voilà. Merci de votre précieuse aide.

Modifié par zouzzz
Posté(e)

Voilà. Merci de votre précieuse aide.

tu dois utiliser l'algo du tri a bulle (Bubble Sort) voila le lien avec les explications:

Bubble Sort

L'adaptation en lua sera simple je pense et des exemples en différents language sont donnés.

Dans ton cas tu dois avoir deux tableaux, tu trie les deux en meme temps mais tu fait tes comparaisons sur le premier (celui avec les chiffres bien sur).

Posté(e)

Merci pour ton aide.

Il me faudrait donc une fonction genre le

tempValue

du Delphi / Pascal pour Lua.

J'ai essayé avec :

 ...if A < B thenA = BB = Aend...

Mais au bout d'un moment je me retrouve avec toutes les valeurs égales (A = B = C ...= une valeur entre 1 et 100)

Posté(e)

Merci pour ton aide.

Il me faudrait donc une fonction genre le

tempValue

du Delphi / Pascal pour Lua.

J'ai essayé avec :

 ...if A < B thenA = BB = Aend...

Mais au bout d'un moment je me retrouve avec toutes les valeurs égales (A = B = C ...= une valeur entre 1 et 100)

c'est une erreur classique, je l'ai eu aussi, tu t'est trompé qqu part mais je ne sait pas dire ou, post une fois ton code de tri complet que je regarde

Posté(e)

Merci pour ton aide.

Il me faudrait donc une fonction genre le

tempValue

du Delphi / Pascal pour Lua.

J'ai essayé avec :

 ...if A < B thenA = BB = Aend...

Mais au bout d'un moment je me retrouve avec toutes les valeurs égales (A = B = C ...= une valeur entre 1 et 100)

c'est une erreur classique, je l'ai eu aussi, tu t'est trompé qqu part mais je ne sait pas dire ou, post une fois ton code de tri complet que je regarde

Ok, je posterai dès que possible (demain ou après demain)

Posté(e)

Si tu veux tester tu télécharge AutoIt

Et tu teste le petit code que j'ai fait rapidos et qui correspond à ton exemple:

$Lettre  = "A,B,C,D,E,F,G,H,I,J"$Chiffre = "13,12,14,10,9,20,17,23,2,8"$TabLettre  = StringSplit($Lettre, ",")$TabChiffre = StringSplit($Chiffre, ",")$Longtableau = $TabLettre[0]; L'élément 0 contient le nombre d'élément du tableau$Avant = ""$Apres = ""For $i = 1 To $Longtableau - 1	; Mon tableau commence à 1	$Avant = $Avant & $TabLettre[$i] & " = " & $TabChiffre[$i] & @CRLFNextMsgBox(0, "Avant", $Avant)While 1	$Permuation = 0	For $i = 1 To $Longtableau - 1	; Mon tableau commence à 1		If Number($TabChiffre[$i]) > Number($TabChiffre[$i + 1]) Then		; On sauve les valeurs			$TempChiffre = $TabChiffre[$i]			$TempLettre  = $TabLettre[$i]		; Element = Element + 1			$TabChiffre[$i] = $TabChiffre[$i + 1]			$TabLettre[$i]  = $TabLettre[$i + 1]		; On termine le swap			$TabChiffre[$i + 1] = $TempChiffre			$TabLettre[$i + 1] = $TempLettre			$Permuation = 1					EndIf	Next	If $Permuation = 0 Then ExitLoopWendFor $i = 1 To $Longtableau - 1	; Mon tableau commence à 1	$Apres = $Apres & $TabLettre[$i] & " = " & $TabChiffre[$i] & @CRLFNextMsgBox(0, "Apres", $Apres)

Posté(e)

Je ne suis pas sur d'avoir tout saisi, mais je teste ça ce soir.

Merci.

En réalité l'algo est simple mais cela peut paraitre compliqué au 1er abord une fois que tu l'a ecris toi meme tu verra que tout sera limpide

Posté(e)

Je viens de matter ton code... v'est pas du Lua ça. :P

Non il faut l'adapter en lua mais bien entendu le principe est le meme si tu capte cet exemple alors tu peux le refaire.

Avec le programme que j'ai mis le lien tu peux tester ce code facilement

Posté(e) (modifié)

Ok, je me disais aussi :) .

Je n'ai pas pu tester hier soir, je verrai ça ce soir.

Merci encore.

Voila un traduction en lua maintenant je ne garanti pas que ca marche car je l'ai fait rapidement et je ne suis pas sur que le break pour sortir de la 2eme loop ne va pas aussi sortir de la 1er

Enfin cela te donne une idée:

Lettre={"A","B","C","D","E","F","G","H","I","J"}Chiffre={13,12,14,10,9,20,17,23,2,8}Longtableau = 10; Nombre d'élément du tableauWhile true do	Permuation = 0	i = 1	While true do		If TabChiffre[i] > TabChiffre[i + 1] Then	; On sauve les valeurs			TempChiffre = TabChiffre[i]			TempLettre  = TabLettre[i]	; Element = Element + 1			TabChiffre[i] = TabChiffre[i + 1]			TabLettre[i]  = TabLettre[i + 1]	; On termine le swap			TabChiffre[i + 1] = TempChiffre			TabLettre[i + 1] = TempLettre			Permuation = 1		End		i = i + 1		If i = Longtebleau Then Break End	End	If Permuation = 0 Then Break EndEnd

Modifié par JangoKing
Posté(e)

Ok, je vois quelques erreurs vite fait mais je pense que ça va bien m'aider.

J'ai eu aussi l'aide de Carish surXtreamLua :

je te previens, c'est pas la solution exacte, mais plutot une piste sur comment tu dois faire. je pense qu'il faut reflechir au probleme, mais la j'y arrive plus :oops: trop fatigué :P

Table = {}

Table2 = {}

for i = 1, 10

Table = math.random(100)

end

for i = 1, 10 do

for j = 1, 10 do

if Table[j] > Table then

a = Table

else

a = Table[j]

end

Table2=a

end

for i = 1,10 do

screen:clear()

screen:print(10,10*i, Table2, white)

screen.waitVblankStart()

screen.flip()

end

et celle de akiraenmpsi de PSPgen :

green = Color.new(0, 255, 0)A = 13B = 12C = 14D = 10E = 9F = 20G = 17H = 23I = 2J = 8tableaud = {}tableaud[1]=Atableaud[2]=Btableaud[3]=Ctableaud[4]=Dtableaud[5]=Etableaud[6]=Ftableaud[7]=Gtableaud[8]=Htableaud[9]=Itableaud[10]=Jvariable = 0for j = 1,10 do	for i = 1,9 do	if tableaud[i]<tableaud[i+1] then	variable=tableaud[i]	tableaud[i]=tableaud[i+1]	tableaud[i+1]=variable	end	endendfor g = 1,10 doscreen:print(30*g, 100, tableaud[g], green)endscreen.flip()while true doscreen.waitVblankStart()pad = Controls.read()if pad:start() thenbreakendendfor l = 1,10 doif A==tableaud[l] thentableaud[l]="A"endif B==tableaud[l] thentableaud[l]="B"endif C==tableaud[l] thentableaud[l]="C"endif D==tableaud[l] thentableaud[l]="D"endif E==tableaud[l] thentableaud[l]="E"endif F==tableaud[l] thentableaud[l]="F"endif G==tableaud[l] thentableaud[l]="G"endif H==tableaud[l] thentableaud[l]="H"endif I==tableaud[l] thentableaud[l]="I"endif J==tableaud[l] thentableaud[l]="J"endendtableauc = {}for l = 1,10 dotableauc[l]=tableaud[11-l]endfor g = 1,10 doscreen:print(30*g, 100, tableauc[g], green)screen:print(30*g, 200, tableaud[g], green)endscreen.flip()while true doscreen.waitVblankStart()pad = Controls.read()if pad:up() thenbreakendend

Avec ça, je pense pouvoir m'en tirer.

Je les ai tous remercié.

Posté(e) (modifié)

juste une remarque au passage.

Eviter le bubble sort, c'est une méthode très mauvaise. Elle consiste à comparer 2 valeurs successives dans un tableau, et à les échanger si leur ordre relatif est mauvais. C'est beaucoup trop lent, plein de comparaisons et d'échanges pour rien, etc.

Sinon l'autre méthode que vous avez mentionnée ça s'appelle du tri par sélection et c'est constitué de 2 boucles for imbriquées. La première boucle recherche la valeur min dans le tableau, et la met au début. les méthodes que vous avez présentées sont loin d'être les meilleures, parce qu'à chaque fois que le programme trouve une valeur plus petite que la plus petite valeur connue il y a échange, alors qu'on ne devrait le faire qu'une fois avoir parcouru tout le tableau pour trouver la plus petite valeur de toutes. En plus à chaque tour de la première boucle il y a un élément en moins à vérifier dans la 2eme boucle, alors que vos codes reparcourent tout le tableau à chaque fois.

Bon je ne vais pas vous donner le code, par contre ça aussi ça marche bien : ;)

tablo = {}-- générer les 10 valeursfor i=1,10 do  tablo[i] = math.random(100)end-- trier le tableautable.sort( tablo )

et voila, à la fin les éléments tablo[1], ... tablo[10] contiennent tes valeurs triées dans l'ordre croissant

Modifié par ouasse
Posté(e) (modifié)

Bon je ne vais pas vous donner le code, par contre ça aussi ça marche bien : ;)

tablo = {}-- générer les 10 valeursfor i=1,10 do  tablo[i] = math.random(100)end-- trier le tableautable.sort( tablo )

et voila, à la fin les éléments tablo[1], ... tablo[10] contiennent tes valeurs triées dans l'ordre croissant

Ok merci à toi ouasse. table.sort( tablo ) permet le tri des données du tableau par ordre croissant, c'est ça?

Modifié par zouzzz
Posté(e) (modifié)

Oui il existe plusieurs alogrithme de tri et effectivement certains sont plus efficace que d'autres.

La solution de akiraenmpsi de PSPgen est la meme que la mienne sauf qu'il utilise des for (ce que je n'ai pas fait car je n'avais pas bien compris le for en lua)

Par contre il replace les lettres dans l'ordre des chiffres apres le tri ce qui est une perte de temps considérable. Surtout que tu peux le faire directement, a eviter donc.

Qqu link utiles pour illustrer ce que dis ouasse:

Tri casier

Tri shell

Modifié par JangoKing
Posté(e) (modifié)

Par contre il replace les lettres dans l'ordre des chiffres apres le tri ce qui est une perte de temps considérable. Surtout que tu peux le faire directement, a eviter donc.

Je viens de tester sur luawindows et son code fonctionne bien. Pour le temps, ce n'est pas la priorité, donc si ça fonctionne bien, ya des chances pour que je le garde.

Je vais tout de même regarder de plus près le ***.sort() d'ouasse.

Ce qui est sur, c'est que vous m'avez oté une sacrée épine dans le panard.

Modifié par zouzzz
Posté(e) (modifié)
Ok merci à toi ouasse. table.sort( tablo ) permet le tri des données du tableau par ordre croissant, c'est ça?

oui c'est ça, tu fais table.sort( xxx ) et ça te trie ton tableau xxx par ordre croissant.

on peut aussi donner en option une fonction de comparaison, pour trier les éléments par ordre décroissant ou pour trier un tableau qui contient autre chose que des nombres.

tout ça, c'est dans la doc de Lua :

http://www.lua.org/manual/5.1/manual.html#pdf-table.sort

JangoKing, le tri par casier c'est bien pour trier des tableaux très grands de nombres entiers, mais pas pour un tableau de 10 éléments ;)

Et le shell sort c'est le tri par sélection dont j'ai parlé, qui commence par rechercher le min, puis le min parmi les autres éléments, et ainsi de suite

Sinon y'a le tri rapide ou quicksort, qui est implémenté en langage C dans la fonction qsort (définie dans stdlib.h), et ça doit très certainement être le cas pour le table.sort de Lua.

Modifié par ouasse

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant