r-statistics-fanの日記

統計好き人間の覚書のようなもの

さや香の見せ算をRで実装する(点対称、線対称を考慮する)

M1楽しかった。
さや香の見せ算をRで実装してみる。

まずは、見せ算を考察する
2と5を見間違うわけだから、あまり目はあまり良くない
そして、おそらくデジタルの数字であろう
なので、デジタルの1と、逆さになったデジタルの1は同じと判定されるだろう
0,8も同様
1と100のときに両方に含まれる1は何も考慮されておらず、個々の桁ではなく全体としての判定になっているだろう

11になるのは、点対称。6と9は回転すると完全に重ねることができる
携帯を落として1.1になる似たものは2と5=つまり線対称。そして回転しても決して重ねることはできない。

1vs100のように、100倍以上の差があれば、少ない方の一人あたり17人倒す。残った人の83人あたり1人生まれる

これで実装が可能となる
同値なら0を返す
点対称なら11
線対称なら1.1
100倍以上の差の計算

今回は交換法則は成り立つと仮定する

%見せ%という演算子で実装する
一番下にRのコードを記す

2205 %見せ% 5022 なら、点対称なので完全に重なるため11
2205 %見せ% 2055 なら、線対称なので完全には重ならず1.1

> 1 %見せ% 1
[1] 0
> 6 %見せ% 6
[1] 0
> 6 %見せ% 9
[1] 11
> 9 %見せ% 6
[1] 11
> 2 %見せ% 5
[1] 1.1
> 1 %見せ% 100
[1] 84
> 2205 %見せ% 5022
[1] 11
> 2205 %見せ% 2055
[1] 1.1
> 100 %見せ% 001
[1] 84
> 2 %見せ% 1000
[1] 977
> 10 %見せ% 1000
[1] 840
##さや香 見せ算

sen <- function(x) {
      # 変換ルールを表すベクトル
      rule <- c("0" = "0", "1" = "1", "2" = "5", "5" = "2", "8" = "8")
      
      # 入力の各桁に対して変換を行う
      result <- ""
      chars <- strsplit(as.character(x), "")[[1]]
      chars_rev <- rev(chars)  #逆順に
      #while(chars_rev[1] == "0"){chars_rev <- chars_rev[-1]}  #頭のゼロは許容しない
      
      for (i in 1:length(chars_rev)) {
            digit <- chars_rev[i]
            
            # ルールに従って変換
            if (digit %in% names(rule)) {
                  result <- paste0(result, rule[[digit]])
            } else {
                  # ルールにない場合はNを返す
                  result <- paste0(result, "N")
            }
      }
      # 結果を返す
      return(result)
}

ten <- function(x) {
      # 変換ルールを表すベクトル
      rule <- c("0" = "0", "1" = "1", "2" = "2", "5" = "5", "6" = "9", "9" = "6", "8" = "8")
      
      # 入力の各桁に対して変換を行う
      result <- ""
      chars <- strsplit(as.character(x), "")[[1]]
      chars_rev <- rev(chars)  #逆順に
      #while(chars_rev[1] == "0"){chars_rev <- chars_rev[-1]}  #頭のゼロは許容しない
      
      for (i in 1:length(chars_rev)) {
            digit <- chars_rev[i]
            
            # ルールに従って変換
            if (digit %in% names(rule)) {
                  result <- paste0(result, rule[[digit]])
            } else {
                  # ルールにない場合はNを返す
                  result <- paste0(result, "N")
            }
      }
      # 結果を返す
      return(result)
}


'%見せ%' <- function(x, y){
      if(x > y){z=x;x=y;y=z}
      if(x == y){return(0)}
      else if(as.character(x) == ten(y)){return(11)}
      else if(as.character(x) == sen(y)){return(1.1)}
      else if(x * 100 <= y){return(y - 17 * x + floor((y - 17 * x) / 83))}  #100倍以上の差のときは、小*17を倒して、残ったものの83人に1人増える
      else(return(max(x, y)))
      
}

1 %見せ% 1
6 %見せ% 6
6 %見せ% 9
9 %見せ% 6
2 %見せ% 5
1 %見せ% 100
2205 %見せ% 5022
2205 %見せ% 2055
100 %見せ% 001
2 %見せ% 1000
10 %見せ% 1000