Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. #lang racket
  2.  
  3. (provide (all-defined-out))
  4.  
  5. (define (all? p? xs)
  6. (if (null? xs) #t
  7. (and (p? (car xs)) (all? p? (cdr xs)))))
  8.  
  9. (define (any? p? xs)
  10. (if (null? xs) #f
  11. (or (p? (car xs)) (any? p? (cdr xs)))))
  12.  
  13. (define (concat xss)
  14. (apply append xss))
  15.  
  16. (define (rows xss) xss)
  17.  
  18. (define (cols xss)
  19. (apply map list xss))
  20.  
  21. (define (row xss i) (list-ref xss i))
  22. (define (col xss i) (list-ref (cols xss) i))
  23.  
  24. (define (matrix-ref xss i j)
  25. (list-ref (list-ref xss i) j))
  26.  
  27. (define (set xs i x [counter 0])
  28. (cond
  29. ((= i -1) (cons x xs))
  30. ((and (= counter i) (null? xs) (list x)))
  31. ((null? xs) xs)
  32. ((= counter i) (cons x (cdr xs)))
  33. (else (cons (car xs) (set (cdr xs) i x (+ 1 counter))))))
  34.  
  35. (define (place xss i j x)
  36. (set xss i (set (row xss i) j x)))
  37.  
  38. (define (diag xss)
  39. (if (null? xss) xss
  40. (cons (caar xss) (diag (map cdr (cdr xss))) )))
  41.  
  42. (define (flip xss)
  43. (map reverse xss))
  44.  
  45. (define (diags xss)
  46. (list (diag xss) (diag (flip xss))))
  47.  
  48. (define (apply-matrix op f xss)
  49. (if (null? xss) xss
  50. (cons (op f (car xss)) (apply-matrix op f (cdr xss)) )))
  51.  
  52. (define (map-matrix f xss)
  53. (apply-matrix map f xss))
  54.  
  55. (define (filter-matrix p? xss)
  56. (apply-matrix filter p? xss))
  57.  
  58. (define (zip-with f xs ys)
  59. (if (or (null? xs) (null? ys))
  60. '()
  61. (cons (f (car xs) (car ys)) (zip-with f (cdr xs) (cdr ys)))))
  62.  
  63.  
  64. (define (zip-matrix xss yss)
  65. (if (or (null? xss) (null? yss)) '()
  66. (cons (zip-with cons (car xss) (car yss))
  67. (zip-matrix (cdr xss) (cdr yss)))))
  68.  
  69.  
  70.  
  71. (define (liner-set a b)
  72. (if(>= a b) '()
  73. (cons a (liner-set (+ a 1) b))))
  74.  
  75. (define (matrix-w xss) (length (car xss)))
  76. (define (matrix-h xss) (length xss))
  77.  
  78. (define (self-matrix w h)
  79. (define self-w (liner-set 0 w))
  80. (define self-h (liner-set 0 h))
  81. (map
  82. (lambda (i)
  83. (map
  84. (lambda (j)
  85. (cons i j)) self-w)) self-h))
  86.  
  87.  
  88. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  89.  
  90.  
  91. (define (check w . xss)
  92. (cond
  93. ((null? xss) #f)
  94. ((all? (lambda (x) (equal? x w)) (car xss)) #t)
  95. (else (apply check w (cdr xss)))
  96. ))
  97.  
  98.  
  99. (define (winner xss)
  100. (define dat (append (diags xss) (rows xss) (cols xss)))
  101. (cond
  102. ((apply check "X" dat) "X")
  103. ((apply check "O" dat) "O")
  104. ((any? (lambda (x) (equal? x #f)) (apply append dat)) #f)
  105. (else "D")))
  106.  
  107.  
  108.  
  109. (define (plays xss)
  110. (apply append (map-matrix cdr
  111. (filter-matrix (lambda (x) (equal? (car x) #f))
  112. (zip-matrix xss (self-matrix (matrix-w xss)(matrix-h xss) ))))))
  113.  
  114. (define (inverse x)
  115. (cond
  116. ((= x 1) -1)
  117. ((= x -1) 1)
  118. (else 0)
  119. ))
  120.  
  121. (define (cur-winner xss curr)
  122. (define out (winner xss))
  123. (cond
  124. ((not out) #f)
  125. ((equal? out "D") 0)
  126. ((equal? out curr) 1)
  127. (else -1)))
  128.  
  129. (define (not-cur x)
  130. (if (equal? x "X") "O" "X"))
  131.  
  132. (define (outcome curr-board curr-sign)
  133. (define state (cur-winner curr-board curr-sign))
  134. (define branches (plays curr-board))
  135.  
  136. (if state
  137. state
  138. (inverse (foldr
  139. (lambda (x out)
  140. (min
  141. out
  142. (outcome (place curr-board (car x) (cdr x) curr-sign) (not-cur curr-sign ) ))
  143. ) 1 branches))))
  144.  
  145. (define GAME '((#f "O" #f)
  146. ("O" "X" #f)
  147. (#f #f #f)))
  148.  
  149. (define (play curr-board curr-sign)
  150. (define state (cur-winner curr-board curr-sign))
  151. (if state
  152. #f
  153. (car (foldr (lambda (x a)
  154. (if (>= (cdr x)(cdr a)) x a))
  155. (cons (cons 0 0) -2)
  156. (map (lambda (x)
  157. (cons x (inverse (outcome (place curr-board (car x) (cdr x) curr-sign) (not-cur curr-sign ) )))) (plays curr-board)))
  158. ))
  159. )
  160.  
  161. ;;;;;;;;;;;;;;;;;;;;;;;;
  162. (define (play-all begin-board begin-sign)
  163. (define outz (play begin-board begin-sign))
  164. (if outz
  165. (cons (cons begin-sign outz)
  166. (play-all (place begin-board (car outz) (cdr outz) begin-sign) (not-cur begin-sign )))
  167. '()))
  168.  
  169. (define curr-board GAME)
  170. (define curr-sign "X")
  171. (map (lambda (x)
  172. (cons x (inverse (outcome (place curr-board (car x) (cdr x) curr-sign) (not-cur curr-sign ) )))) (plays curr-board))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement