Comment appeler une liste pour la mettre à jour plusieurs fois jusqu'à ce qu'une condition soit remplie dans Netlogo

Je suis nouveau sur Netlogo et continue à apprendre, ce que je veux faire, c'est appeler une liste après une mise à jour et faire une autre mise à jour jusqu'à ce qu'une condition soit atteinte, si j'ai une liste

let xy [[-2 6][-1 6][0 6][-1 6][-2 6][1 5][2 5][-3 9][-4 9][-5 9][-6 9][-3 9]] 
let same true

J'essaie de supprimer de la liste le premier sous-liste entre deux mêmes éléments [-2 6] [- 1 6] [0 6] [- 1 6] [- 2 6] alors je veux aussi supprimer la sous-liste entre les autres deux mêmes éléments [-3 9] [- 4 9] [- 5 9] [- 6 9] [- 3 9] jusqu'à ce qu'il n'y ait plus d'éléments qui répètent dans ce cas le résultat devrait être [[1 5] [2 5 ]] et je contrôle cette liste après avoir supprimé les sous-listes à la condition:

if length xy = length remove-duplicates xy [ set same false ]

J'ai déjà fait le code de suppression ci-dessous et il supprime la première sous-liste mais je pourrais avoir beaucoup de sous-listes, et je veux savoir comment après une suppression puis-je obtenir à nouveau la liste mise à jour (dans ce cas je devrais en quelque sorte liste dans le code) et contrôlez-le à nouveau avec ces conditions. Je pensais faire une procédure de rapport et une boucle de temps, par exemple (peut-être que je me trompe)

 to-report update-list [list]

 while [same != false ] 

 [ ; do the removal stuff 
   set list-xy item POSITION (FIRST MODES xy) xy xy
   let first-pos POSITION (FIRST MODES xy)  xy 
   set list-temp remove-item first-pos xy 
   set sec-pos position list-xy list-temp + 1
   set sublist-1 sublist xy 0 first-pos 
   set sublist-2 sublist xy sec-pos length xy
   set final-list sentence sublist-1 sublist-2
   set xy final-list



; the condition if i don't have any duplicates the size of two lists should have the same size , no duplicates

if length xy = length remove-duplicates xy 

   [ set same false ]


  ] 


 report update-list xy 

Je ne suis pas sûr de quoi signaler à la fin de la procédure et comment rappeler la liste à nouveau, ainsi je peux enlever toutes ces sous-listes.

Toutes les idées sont appréciées, merci

0

2 Réponses

Si je comprends votre objectif, votre besoin principal peut être capturé en créant une nouvelle liste par article, mais en la coupant chaque fois qu'un doublon apparaît. Pour un seul nouvel article, c'est:

to-report trim-or-grow [#list #item]
  let _i position #item #list
  report ifelse-value (_i != false) [sublist #list 0 _i] [lput #item #list]
end

Vous pouvez ensuite réduire avec ce journaliste:

to test
  let xy [[-2 6][-1 6][0 6][-1 6][-2 6][1 5][2 5][-3 9][-4 9][-5 9][-6 9][-3 9]]
  print reduce trim-or-grow fput [] xy
end
0
ajouté

C'est plus facile à résoudre en utilisant la récursivité:

to-report remove-fenced-sublists [xs]
  if empty? xs
    [ report [] ]
  let pos position first xs butfirst xs
  if not is-number? pos
    [ report fput first xs remove-fenced-sublists butfirst xs ]
  report remove-fenced-sublists sublist xs (pos + 2) length xs
end

Exemple de course:

observer> show remove-fenced-sublists [[-2 6][-1 6][0 6][-1 6][-2 6][1 5][2 5][-3 9][-4 9][-5 9][-6 9][-3 9]]
observer: [[1 5] [2 5]]
0
ajouté