R でじゃんけんを作っていたらいい感じの行列を作ることができた

MikuHatsune2017-05-30

進捗ツライ。
 
こぞってR でのじゃんけん関数が作られる。
ここで、R のベクトルを用いて条件分岐を作っている。
 
R novice としてはグー、チョキ、パーの自分/相手の出す3*3=9 通りをすべて出し尽くせば、やりたいことはなんとかできる。というわけで、outer 関数を使えばこれはできる。
ここで、9通りの手の組み合わせで、勝敗を確定したい。このとき、グーG、チョキC、パーPと勝ちW、負けL、引き分けTのパターンは
\begin{matrix} & G & C & P \\ G & T & W & L \\ C & L & T & W \\ P & W & L & T \end{matrix}
となる。これをいい感じに一発で書きたい。
というのも、v=(x,y,z) みたいなベクトルがあるときに、全く同じように
\begin{pmatrix}x & y & z \\ z & x & y \\ y & z & x\end{pmatrix}
みたいな行列を作りたい、という場面は、たぶんある。
こういうときにベタに書いておくのもいいが、なんか一発でかっこよく書きたい。
というわけで悩んで見つけたのが、これ。

GCP <- c("Gu", "Chi", "Pa")
M <- outer(10*(1:3), 1:3, "-")
colnames(M) <- rownames(M) <- GCP
    Gu Chi Pa
Gu   0   2  1
Chi  1   0  2
Pa   2   1  0

こうすれば、9通りの場合の数から、3パターンへの分岐が一気に数値演算だけでできる。

janken <- function(){
  GCP <- c("Gu", "Chi", "Pa")
  YOU <- menu(GCP, title="Your janken ?")
  CPU <- sample((1:3), size=1)
  wl <- switch((10*YOU-CPU)%%3+1, "Tie", "Lose", "Win")
  sprintf("%s !! You:%s vs R:%s", wl, GCP[YOU], GCP[CPU])
}
janken()
Your janken ? 

1: Gu
2: Chi
3: Pa
### ここでコンソールに記入する
Selection: 1
[1] "Win !! You:Gu vs R:Chi"