Skip to content

Instantly share code, notes, and snippets.

@yatsuta
Created August 26, 2011 08:10
Show Gist options
  • Save yatsuta/1172960 to your computer and use it in GitHub Desktop.
Save yatsuta/1172960 to your computer and use it in GitHub Desktop.
DICEWARS by R
library(scatterplot3d)
p <- function(n) {
m <- matrix(0, ncol=n, nrow=n*6)
m[1:6, 1] <- 1/6
val <- function(i, j) if(i < 1) 0 else m[i,j]
for (j in 2:n) {
for (i in j:(6*j)) {
m[i,j] <- 1/6 * sum(sapply(i - 6:1, function(k) val(k, j-1)))
}
}
m
}
m <- p(8)
plot.dists <- function(local.m=m) {
oldpar <- par(mfrow=c(2, 4))
for (i in 1:8) {
x <- local.m[i:(6*i), i]
names(x) <- as.character(i:(6*i))
barplot(x, main=sprintf("N=%d", i))
}
par(oldpar)
}
dice.dist <- function(n1, n2, local.m=m) {
p.n1 <- local.m[n1:(6*n1) ,n1]
p.n2 <- local.m[n2:(6*n2), n2]
p.mat <- outer(p.n1, p.n2)
d.mat <- matrix(0, nrow=5*n1+2, ncol=5*n2+2)
d.mat[2:(5*n1+2), 1] <- p.n1
d.mat[1, 2:(5*n2+2)] <- p.n2
d.mat[2:(5*n1+2), 2:(5*n2+2)] <- p.mat
df <- data.frame(cols=as.vector(col(d.mat)),
rows=as.vector(row(d.mat)),
value=as.vector(d.mat),
color=as.vector(color.mat(n1,n2)))
scatterplot3d(df, type="h", lwd=5, pch=" ",
main=sprintf("%d vs %d", n1, n2),
xlab=as.character(n2),
ylab=as.character(n1),
zlab="probability",
label.tick.marks=F,
scale.y=n1/n2,
# x.ticklabs=as.character(n2:(6*n2)),
# y.ticklabs=as.character(n1:(6*n1)),
# xlim=1:(5*n2+1), ylim=1:(5*n1+1)
)
}
color.mat <- function(n1, n2) {
no.color="gray"
color.p1 = "orange"
color.p2 = "yellowgreen"
color.win1 = "tomato"
color.win2 = "green"
color.draw = "yellow"
c.mat <- matrix(no.color, nrow=5*n1+2, ncol=5*n2+2)
c.mat[2:(5*n1+2), 1] <- color.p1
c.mat[1, 2:(5*n2+2)] <- color.p2
for (i in 2:(5*n1+2)) {
for (j in 2:(5*n2+2)) {
if (i + n1 > j + n2) {
c.mat[i, j] <- color.win1
}
else if (i + n1 < j + n2) {
c.mat[i, j] <- color.win2
}
else {
c.mat[i, j] <- color.draw
}
}
}
c.mat
}
win.prop <- function(n.off, n.diff, local.m=m) {
p <- 0
for (i in n.off:(6*n.off)) {
for (j in n.diff:(6*n.diff)) {
if (i > j)
p <- p + local.m[i, n.off] * local.m[j, n.diff]
}
}
p
}
# sapply(1:8, function(n1) sapply(1:8, function(n2) as.double(sprintf("%.4f", win.prop(n1,n2)*100))))
direct.8 <- function() {
p.8 <- rep(0, 8 * 6)
for (d1 in 1:6) {
for (d2 in 1:6) {
for (d3 in 1:6) {
for (d4 in 1:6) {
for (d5 in 1:6) {
for (d6 in 1:6) {
for (d7 in 1:6) {
for (d8 in 1:6) {
i <- d1+d2+d3+d4+d5+d6+d7+d8
p.8[i] <- p.8[i] + 1
}
}
}
}
}
}
}
}
p.8 / 6**8
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment