Aller au contenu
  • 0
sapadi

Classer à partir d'une liste (Tarot à 5)

Question

Bonjour,

J’ai 5 rubriques

nom_score1 >> nom1 & "     " & MENE::ScoreJoueur1

nom_score2 >>  nom2 & "     " & MENE::ScoreJoueur2

nom_score3 >>  nom3 & "     " & MENE::ScoreJoueur3

nom_score4 >>  nom4 & "     " & MENE::ScoreJoueur4

nom_score5 >>  nom5 & "     " & MENE::ScoreJoueur5

 

J’obtiens dans une table les rubriques ci-dessus qui permettent avec le script « prononcer » de faire lire les résultats au micro.

Ce que je recherche, c’est faire la même chose mais en classant les joueurs en fonction des scores décroissants.

J’ai créé une liste

SortValues ( Liste

(ScoreJoueur1 & " " & PARTIE::nom1; ScoreJoueur2 & " " & PARTIE::nom2; ScoreJoueur3 & " " & PARTIE::nom3; ScoreJoueur4 & " " & PARTIE::nom4; ScoreJoueur5)& " " & PARTIE::nom5;-2)

Mais je ne sais comment faire pour extraire de cette liste, la première valeur, le seconde etc. en mettant le nom d’abord et le score !

Quelqu'un peut-il m'éclairer ?

Francis

 

Partager ce message


Lien à poster
Partager sur d’autres sites

15 réponses à cette question

Messages recommandés

  • 0

Bonjour, en appliquant un tri numérique inverse 

Definir ([  _list = Liste ( "Pierre 745"; "Bobby 520" ; "Albert 125" ; "Louis 521" ; "Zoe 876" ) ;  _sortNumDesc = SortValues ( _list ; -2 )   ];_sortNumDesc)

=> résultat:
Zoe 876
Pierre 745
Louis 521
Bobby 520
Albert 125

… bien sûr si ton joueur s'appelle "Albert 1er" ou/et Pierre devient "Pierre-Louis" … il faudra employer une autre méthode ou calcul.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Une autre possibilité…

Utiliser l'i.n.s..u.p.p.o.r.t.a.b.l.e ~fonctionnalité~ que FMInc à introduite avec les fonctions JSON ... trier d'office les clés des objets JSON … (au nom de quoi d'abord !! ??)

On construit le JSON avec les scores en temps que clés, et les joueurs en temps que valeurs:

Definir ([   _json = "{\"456\":\"Pierre-Alain\", \"123\":\"Albert 1er\", \"-985\":\"Louis-Charles\", \"275\" :\"Zoé\", \"209\":\"clem\"}" ;   _keyArray =  "[" & substituer ( JSONListKeys ( _json ; "" ) ; ¶ ; "," ) & "]" ;  _valueArray = "[\"" & substituer ( JSONListValues ( _json ; "" ) ; ¶ ; "\",\"" ) & "\"]"];JSONGetElement ( _valueArray ; 4 ) & " " & JSONGetElement ( _keyArray ; 4 ) & ¶ &  JSONGetElement ( _valueArray ; 3 ) & " " & JSONGetElement ( _keyArray ; 3 ) & ¶ & JSONGetElement ( _valueArray ; 2 ) & " " & JSONGetElement ( _keyArray ; 2 ) & ¶ & JSONGetElement ( _valueArray ; 1 ) & " " & JSONGetElement ( _keyArray ; 1 ) & ¶ & JSONGetElement ( _valueArray ; 0 ) & " " & JSONGetElement ( _keyArray ; 0 ) )

 

Après le JSON, tu as aussi la possibilité de trier au sein de la fonction ExecuterSQL, mais là ça dépend de ta structure…

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

JSON, pour le moment, ça me semble barbare…

La première solution me convient. Mon problème subsiste car quand je lance le script « prononcer »  avec 

Zoe 876
Pierre 745
Louis 521
Bobby 520
Albert 125

Le résultat acoustique est mauvais, trop rapide. Je voudrais extraire la première valeur (nom, score) et « temporiser » chaque résultat, puis passer à l'énoncé de la deuxième valeur etc

exemple : nom1, 1seconde, score1, 1 seconde etc. 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Pour rester dans le barbare, il suffit de passer en boucle à travers les valeurs de la liste, avec Speak ( GetValue ( $List ; 1 ) ) puis pause 1 seconde, puis Speak ( GetValue ( $List ; 2 ) ), pause une seconde, et ainsi de suite jusqu'à la fin de la liste.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

… en encore plus barbare…

l'AppleScript natif  

set names to {"Zoe", "Pierre", "Louis-Charles", "Robert", "Alexandre"}set scores to {"876", "745", "521", "520", "-125"}repeat with i from 1 to count names	say names's item i using "Audrey" speaking rate 120	delay 0.7	say scores's item i using "Thomas" speaking rate 130 --pitch 30	delay 1.2end repeat

transposé en Exécuter AppleScript (calculé)

"set names to {\"Zoe\", \"Pierre\", \"Louis-Charles\", \"Robert\", \"Alexandre\"}¶set scores to {\"876\", \"745\", \"521\", \"520\", \"-125\"}¶¶repeat with i from 1 to count names¶	say names's item i using \"Audrey\" speaking rate 120¶	delay 0.7¶	say scores's item i using \"Thomas\" speaking rate 130 --pitch 30¶	delay 1.2¶end repeat"

…Dommage j'ai pas trouvé les voix de Leon Zitrone et de Simone Garnier, on aurais pu  recréer "Intervilles" ou "l'Eurovision" :)

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Merci à tous les deux. J'essaie ça lundi et je vous en parle.

Francis

 

 barbare [baʀbaʀ] adj. et n.

ÉTYM. 1308; lat. barbarus, du grec barbaros «  étranger  ».

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

En fouillant dans mes vieilles archives "Inside Macintosh" …  apparement , malgré l'éloignement d'avec System 6 & 7, la syntaxe est restée identique…

… une autre manière, donc  d'accéder "Inside FileMaker" aux paramètres des commandes de synthèse vocale …

 

 

Enjoy !

EnhancedSpeech.fmp12

EnhancedSpeech.fmp12

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Clem,

Dis-moi tout…je n'ai pas ZOE, PIERRE etc. ni 876, 745… Mais des rubriques…quelle est la bonne syntaxe pour passer les rubriques dans l'applescript ?

Merci d'avance,

Francis

set names to {"Zoe", "Pierre", "Louis-Charles", "Robert", "Alexandre"}set scores to {"876", "745", "521", "520", "-125"}repeat with i from 1 to count names	say names's item i using "Audrey" speaking rate 120	delay 0.7	say scores's item i using "Thomas" speaking rate 130 --pitch 30	delay 1.2end repeat

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

T'es en v.14 comme l'indique ta signature ?? Dans ce cas, le tri du score tu t'en affranchis comment ?? par le tri d'une TE ?

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Je suis en V.16

Le tri est fait par ce que tu m'as indiqué :

Definir ([   _list = Liste ( PARTIE::nom1 & " " & ScoreJoueur1; PARTIE::nom2 & " " & ScoreJoueur2; PARTIE::nom3 & " " & ScoreJoueur3; PARTIE::nom4 & " " & ScoreJoueur4; PARTIE::nom5 & " " & ScoreJoueur5);   _sortNumDesc = SortValues ( _list ; variable )   ]; _sortNumDesc )

La variable est une globale, pour avoir le tri ascendant / descendant sur les noms ou ascendant/descendant sur les scores qui prend les valeurs (1, -1, 2, -2).

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour,

... autre principe…

on transfert dans l'AppleScript les données "JoueurNom" et "JoueurScore" dans une 'hashmap' AppleScript… cette hashmap est triée de manière décroissante sur la clé 'score'. 

set unsortedMap to {{player:"Muriel", score:300}, {player:"Robert", score:900}, {player:"Pierre-Alexandre", score:200}, {player:"Anne", score:-850}, {player:"Gaëlle", score:-500}}#set n to count of unsortedMaprepeat with i from 1 to n - 1	repeat with j from i + 1 to n		if unsortedMap's item j's score < unsortedMap's item i's score then			set temp to unsortedMap's item i			set unsortedMap's item i to unsortedMap's item j			set unsortedMap's item j to temp		end if	end repeatend repeat#set sortedMap to reverse of unsortedMap#try	repeat with i from 1 to n		say sortedMap's item i's player using "Audrey" speaking rate 140		delay 0.7		say ((sortedMap's item i's score) as string) & "points" using "Thomas" speaking rate 160		delay 1.2	end repeatend try

 

qui rapporté dans FM donne (cf doc joint) :

Definir ([  j1 = Citation ( DEMO::joueur1 ) ;  j2 = Citation ( DEMO::joueur2 ) ;  j3 = Citation ( DEMO::joueur3 ) ;  j4 = Citation ( DEMO::joueur4 ) ;  j5 = Citation ( DEMO::joueur5 )] ;"set unsortedMap to {{player:" & j1 & ", score:" & DEMO::score1 & "}, {player:" & j2 & ", score:" & DEMO::score2 & "}, {player:" & j3 & ", score:" & DEMO::score3 & "}, {player:" & j4 & ", score:" & DEMO::score4 & "}, {player:" & j5 & ", score:" & DEMO::score5 & "}}¶#¶set n to count of unsortedMap¶repeat with i from 1 to n - 1¶	repeat with j from i + 1 to n¶		if unsortedMap's item j's score < unsortedMap's item i's score then¶			set temp to unsortedMap's item i¶			set unsortedMap's item i to unsortedMap's item j¶			set unsortedMap's item j to temp¶		end if¶	end repeat¶end repeat¶#¶set sortedMap to reverse of unsortedMap¶#¶try¶	repeat with i from 1 to n¶		say sortedMap's item i's player using \"Audrey\" speaking rate 140¶		delay (" & DEMO::delayA_gn & "/1000)¶		say ((sortedMap's item i's score) as string) & " & Citation ( DEMO::sayMore_gt ) & " using \"Thomas\" speaking rate 160¶		if ( i <= n-1 ) then delay (" & DEMO::delayB_gn & "/1000)¶	end repeat¶end try ")

 

AS_Prononcer.fmp12

AS_Prononcer.fmp12

AS_Prononcer.fmp12

AS_Prononcer.fmp12

AS_Prononcer.fmp12

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Grand merci Clément.

Je vais étudier cela dans le détail.

L' exemple est bluffant…la voix d'Aurélie est du meilleur effet…il faut supprimer l'accent sur Aurelie, sinon ça ne marche pas !

Grâce à toi, le tarot a sa voix…

Francis

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

une autre version utilisant la passerelle AS-Objective-C (aka: ASObjC) pour trier liste des tableaux associatifs (score: joueur:).

on sortTheList:theList byKeys:keyList ascendingOrder:ascendList --sortSelector:sortSelector	set descriptorList to {}	repeat with i from 1 to count of keyList		set end of descriptorList to (current application's NSSortDescriptor's sortDescriptorWithKey:(item i of keyList) ascending:(item i of ascendList)) -- selector:sortSelector)	end repeat	set theArray to current application's NSArray's arrayWithArray:theList	return (theArray's sortedArrayUsingDescriptors:descriptorList) as listend sortTheList:byKeys:ascendingOrder:--sortSelector:

L'avantage de cette solution par rapport au "BubbleSort" initialement proposé:

  • la rapidité
  • le nombre de clé de tri est facile à implémenter. Il suffit d'ajouter la clé et d'indiquer l'ordre de tri (true/false pour ascendant/descendant). Avec la technique dite 'BubbleSort' c'est une autre paire de manches !!!)
  • peut utiliser des comparateurs (non implémenté ds l'exemple) (compare; caseInsensitiveCompare; localizedCompare; localizedCaseInsensitiveCompare; localizedStandardCompare)
  • la fonction peut être utilisée pour trier de très grands tableaux

AS_Prononcer.fmp12

 

pour la liste de voix et celles baragouinant le français, dans un terminal:

say --v '?'  #pour obtenir la liste des voixsay --v '?' | grep "fr_[CA|FR]" | awk '{print $1}' #les voix ne parlant que le français

 

AS_Prononcer.fmp12

AS_Prononcer.fmp12

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Merci de m'instruire encore un peu.

Au vu de mon grand âge, il me faut du temps pour assimiler tout cela.

Merci Clément.

Francis

Partager ce message


Lien à poster
Partager sur d’autres sites

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

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.

×