Advertisement
Guest User

Untitled

a guest
Jan 31st, 2015
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. (define 1- (cut - <> 1))
  2. (define 1+ (cut + <> 1))
  3.  
  4. (define-syntax define-form
  5. (syntax-rules ()
  6. ((_ (name arg ...) form)
  7. (define-syntax name
  8. (syntax-rules ()
  9. ((_ arg ...) form))))))
  10.  
  11. (define-form (swap vec a b)
  12. (let ((tmp (vector-ref vec a)))
  13. (vector-set! vec a (vector-ref vec b))
  14. (vector-set! vec b tmp)))
  15.  
  16. (use srfi-27)
  17. (define (shuffle deck)
  18. (let1 v (list->vector deck)
  19. (let loop ((lst '())
  20. (size (length deck)))
  21. (if (zero? size)
  22. lst
  23. (let1 rand (random-integer size)
  24. (swap v (1- size) rand)
  25. (loop (cons (vector-ref v (1- size)) lst)
  26. (1- size)))))))
  27.  
  28. (define (any-subsequence? preds lst)
  29. (letrec ((F (lambda (preds lst)
  30. (cond
  31. ((null? preds) #t)
  32. ((null? lst) #f)
  33. (((car preds) (car lst)) (F (cdr preds) (cdr lst)))
  34. (else #f)))))
  35. (let loop ((lst lst))
  36. (cond
  37. ((null? preds) #t)
  38. ((null? lst) #f)
  39. (((car preds) (car lst)) (or (F preds lst)
  40. (loop (cdr lst))))
  41. (else (loop (cdr lst)))))))
  42.  
  43. (define (deck->stream deck)
  44. (let ((deck deck))
  45. (lambda ()
  46. (if (null? deck)
  47. (values #f #f)
  48. (let ((top (car deck)))
  49. (set! deck (cdr deck))
  50. (values top #t))))))
  51.  
  52. (define (take/stream n stream)
  53. (let loop ((n n) (lst '()))
  54. (if (zero? n)
  55. (reverse lst)
  56. (loop (1- n) (cons (stream) lst)))))
  57.  
  58. (define (set-ref-proc lst index proc)
  59. (cond
  60. ((null? lst) '())
  61. ((zero? index) (cons (proc) (cdr lst)))
  62. (else (cons (car lst)
  63. (set-ref-proc (cdr lst) (1- index) proc)))))
  64.  
  65. (define Suits '(Diamond Club Heart Spade))
  66. (define Courts '(A 2 3 4 5 6 7 8 9 10 J Q K))
  67. (define make-card cons)
  68. (define suit-of car)
  69. (define court-of cdr)
  70. (define (number->card n)
  71. (make-card (list-ref Suits (quotient n 13))
  72. (list-ref Courts (modulo n 13))))
  73. (define (red? suit)
  74. (or (eq? suit 'Diamond) (eq? suit 'Heart)))
  75. (define (successor? pre suc)
  76. (any-subsequence? (list (cut eq? <> pre) (cut eq? <> suc)) Courts))
  77.  
  78. (define (read-elements)
  79. (read-from-string (string-append "(" (read-line) ")")))
  80.  
  81. (define (change-hand hand choices deck)
  82. (let loop ((hand hand) (choices choices))
  83. (if (null? choices)
  84. hand
  85. (loop (set-ref-proc hand (car choices) deck)
  86. (cdr choices)))))
  87.  
  88. (define (suit->string suit)
  89. (cadr (assoc suit '((Diamond "♢")
  90. (Club "♣")
  91. (Heart "♡")
  92. (Spade "♠")))))
  93.  
  94. (define (print-hand hand)
  95. (for-each
  96. display
  97. (map (lambda (card)
  98. (string-append
  99. "["
  100. (suit->string (suit-of card))
  101. (x->string (court-of card))
  102. "]"))
  103. (map number->card hand)))
  104. (newline))
  105.  
  106. (random-source-randomize! default-random-source)
  107. (define (main args)
  108. (and-let*
  109. ((deck (deck->stream (shuffle (iota 52))))
  110. (hand (take/stream 5 deck))
  111. (_ (print-hand hand))
  112. (choices (read-elements))
  113. (hand (change-hand hand choices deck))
  114. (_ (print-hand hand)))
  115. #f))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement