何点取るかを確率でバシッと出す その1

11/22 プログラミングセミナー その2からの続き。
バグ取りはまだしていない。

# とりあえず変数を置いとく。
Nbase<- 2
Nbatter<- 5                          # ここの値は11/22の表から選ぶ。
Nout<- 2
#Bprob<- c(0.7,0.1,0.1,0.05,0.05)
Bprob<- c(0.8,0.05,0.05,0.05,0.05)
# 考えられる打撃パターンをすべて発生させる。
p<- a<- list(0:Nbase)
for(i in 1:(Nbatter - 1)){
  p<- c(p,a)
}
res<- expand.grid(p)
dim(res)                             # Nbase^NbatterならOK。
# resのなかで、Nout回アウトが出ていないものを排除する。
out.omitter<- function(vector){      # 変数はベクトル。
  if(length(vector[vector == 0]) < Nout){
    vector<- rep(NA,length(vector))
  }
  return(vector)
}
# ここはちょっとやっかい。listだったりmatrixだったりして扱いに困る。がちゃがちゃ変換中。
A<- matrix(unlist(res),nrow(res),ncol(res))               # listを強引にmatrix化。
B<- apply(A,1,out.omitter)                                # Bはなぜか行と列が入れ替わってるっぽい。
C<- na.omit(t(B))                                         # だから転置するはめに。
D<- C[c(1:nrow(C)),c(1:ncol(C))]                          # na.omitは後ろに変な子がついてくるので要らない。
# Dの中で重複する配列がある。それらを排除しにかかる。
vec0<- function(Mat){
  M<- mapply(rep,NA,Nout:Nbatter)                         # mapplyは難しい。
  for(y in 1:nrow(Mat)){
    count0<- 0
    nector0<- c()
    for(r in 1:ncol(Mat)){
      if(Mat[y,r] == 0){
        count0<- count0 + 1
      }
      if(count0 == Nout){
        vector0<- Mat[y,c(1:r)]
        break
      }
    }
    M[[length(vector0)-Nout+1]]<- rbind(M[[length(vector0)-Nout+1]],vector0)
  }
  return(M)
}
# M<- mapply(rep,NA,Nout:Nbatter)のNAを排除しにかかる。
NA.omit<- function(Mat){
  return(na.omit(Mat)[c(1:nrow(na.omit(Mat))),c(1:ncol(na.omit(Mat)))])
}
# さあがんばれ。
E<- vec0(D)
F<- lapply(E,NA.omit)
G<- lapply(F,unique)        # uniqueで重複したものが統一される。ベクトルにも使える。
# これと同じ。
lapply(lapply(vec0(D),NA.omit),unique)

ここまで。これ以降は

# 打撃確率をがちゃがちゃかけていってるだけ。
score.probability<- function(seq){
  runner<- rep(0,Nbase)
  runner.prob<- 1
  out<- 0
  for(k in 1:length(seq)){
    if(!seq[k] == 0){
      runner<- c(runner,c(1,rep(0,(seq[k] - 1))))
      runner.prob<- runner.prob*Bprob[seq[k]+1]
    }else{
       runner.prob<- runner.prob*Bprob[seq[k]+1]
       out<- out + 1
       }
    if(out == Nout){
      break
    }
  }
  runner<- runner[1:(length(runner) - (Nbase - 1))]
  #runner<- runner[-c((length(seq) - Nbase + 1):length(seq))]
  return(list(sum(runner),runner.prob))
}
# 得点に対する確率的なやつ。
Result<- function(Matrix){
  Score<- 0:max(Matrix[1,])
  Probability<- rep(0,length(Score))
  for(t in 0:max(Matrix[1,])){
    Probability[t+1]<- sum(Matrix[2,which(F[1,]==t)])
  }
  return(Probability)
}

 
ABCDのところ

D<- na.omit(t(apply(res,1,out.omitter)))
D<- D[c(1:nrow(D)),c(1:ncol(D))]

と書ける。