ベクトル処理版FizzBuzz

J言語と同じ方法をなぞってみる

1〜15をaに代入
> a = 1:15
> a
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

3の剰余を求める
> a %% 3
 [1] 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0

その結果を0と比較する
> a %% 3 == 0
 [1] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
[13] FALSE FALSE  TRUE

真の位置に対応するaの値を取り出す
> a[a %% 3 == 0]
[1]  3  6  9 12 15

インデックスに対応する場所をFizzで置換する
> replace(a, a[a %% 3 == 0], 'Fizz')
 [1] "1"    "2"    "Fizz" "4"    "5"    "Fizz" "7"    "8"    "Fizz" "10"  
[11] "11"   "Fizz" "13"   "14"   "Fizz"

この処理を関数化
> foo = function(n,s,a) replace(a,(1:15)[1:15 %% n == 0],s)

定義した関数を使ってFizzBuzzを出力
> cat(foo(15,'FizzBuzz',foo(5,'Buzz',foo(3,'Fizz',1:15))))
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz

インデックスに対応する場所を置換する別解
> a = 1:15
> a[1:15 %%  3 == 0] = 'Fizz'
> a[1:15 %%  5 == 0] = 'Buzz'
> a[1:15 %% 15 == 0] = 'FizzBuzz'
> cat(a)
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz

初級Q&A アーカイブ(7) - RjpWiki
Fizz-Buzz問題

http://www.okada.jp.org/RWiki/?%BD%E9%B5%E9%A3%D1%A1%F5%A3%C1%20%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6%287%29#x4e95cdc