sudoku.l

来自「A very small LISP implementation with se」· L 代码 · 共 74 行

L
74
字号
# 21jan07abu# (c) Software Lab. Alexander Burger(load "lib/simul.l")### Fields/Board #### val lst(setq   *Board (grid 9 9)   *Fields (apply append *Board) )# Init values to zero (empty)(for L *Board   (for This L      (=: val 0) ) )# Build lookup lists(for (X . L) *Board   (for (Y . This) L      (=: lst         (make            (let A (* 3 (/ (dec X) 3))               (do 3                  (inc 'A)                  (let B (* 3 (/ (dec Y) 3))                     (do 3                        (inc 'B)                        (unless (and (= A X) (= B Y))                           (link                              (prop (get *Board A B) 'val) ) ) ) ) ) )            (for Dir '(`west `east `south `north)               (for (This (Dir This)  This  (Dir This))                  (unless (memq (:: val) (made))                     (link (:: val)) ) ) ) ) ) ) )# Cut connections (for display only)(for (X . L) *Board   (for (Y . This) L      (when (member X (3 6))         (con (car (val This))) )      (when (member Y (4 7))         (set (cdr (val This))) ) ) )# Display board(de display ()   (disp *Board 0      '((This)         (if (=0 (: val))            "   "            (pack " " (: val) " ") ) ) ) )# Initialize board(de main (Lst)   (for (Y . L) Lst      (for (X . N) L         (put *Board X (- 10 Y) 'val N) ) )   (display) )# Find solution(de go ()   (unless      (recur (*Fields)         (with (car *Fields)            (if (=0 (: val))               (loop                  (NIL                     (or                        (assoc (inc (:: val)) (: lst))                        (recurse (cdr *Fields)) ) )                  (T (= 9 (: val)) (=: val 0)) )               (recurse (cdr *Fields)) ) ) )      (display) ) )

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?