Deutsch   English   Français   Italiano  
<20240702191750.748@kylheku.com>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Kaz Kylheku <643-408-1753@kylheku.com>
Newsgroups: comp.lang.lisp
Subject: Re: matrix operations
Date: Wed, 3 Jul 2024 02:41:20 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 94
Message-ID: <20240702191750.748@kylheku.com>
References: <v629o5$1sdhf$1@dont-email.me>
Injection-Date: Wed, 03 Jul 2024 04:41:21 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="30e244ac737476d78edd2cd6194d0a15";
	logging-data="2115877"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18Q1h5HDIeyus82FAiapxOvUR9rkUvF3ic="
User-Agent: slrn/pre1.0.4-9 (Linux)
Cancel-Lock: sha1:LGFmIhxh0sGGBMj0vb6TAoWppi0=
Bytes: 3611

On 2024-07-03, B. Pym <No_spamming@noWhere_7073.org> wrote:
> Barry Margolin wrote:
>
>> Zachary Turner <ztur...@bindview.com> wrote: 
>> >I've got a 3x3 matrix, stored as ((r1c1 r1c2 r1c3) (r2c1 r2c2 r2c3) (r3c1 
>> >r3c2 r3c3)).  I want to check if any of the columns have the same three 
>> >elements.  It's easy for rows, I can just use 
>> >(or 
>> >   (every #'equal (car matrix)) 
>> >   (every #'equal (cadr matrix)) 
>> >   (every #'equal (caddr matrix))) 
>> 

If it didn't have to scale to larger matrices, I'd probaby just do:

(defun has-column-3x3 (matrix)
  (if-match @(or ((@x . @nil)
                  (@x . @nil)
                  (@x . @nil))
                 ((@nil @x . @nil)
                  (@nil @x . @nil)
                  (@nil @x . @nil))
                 ((@nil @nil @x)
                  (@nil @nil @x)
                  (@nil @nil @x)))
            matrix
    t))

(defun has-column-3x3 (matrix)
  (if-match @(or ((@x @x @xl) . @nil)
                 (@nil (@x @x @x) . @nil)
                 (@nil @nil (@x @x @x)))
            matrix
    t))

(defun has-diagonal-3x3 (matrix)
  (if-match @(or ((@x . @nil)
                  (@nil @x . @nil)
                  (@nil @nil @x))
                 ((@nil @nil @x)
                  (@nil @x . @nil)
                  (@x . @nil)))
            matrix
    t))

If we want to test for a specific value of x (e.g. #\X or #\O
in Tic Tac Toe), we just add that as a parameter

(defun has-diagonal-3x3 (matrix x)
  (if-match @(or ((@x . @nil)
                  (@nil @x . @nil)
                  (@nil @nil @x))
                 ((@nil @nil @x)
                  (@nil @x . @nil)
                  (@x . @nil)))
            matrix
    t))

The pattern matcher will substitute the value of the existing
lexical x for the pattern variable @x.

2> (has-diagonal-3x3 '((x o o)
                       (o x _)
                       (_ _ x)) 'x)
t
3> (has-diagonal-3x3 '((x o o)
                       (o _ _)
                       (_ _ x)) 'x)
nil
4> (has-diagonal-3x3 '((x o o)
                       (o o x)
                       (o x x)) 'x)
nil
5> (has-diagonal-3x3 '((x o o)
                       (o o x)
                       (o x x)) 'o)
t

Backquote notation can be used.

(defun has-diagonal-3x3 (matrix x)
  (if-match @(or ^((,x . ,nil)
                   (,nil ,x . ,nil)
                   (,nil ,nil ,x))
                 ^((,nil ,nil ,x)
                   (,nil ,x . ,nil)
                   (,x . ,nil)))
            matrix
    t))

-- 
TXR Programming Language: http://nongnu.org/txr
Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
Mastodon: @Kazinator@mstdn.ca