Advertisement
Guest User

kq

a guest
Jul 15th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 1.29 KB | None | 0 0
  1. outer.multi = function(f, L) {
  2.   args = Reduce(function(x, y) outer(x, y, function(a,b) mapply(c, a, b,
  3.                                                            SIMPLIFY=FALSE)), L)        
  4.   apply(args, 1:length(dim(args)), function(a) do.call(f, as.list(a[[1]])))            
  5. }
  6.  
  7.                                                                                
  8. C = function(n,k) ifelse(n < 0, 0, choose(n,k))
  9.  
  10.  
  11. kq = function(cards = 52, kings = 4, queens = 4, gap = 1, cyclic = FALSE) {
  12.   f = function(...) {
  13.     v = c(...)
  14.     lv = length(v)
  15.     hv = lv/2
  16.     free = cards - cyclic - kings*lv + sum(v[1:(lv-1)]*((lv-1):1))
  17.     kpos = kings - cyclic - sum(v)
  18.     if (!cyclic) {
  19.       if (gap) r = v[1:(hv-1)] else r = NULL
  20.       prod(choose(kings - 1 - cumsum(c(0, r)), v[1:hv])) *
  21.         prod(choose(kings + 1 - sum(r) - cumsum(v[hv:(lv-1)]), v[(hv+1):lv])) *
  22.         C(free, kpos) * C(free - kpos, queens)
  23.     } else {
  24.       prod(choose(kings - cumsum(c(0, v[1:(lv-1)])), v[1:lv])) *
  25.         C(free, kpos) * C(free - kpos, queens) * cards/kings
  26.     }
  27.   }
  28.   small = kings*2*(gap+1)
  29.   L = c(rep(list(0:(kings - (cards >= small))), gap+1),
  30.         rep(list(0:(kings + (cards < small) - cyclic)), gap+1))
  31.   1 - sum(outer.multi(f, L)) / choose(cards, kings) / choose(cards - kings, queens)
  32. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement