board.scm 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. (define-module (sudoku board)
  2. #:use-module (srfi srfi-1)
  3. #:use-module (srfi srfi-9)
  4. #:use-module (sudoku square)
  5. #:export (board
  6. make-board board?
  7. board-array set-board-array!))
  8. (define-record-type <board>
  9. (make-board array)
  10. board?
  11. (array board-array set-board-array!))
  12. (define-public (make-9x9-board)
  13. (let ((dimension 9))
  14. (make-board
  15. (make-square-array (make-square dimension)
  16. dimension))))
  17. (define (make-square-array fill dimension)
  18. (make-array fill dimension dimension))
  19. (define-public (set-square! board square i j)
  20. (array-set! (board-array board) square i j))
  21. (define-public (get-row board i)
  22. (let loop ((j 0) (row '()))
  23. (if (array-in-bounds? (board-array board) i j)
  24. (loop (1+ j)
  25. (cons (array-ref (board-array board) i j) row))
  26. (reverse row))))
  27. (define-public (set-row! board row i)
  28. (for-each (lambda (square j)
  29. (array-set! (board-array board)
  30. square i j))
  31. row
  32. (iota 9)))
  33. (define-public (get-col board j)
  34. (let loop ((i 0) (col '()))
  35. (if (array-in-bounds? (board-array board) i j)
  36. (loop (1+ i)
  37. (cons (array-ref (board-array board) i j) col))
  38. (reverse col))))
  39. (define-public (set-col! board col j)
  40. (for-each (lambda (square i)
  41. (array-set! (board-array board) square i j))
  42. col
  43. (iota 9)))
  44. (define-public (get-box board n)
  45. (let ((x (* 3 (quotient n 3)))
  46. (y (* 3 (modulo n 3))))
  47. (reverse
  48. (fold (lambda (i l)
  49. (cons (array-ref
  50. (board-array board)
  51. (+ x (quotient i 3))
  52. (+ y (modulo i 3)))
  53. l))
  54. '()
  55. (iota 9)))))
  56. ;;; TODO: add cut support
  57. (define-public (set-box! board box n)
  58. (let ((x (* 3 (quotient n 3)))
  59. (y (* 3 (modulo n 3))))
  60. (for-each (lambda (square i)
  61. (array-set! (board-array board)
  62. square
  63. (+ x (quotient i 3))
  64. (+ y (modulo i 3))))
  65. box
  66. (iota 9))))