0votos

Las bolas de Dijkstra en Clojure

por josejuan hace 3 años

.

En el juego de las bolas de Dijkstra se dispone de una bolsa con bolas blancas y negras. El juego consiste en elegir al azar dos bolas de la bolsa y añadir una bola negra si las dos bolas elegidas son del mismo color o una bola blanca en caso contrario. El juego termina cuando queda sólo una bola en la bolsa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(require '[clojure.core.match :refer [match]]) 
 
;; El juedo de Dijkstra 
(defn game [b n] 
  (match [b n] 
         [0 1] [[0 1]] 
         [1 0] [[1 0]] 
         :else (let [u (/ (* n (- n 1)) (* (+ n b) (+ n b -1))) 
                     v (/ (* b (- b 1)) (* (+ n b) (+ n b -1))) 
                     r (rand)] 
                    (cons [b n] (apply game (match [(< r u) (< r (+ u v))] 
                                                   [true _] [b       (- n 1)] 
                                                   [_ true] [(- b 2) (+ n 1)] 
                                                   :else    [b       (- n 1)])))))) 
 
;; Verificar la propiedad 
(defn testBlancaSiiBlancasImpar [uBound printData] 
  (let [b (rand-int uBound) 
        n (rand-int uBound)] 
 
    (when printData 
      (printf "(%s %s)\n" b n)) 
 
    (when (> (+ b n) 0) 
      (= (odd? b) 
          (= [1 0] (last (game b n))))))) 
 
 
;; Ejemplo ejecución: 
;;     user=> (testBlancaSiiBlancasImpar 30 true) 
;;     (22 22) 
;;     true 
;;     user=> (testBlancaSiiBlancasImpar 30 true) 
;;     (28 25) 
;;     true 
;;     user=> (testBlancaSiiBlancasImpar 30 true) 
;;     (1 3) 
;;     true 
;;     user=> (testBlancaSiiBlancasImpar 30 true) 
;;     (19 21) 
;;     true 
;;     user=> (every? (fn [_] (testBlancaSiiBlancasImpar 30 false)) (range 100)) 
;;     true 
;;     user=> 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.