> LeekScript
Un ensemble (set) est une collection de valeurs uniques. Il vaut mieux le voir comme un sac de valeurs distinctes que comme une liste : on ne lui demande pas « quel est le 3ᵉ élément ? », mais plutôt « est-ce que telle valeur est dedans ? ».
Deux propriétés le définissent :
s[2]. Depuis la version 2.48, l'ensemble conserve toutefois l'ordre d'insertion lors du parcours, de manière déterministe.C'est ce qui le distingue d'un tableau (Array), qui accepte les doublons et se manipule par indices.
---
Posez-vous une seule question : « ai-je besoin de savoir rapidement si une valeur est présente, ou d'éviter les doublons ? »
Ce coût constant est l'argument décisif : dans un tableau, vérifier la présence d'une valeur oblige à le parcourir, ce qui coûte autant d'opérations qu'il contient d'éléments. Dans un combat où les opérations sont limitées, l'ensemble fait toute la différence dès qu'on teste souvent l'appartenance.
Exemples typiques : mémoriser les cellules déjà visitées, garder la liste des ennemis repérés sans risquer de les compter deux fois, ou comparer deux zones du terrain.
---
On peut écrire un ensemble en toutes lettres avec des chevrons ``, mais en pratique on part souvent d'un ensemble vide que l'on remplit au fil du programme.
L'opérateur .. permet de générer une plage de valeurs sans tout énumérer :
On peut aussi créer un ensemble avec new Set(), ou en convertir un tableau ou un intervalle :
Comme un ensemble refuse les doublons, ceux-ci disparaissent dès la construction. L'ordre d'insertion, lui, est conservé :
Un ensemble peut être typé selon son contenu :
| Type | Contenu | |-----------------|-------------------------------| | Set | uniquement des entiers | | Set | uniquement des nombres réels | | Set | n'importe quel type de valeur |
Le paramètre de type peut être n'importe quel type : Set, Set, Set…
---
setPut(set, element) → booléen ajoute une valeur. Sa valeur de retour est souvent plus utile que l'ajout lui-même : elle vaut true si l'élément était nouveau, false s'il existait déjà. C'est parfait pour détecter une première rencontre.
setRemove(set, element) → booléen retire une valeur et renvoie true si elle était présente, false sinon — pratique pour agir uniquement quand l'élément existait vraiment.
setClear(set) → set vide complètement l'ensemble, par exemple pour le réutiliser au tour suivant.
---
C'est ici que l'ensemble prend tout son sens.
Pour savoir si une valeur est présente, l'opérateur in est la forme la plus courte : element in set renvoie un booléen. La fonction setContains(set, element) fait exactement la même chose, au même coût, si vous préférez la notation fonction.
setSize(set) → entier donne le nombre d'éléments, et setIsEmpty(set) → booléen indique s'il est vide (plus lisible que setSize(s) == 0).
---
Les ensembles permettent de raisonner sur des groupes de valeurs. Ces fonctions prennent deux ensembles et renvoient un nouvel ensemble (ou un booléen) sans modifier les originaux. C'est souvent beaucoup plus simple que d'écrire des boucles à la main.
setUnion(set1, set2) → set — tout ce qui est dans l'un ou l'autre (A ∪ B). Idéal pour fusionner deux groupes.setIntersection(set1, set2) → set — ce qui est dans les deux à la fois (A ∩ B). Utile pour trouver le terrain commun.setDifference(set1, set2) → set — ce qui est dans set1 mais pas dans set2 (A \ B). Pensez à « toutes mes options, sauf les dangereuses ».setDisjunction(set1, set2) → set — ce qui appartient à exactement un des deux ensembles (différence symétrique A △ B).setIsSubsetOf(set1, set2) → booléen — true si tous les éléments de set1 se trouvent dans set2 (A ⊆ B).setFilter(set, callback) → set construit quant à lui un nouvel ensemble en ne gardant que les éléments pour lesquels le callback renvoie true :
---
Un ensemble se parcourt avec une boucle for ... in. Depuis la version 2.48, les éléments sont parcourus dans leur ordre d'insertion, toujours le même d'une exécution à l'autre.
Si vous avez besoin d'un autre ordre, convertissez d'abord l'ensemble en tableau avec setToArray(set) → array, puis triez ce tableau.
---
---
| Élément | Retour | Rôle | |----------------------------|-----------|-----------------------------------------------| | x in s | booléen | Présence de x — coûte 1 opération | | setContains(s, x) | booléen | Présence de x (même coût que in) | | setPut(s, x) | booléen | Ajoute x ; true si nouveau | | setRemove(s, x) | booléen | Retire x ; true si présent | | setClear(s) | set | Vide l'ensemble | | setSize(s) | entier | Nombre d'éléments | | setIsEmpty(s) | booléen | true si l'ensemble est vide | | setToArray(s) | array | Convertit en tableau (ordre d'insertion) | | arrayToSet(t) | set | Convertit un tableau en ensemble | | intervalToSet(i) | set | Convertit un intervalle en ensemble | | setFilter(s, f) | set | Garde les éléments validés par le callback | | setUnion(s1, s2) | set | A ∪ B | | setIntersection(s1, s2) | set | A ∩ B | | setDifference(s1, s2) | set | A \ B | | setDisjunction(s1, s2) | set | Différence symétrique A △ B | | setIsSubsetOf(s1, s2) | booléen | true si A ⊆ B |
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.