board.scm 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. (define-module (sudoku board))
  2. (use-modules (srfi srfi-1)
  3. (sudoku square))
  4. (define-public (make-board)
  5. (make-array (make-square) 9 9))
  6. (define-public (set-square board square i j)
  7. (array-set! board square i j)
  8. board)
  9. (define-public (get-row board i)
  10. (let loop ((j 0) (row '()))
  11. (if (array-in-bounds? board i j)
  12. (loop (1+ j)
  13. (cons (array-ref board i j) row))
  14. (reverse row))))
  15. (define-public (set-row board row i)
  16. (fold (lambda (square j n-board)
  17. (array-set! n-board square i j)
  18. n-board)
  19. board
  20. row
  21. (iota 9)))
  22. (define-public (get-col board j)
  23. (let loop ((i 0) (col '()))
  24. (if (array-in-bounds? board i j)
  25. (loop (1+ i)
  26. (cons (array-ref board i j) col))
  27. (reverse col))))
  28. (define-public (set-col board col j)
  29. (fold (lambda (square i n-board)
  30. (array-set! n-board square i j)
  31. n-board)
  32. board
  33. col
  34. (iota 9)))
  35. (define-public (get-box board n)
  36. (let ((x (* 3 (quotient n 3)))
  37. (y (* 3 (modulo n 3))))
  38. (reverse
  39. (fold (lambda (i l)
  40. (cons (array-ref
  41. board
  42. (+ x (quotient i 3))
  43. (+ y (modulo i 3)))
  44. l))
  45. '()
  46. (iota 9)))))
  47. (define-public (set-box board box n)
  48. (let ((x (* 3 (quotient n 3)))
  49. (y (* 3 (modulo n 3))))
  50. (fold (lambda (square i n-board)
  51. (array-set! n-board
  52. square
  53. (+ x (quotient i 3))
  54. (+ y (modulo i 3)))
  55. n-board)
  56. board
  57. box
  58. (iota 9))))