P99
(load "@lib/simul.l") (de crossword (File) (use (Words Data Grid Slots Org) (in File (setq Words (flip (by length sort (make (while (line) (link (trim @)))))) Data (flip (make (while (line) (link (trim @))))) # Read data Len (apply max (mapcar length Data)) Grid (grid Len (length Data)) ) ) # Create grid (for Col Grid # Set initial data (use Data (for This Col (let C (pop Data) (=: char (unless (sp? C) C)) ) (pop 'Data) ) ) ) (setq Slots (mapcar '((L) (cons (length (car L)) L)) (by length group (make (for Col Grid # Init slots (for This Col (when (: char) (and # Check horizontal slot (not (; (west This) char)) (; (east This) char) (; (east (east This)) char) (link (make (for (This This (: char) (east This)) (link This) ) ) ) ) (and # Check vertical slot (not (; (north This) char)) (; (south This) char) (; (south (south This)) char) (link (make (for (This This (: char) (south This)) (link This) ) ) ) ) ) ) ) ) ) ) ) (recur (Words) (if Words (for Slot (cdr (assoc (length (car Words)) Slots)) (unless (find '((This C) (nor (= C (: char)) (= "." (: char)))) Slot (car Words) ) (let Org (mapcar get Slot '(char .)) (mapc put Slot '(char .) (car Words)) (recurse (cdr Words)) (mapc put Slot '(char .) Org) ) ) ) (disp Grid T # Found a solution: Display it '((This) (if (: char) (pack " " @ " ") "###" ) ) ) ) ) ) ) : (crossword "p99a.dat") +---+---+---+---+---+---+---+---+---+ 6 | P | R | O | L | O | G |###|###| E | +---+---+---+---+---+---+---+---+---+ 5 | E |###| N |###|###| N |###|###| M | +---+---+---+---+---+---+---+---+---+ 4 | R |###| L | I | N | U | X |###| A | +---+---+---+---+---+---+---+---+---+ 3 | L |###| I |###| F |###| M | A | C | +---+---+---+---+---+---+---+---+---+ 2 |###|###| N |###| S | Q | L |###| S | +---+---+---+---+---+---+---+---+---+ 1 |###| W | E | B |###|###|###|###|###| +---+---+---+---+---+---+---+---+---+ a b c d e f g h i
http://picolisp.com/wiki/?99p99
12jul10 | abu |