さや香の見せ算を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