Je suis en train de trouver un moyen Clojure-idiomatiques à « compresser » un vecteur:Clojure compresser vecteur
(shift-nils-left [:a :b :c :a nil :d nil])
;=> (true [nil nil :a :b :c :a :d])
(shift-nils-left [nil :a])
;=> (false [nil :a])
(shift-nils-left [:a nil])
;=> (true [nil :a])
(shift-nils-left [:a :b])
;=> (false [:a :b])
En d'autres termes, je veux passer à l'extrémité gauche du vecteur toutes les nil
valeurs , sans changer la longueur. Le booléen indique si un décalage s'est produit. La structure "extérieure" peut être seq
, mais le résultat à l'intérieur devrait être un vecteur.
Je soupçonne que la fonction implique filter
(sur les valeurs nulles) et into
à ajouter à un vecteur de nil
s de la même longueur que l'original, mais je ne suis pas sûr de savoir comment réduire le résultat à la longueur d'origine. Je sais comment cette "main longue", mais je soupçonne que Clojure sera en mesure de le faire dans une seule ligne. Je rêve à l'idée d'écrire un Bejeweled comme exercice pour apprendre Clojure.
Merci.
Si seulement vous pouviez déplacer les valeurs vers la droite à la place ... –
La structure de données que j'ai en tête est un vecteur ou 8 vecteurs. Chaque vecteur interne représente une colonne de bijoux. La fonction 'apply-move' remplacera les joyaux qui disparaissent avec les valeurs' nil'. Je vais ensuite utiliser la fonction "compress" pour déplacer les valeurs "nil" vers le haut et ensuite remplir avec des bijoux (j'ai déjà une fonction pour le faire). – Ralph