0
votes

Renvoie un élément spécifique dans une liste - Lisp

J'essaie d'écrire une fonction appelée: Get-Element (Coords du conseil) qui prend une carte et une paire de coordonnées représentant une position de conseil en entrée. Le premier élément de la paire représente le numéro de colonne et la seconde représente le numéro de ligne (l'indexation commence à 0). La fonction renvoie le contenu de cette position de la carte, qui peut être sous X, O ou Nil. En utilisant l'état de la carte de test suivant.

  (col(nth 0 coords))
  (row(nth 1 coords)))


0 commentaires

3 Réponses :


3
votes

Je ne vous donnerai pas la solution exacte, mais un raisonnement que j'espère sera utile de le produire par vous-même.

Votre structure de données consiste en une liste, dont chaque élément représente une rangée de la carte. Vous avez donc une liste avec un certain nombre d'éléments égaux au nombre de lignes du tableau.

Les éléments de cette liste sont eux-mêmes des listes: chaque ligne est donc représentée par une liste, dans laquelle chaque élément représente une cellule particulière de la carte (pas une colonne, une cellule!). Donc, votre structure de données est une liste de listes.

Alors, on pourrait demander: Qu'est-ce qu'une colonne du tableau dans cette représentation? Et la réponse est la suivante: il n'y a pas de structure de données réelle qui peut être appelée la colonne de la carte, une colonne peut simplement être considérée comme une colonne que: "Tous les éléments à la même position des listes internes".

Donc, si vous souhaitez extraire une cellule particulière de la représentation de votre carte, identifiée par quelques coordonnées (numéro de ligne, numéro de colonne), vous devez "traduire" ces informations à votre représentation spécifique de la structure de données, qui est exprimé à la place dans la liste des listes. Par exemple, si vous souhaitez obtenir le contenu de la cellule aux coordonnées (3, 5), c'est une ligne 3 et une colonne 5, vous devriez raisonner de cette manière: je peux accéder directement à la rangée 3, car c'est le Quatrième élément de la liste "Big", mais pas à la colonne 5, car il n'y a rien de correspondant immédiatement à OT.

Mais si je peux accéder à la rangée 3, par exemple avec (nième carte) , ce que j'obtiens est la liste correspondant aux cellules de cette ligne, il n'y a donc pas besoin d'obtenir une colonne 5, je peux juste prendre l'élément 5 de cette liste et je vais obtenir le contenu de la cellule avec coordonnée (3, 5). Donc, il suffit d'obtenir l'élément numéro 5 de cette liste, par exemple avec (NTH 5 (nième carte)) (c'est-à-dire depuis (NTH 3) Renvoie la liste des cellules de cette ligne, vous sélectionnez l'élément 5 de cette liste).

J'espère que cela peut être utile de comprendre comment résoudre votre problème.


0 commentaires

0
votes
(defparameter *test-board*
     '((nil nil nil nil nil nil)
       (O   nil nil nil nil nil)
       (X   nil nil nil nil nil)
       (X   X   O   nil nil nil)
       (O   O   X   nil nil nil)
       (nil nil nil nil nil nil)
       (nil nil nil nil nil nil)))

(get-element *test-board* '(0 0)) ;; NIL
(get-element *test-board* '(1 0)) ;; O
(get-element *test-board* '(4 2)) ;; X

0 commentaires

0
votes

Cette fonction choisira numériquement dans une liste imbriquée, à une profondeur: xxx

si nous remplaçons nième à l'aide de elt (mémoriser Pour inverser les arguments), il devient alors plus générique. Nous pouvons avoir un vecteur de listes de chaînes, etc.

remarque: ANSI Common Lisp possède des tableaux N-dimensionnels, vous savez.


0 commentaires