手順

  • こちらFizzBuzz問題というのを扱われている
  • こちらではFizzBuzz問題の背景について触れられている
  • こちらでプログラムを組む群とプログラムを組まない群とが2峰性の分布を作る話がされている
    • 2峰性を成す形質と1峰性を成す形質との、違いは何だろう?
      • 男女は「(男)性決定因子」の存在で分ける
      • 枝分かれ・結晶成長などでは、「過去」に上乗せする確率過程が「分岐」を作る
  • この問題の特徴は、「実行結果」が合っているか間違っているかの判定を、(プログラムを書く人が)すぐに判断できること
  • プログラムを書くときに、「どういう作業結果になるか」が「スカッと」わかった状態で書くことは大事
  • さて。この問題は、
  • 「1から順に数えていく」
    • 「数える〜序数」さえわかれば、割り算とか掛け算とか割り切れるとか剰余とか公倍数か何も要らない
  • 「条件が2種類ある」
    • 「k段ごと増える」・・・k個で元に戻る
      • k = k1,k2
    • 「xから始める」
      • x = x1,x2
  • 「2種類の条件から2通りの条件にする」
    • x1から始めてk1段ごと
    • x2から始めてk2段ごと
  • 「2通りの条件を組み合わせて2^2=4条件にする」・・・公倍数というのは条件の組み合わせ
  • こうしておけば、k=k1,k2,...ktになったり、x=x1,x2,...,xtになったりしても、t^2 の場合分けにすることだし、場合分けをした、それぞれの場合が実在するかどうかとかも特に気にしなくてよさそう
  • ひとまず、3と5とで割り切れる、という具体例を
# 2つの条件を決める2つの変数
k1 <- 3
k2 <- 5
# 2つの条件はともに「倍数・割り切れる」と同じなので、「初期値」は同じ
cnt1 <- 1
cnt2 <- 1
n <- 100
for(i in 1:n){
	#print(i)
	if(cnt1 == 0){
		if(cnt2 == 0){
			print("fizzbuzz")
		}else{
			print("fizz")
		}
	}else{
		if(cnt2 == 0){
			print("buzz")
		}else{
			print(i)
		}
	}
	cnt1 <- cnt1 + 1
	cnt2 <- cnt2 + 1
	if(cnt1 == k1){
		cnt1 <- 0
	}
	if(cnt2 == k2){
		cnt2 <- 0
	}
}
  • ついで、任意の条件数にする
# 条件数
t <- 5
# 条件数だけ、kiごと、という値を作る(相互に異なる数)
ks <- sample(5:20,t)
# それぞれの開始数(余りの数、とも言う)
xs <- sample(1:4,t,replace = TRUE)
# fizz, buzzの代わりにアルファベット1文字を
L <- letters[1:t]

n <- 100
# 条件ごとに、「状態を数え上げるためのベクトル」
cnts <- xs
for(i in 1:n){
# 条件合致の判定をしてそれに相当するアルファベットをつないでプリント
	tmp <- paste(L[which(cnts ==0)],sep="")
	if(length(tmp)==0){
		tmp <- i
	}
	
	print(tmp)
# 条件を「1段進める」
# kの値ごとに、「元に戻す(ki進数の1桁目)」にする
	cnts <- cnts + 1
	for(j in 1:t){
		if(cnts[j] == ks[j]){
			cnts[j] <- 0
		}
	}
}
  • 条件を任意にした上で、それを「3,5、割り切れる」にして、再度実行
# 条件数は2
t <- 2
# 2つの数値は3,5
ks <- c(3,5)
# 開始点は同じ
xs <- c(1,1)

L <- letters[1:t]
# L <- c("fizz","buzz")としても・・・
n <- 100
cnts <- xs
for(i in 1:n){
	tmp <- paste(L[which(cnts ==0)],sep="")
	if(length(tmp)==0){
		tmp <- i
	}
	
	print(tmp)
	cnts <- cnts + 1
	for(j in 1:t){
		if(cnts[j] == ks[j]){
			cnts[j] <- 0
		}
	}
}
  • 結果3様
[1] 1
[1] 2
[1] "fizz"
[1] 4
[1] "buzz"
[1] "fizz"
[1] 7
[1] 8
[1] "fizz"
[1] "buzz"
[1] 11
[1] "fizz"
[1] 13
[1] 14
[1] "fizzbuzz"
[1] 16
[1] 17
[1] "fizz"
[1] 19
[1] "buzz"
[1] "fizz"
[1] 22
[1] 23
[1] "fizz"
[1] "buzz"
[1] 26
[1] "fizz"
[1] 28
[1] 29
[1] "fizzbuzz"
[1] 31
[1] 32
[1] "fizz"
[1] 34
[1] "buzz"
...
[1] 1
[1] 2
[1] 3
[1] 4
[1] "e"
[1] 6
[1] 7
[1] "d"
[1] 9
[1] "e"
[1] 11
[1] "a"
[1] 13
[1] "b"
[1] "e"
[1] 16
[1] 17
[1] "c" "d"
[1] 19
[1] "e"
[1] 21
[1] 22
[1] 23
[1] 24
[1] "a" "e"
[1] 26
[1] 27
[1] "d"
[1] "b"
[1] "e"
[1] 31
[1] 32
[1] 33
[1] 34
[1] "e"
[1] 36
[1] 37
[1] "a" "c" "d"
[1] 39
[1] "e"
[1] 41
[1] 42
[1] 43
[1] "b"
[1] "e"
[1] 46
[1] 47
[1] "d"
[1] 49
[1] "e"
[1] "a"
[1] 52
[1] 53
[1] 54
[1] "e"
[1] 56
[1] 57
[1] "c" "d"
[1] "b"
[1] "e"
[1] 61
[1] 62
[1] 63
[1] "a"
[1] "e"
[1] 66
[1] 67
[1] "d"
[1] 69
[1] "e"
[1] 71
[1] 72
[1] 73
...
[1] 1
[1] 2
[1] "a"
[1] 4
[1] "b"
[1] "a"
[1] 7
[1] 8
[1] "a"
[1] "b"
[1] 11
[1] "a"
[1] 13
[1] 14
[1] "a" "b"
[1] 16
[1] 17
[1] "a"
[1] 19
[1] "b"
[1] "a"
[1] 22
[1] 23
[1] "a"
[1] "b"
[1] 26
[1] "a"
[1] 28
[1] 29
[1] "a" "b"
[1] 31
[1] 32
[1] "a"
[1] 34
[1] "b"