酔っぱらった勢いで、J言語でFizzBuzzを書くと言ってしまったらしい高井です。くだんのJ言語ですが、http://jsoftware.com/から処理系をダウンロードすることができます。jconsoleを実行すると、対話式のインタプリタが起動します。パスを間違えると、JMXの監視ツールが起動してしまいますので、ご注意ください。
さて、J言語でやってみるといっても、大学2年の頃にやったことなど、すっかり覚えていないわけです。まずは整数列をつくるところから手をつけてみました。ぐぐってやると、i.という演算子が0から引数までの整数列をつくる演算子だということがわかりました。
i. 10 0 1 2 3 4 5 6 7 8 9
今回欲しい数値は、1から始まる数値なわけです。そこで、この集合の要素それぞれに1を足してみましょう。
(i. 10) + 1 1 2 3 4 5 6 7 8 9 10
とりあえず、1から100までの整数列をつくることができました。演算子の優先順位の都合から、表現をかえます。
1 + i. 100 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 8...
ここで、いったんAを1から100の整数列とおきます。
A =. 1 + i. 100
剰余は|という演算子を利用します。
15 | A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10
さて、1から100までの数値のうち、15の倍数の集合を考えてみましょう。剰余が0の場合が割り切れるということですから、剰余が0のときだけ、1というフラグをたてるようにします。ここは、もう聞かないでください。
0 E. 15 | A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
フラグがたっている部分だけをコピーするには#を利用します。
(0 E. 15 | A) # A 15 30 45 60 75 90
X m } Yという式(?)は、インデクスmで指定したYの要素をXにします。例えば、0から9までのうち、3、5、7を0にしたい場合は、次のようにできます。
0 (3 5 7) } i. 10 0 1 2 0 4 0 6 0 8 9
ここまで、くれば後の考え方は単純です。1から100までの数列のうち、15の倍数をFizzに、3の倍数をBuzzに、5の倍数へと修正してあげればいいわけです。というわけで、とりあえず15の倍数から手をつけてみましょう。
'Fizz' (((0 E. 15 | A) # A) - 1) } A |domain error | 'Fizz' (((0 E.15|A)#A)-1)}A
うう……。数値と文字の変換あたりでエラーがでてしまうようです。うまく文字列と数値を置換してあげる方法については、時間切れでした……。心より恥じる。どなたかJ言語ハッカーの方、お助けを!!
-1をFizzBuzz、-2をFizz、-3をBuzzとでも読み替えてあげてください。
A =. 1 + i. 100 A =. _1 (((0 E. 15 | A) # A) - 1) } A A =. _2 (((0 E. 3 | A) # A) - 1 ) } A A =. _3 (((0 E. 5 | A) # A) - 1 ) } A A 1 2 _2 4 _3 _2 7 8 _2 _3 11 _2 13 14 _1 16 17 _2 19 _3 _2 22 23 _2 _3 26 _2 28 29 _1 31 32 _2 34 _3 _2 37 38 _2 _3 41 _2 43 44 _1 46 47 _2 49 _3 _2 52 53 _2 _3 56 _2 58 59 _1 61 62 _2 64 _3 _2 67 68 _2 _3 71 _2 73 74 _1 76 77 _2 79 _3 _2 82 83 _2 _3 86 _2 ...

Jを使って研究をしていた通りすがりです.
知り合いからこのBlogの記事を教えられ,作ってみました.
例えばこんなのどうでしょうか?
' ' (('|' E. B) # i.#B) } B=.}.}:1{":(<'FizzBuzz') (<:(0 E. 15 | A) # A) } (<'Buzz') (<:(0 E. 5 | A) # A) } (<'Fizz') (<:(0 E. 3 | A) # A) } <"0 A=.>:i.100
(1行)
もしくは,
FizzBuzz=: 3 : 0
' ' (('|' E. B) # i.#B) } B=.}.}:1{":(<'FizzBuzz') (<:(0 E. 15 | A) # A) } (<'Buzz') (<:(0 E. 5 | A) # A) } (<'Fizz') (<:(0 E. 3 | A) # A) } <"0 A=.>:i.y.
)
として,
FizzBuzz 100
でしょうか.(これは1行で書くのは僕の能力では無理でした・・・)
いかがでしょうか?
J言語ハッカー!! 一見して、さっぱりわからないのがすごいです!!
>J言語ハッカー!!
いえいえ.通りすがりのJを使っていた学生です・・・.あくまで所属している研究室の先生がJ使いという影響でJを使っていただけで・・・.
プログラムの簡単な解説を付け忘れていました.
takeiさんのプログラムですと,
3の倍数をFizzにしたりするところで,数値の列に文字を代入しようとしてエラーが起きていると思われます.
まず,数値列をいったんボックス(と呼ばれる1つずつの区切り)に入れ,3,5,15の倍数をFizz等に変換します.
その後ボックスを解きたいのですが,どうもうまくいかなかったので,強引に文字の変換をして答えを導いています.
もっとうまいやり方があるような気がするのですが,今の僕の実力ではこんな感じです・・・.
たびたびすいません.
上記のプログラムだと,JのVersion6(の少なくともWindows版)だとうまくいかないみたいです・・・.
いえいえ、情報ありがとうございます!