[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Program problem
From: |
Stephen Berman |
Subject: |
Re: Program problem |
Date: |
Wed, 29 Nov 2023 17:37:31 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) |
On Wed, 29 Nov 2023 17:20:30 +0100 Stephen Berman <stephen.berman@gmx.net>
wrote:
[...]
> As food for thought and for you to experiment with, here is an
> alternative implementation that uses some higher-level elisp functions
> to avoid lower-level functions like setcar and nthcdr, and hence shorten
> the code. Also, it restructures the data into a form that seems to me
> better suited to what you want, given your description. The doc string
> tries to explain that:
I meant to add here that the last sentence of the doc string suggests
how to check for bad input, but I omitted adding such code for the sake
of brevity.
Steve Berman
> (defun fill-rows (dim rows)
> "Fill a square matrix of dimensions DIM with values from ROWS.
> DIM is an integer specifying the number of rows and columns in
> the matrix. ROWS is an alist with elements (ROW . ELEMENTS),
> where ROW specifies the (1-based) row number of the matrix and
> ELEMENTS is a string whose characters are numerals specifying the
> contents of the cells of ROW (in which each numeral in ELEMENTS
> has been converted to the corresponding integer). Each cell of
> the rows not specified by ROWS is filled with 0. Since the
> result should be a square matrix, the lengths of ROWS and
> ELEMENTS must equal DIM and each ROW must be an integer between 1
> and DIM (inclusive)."
> (let (matrix)
> (dotimes (i dim)
> (let* ((rpair (assq (1+ i) rows))
> (row (if rpair
> (mapcar #'string-to-number
> (mapcar #'string
> (string-to-list (cdr rpair))))
> (make-list dim 0))))
> (setq matrix (append matrix (list row)))))
> matrix))
>
> Here's the invocation with your test data:
>
> (fill-rows 9 '((1 . "123456789") (3 . "987654321") (5 . "123498765")))
>
> I hope that was helpful.
>
> Steve Berman