FizzBuzz(完成)

J言語でFizzBuzz - recompile.net

http://recompile.net/2007/05/jfizzbuzz.html

どうやら数値や文字列をボックス化すると同じベクトルの中で共存出来るらしい

nに1〜15を代入
   n =. 1 + i. 15
   n
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

数値ベクトルをボックスベクトルに変換
   ;/n
+-+-+-+-+-+-+-+-+-+--+--+--+--+--+--+
|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|
+-+-+-+-+-+-+-+-+-+--+--+--+--+--+--+

ボックスならば数値と文字列が共存出来る
   (<'Fizz') (_1+ n #~ 0= 3| n) } ;/n
+-+-+----+-+-+----+-+-+----+--+--+----+--+--+----+
|1|2|Fizz|4|5|Fizz|7|8|Fizz|10|11|Fizz|13|14|Fizz|
+-+-+----+-+-+----+-+-+----+--+--+----+--+--+----+

置換処理を演算子化する(中置演算子のタイプは4)
   foo =. 4 : '(1{ x.) (_1+ n #~ 0= n |~ > 0{ x.) } y.'

fooがちゃんと動くかテスト
   (3;'Fizz') foo ;/n
+-+-+----+-+-+----+-+-+----+--+--+----+--+--+----+
|1|2|Fizz|4|5|Fizz|7|8|Fizz|10|11|Fizz|13|14|Fizz|
+-+-+----+-+-+----+-+-+----+--+--+----+--+--+----+

BuzzとFizzBuzzも処理させる
   (15;'FizzBuzz') foo (5;'Buzz') foo (3;'Fizz') foo ;/n
+-+-+----+-+----+----+-+-+----+----+--+----+--+--+--------+
|1|2|Fizz|4|Buzz|Fizz|7|8|Fizz|Buzz|11|Fizz|13|14|FizzBuzz|
+-+-+----+-+----+----+-+-+----+----+--+----+--+--+--------+

単純にボックスをはずす(>)のは結局数値と文字が混ざってしまうので出来ない
   > (15;'FizzBuzz') foo (5;'Buzz') foo (3;'Fizz') foo ;/n
|domain error
|       >(15;'FizzBuzz')foo(5;'Buzz')foo(3;'Fizz')foo;/n

なので数値の部分もあらかじめ文字化(":)しておく
   > (15;'FizzBuzz') foo (5;'Buzz') foo (3;'Fizz') foo ": L:0 ;/n
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

できた!