Mon Aug 26 09:51:59 JST 2013

またJ言語 FizzBuzz書くなどしてみよう

J言語でifやforなどの制御構造は用意はされてるけど それを使うのはJ言語らしくな〜い というどこかに書いてあった気がするので使わないことにしよう

idx n | n `mod` 15 == 0 = 3
      | n `mod` 5 == 0 = 2
      | n `mod` 3 == 0 = 1
      | n `mod` 1 == 0 = 0

fizzbuzz n = [show n, "Fizz", "Buzz", "FizzBuzz"] !! (idx n)

main = print $ map fizzbuzz [1..100]

思いついたのは,こういうやり方

idx =: (0=5|]) + 2 * 0=3|]

大変そのままである もっとJらしく書くべきかもと

idx =: +/ @ (1 2 # 0=3 5 |])

書いててわかったことに,Jでは全ては右結合と思っていたけれど, @のような接続詞は例外らしい 詰めれば,短くはなってるか?でも分かりにくくは,なった

   table =: 13 : '(y; ''Fizz''; ''Buzz''; ''FizzBuzz'')'
   table
(<;._1 ' Fizz Buzz FizzBuzz') ;~ ]

13 : 'hogehoge' という明示的定義をすれば,新しい演算子を学べる

   table 0
┌─┬────┬────┬────────┐
│0│Fizz│Buzz│FizzBuzz│
└─┴────┴────┴────────┘
   table 1
┌─┬────┬────┬────────┐
│1│Fizz│Buzz│FizzBuzz│
└─┴────┴────┴────────┘

   fizzbuzz =: idx { table

できた!

   fizzbuzz"0 (i.6)
┌────────┬─┬─┬────┬─┬────┐
│FizzBuzz│1│2│Buzz│4│Fizz│
└────────┴─┴─┴────┴─┴────┘

文字列を入れるためにボックス使ったけど Open (アンボックス)するのは > という演算子だったはず

   > fizzbuzz"0 (i.6)
|domain error
|       > fizzbuzz"0(i.6)

あー,Openはボックスから配列にするけど,配列ってのは中の型が揃ってる のが前提なのだった.

": は整数を文字列に変換する

   table =: 13 : '(": y); ''Fizz''; ''Buzz''; ''FizzBuzz'' '
   table
(<;._1 ' Fizz Buzz FizzBuzz') ;~ ":
   fizzbuzz 24
Fizz
   fizzbuzz"0 (i.6)
FizzBuzz
1
2
Fizz
4
Buzz

なんか勝手に改行されて表示されてるのが怪しいけど,できた!


この (<;._1 ' Fizz Buzz FizzBuzz') ;~ ": については
http://www.jsoftware.com/help/dictionary/d331.htm

_1 という数字に一般の意味はない? ただ m ;. _1 の場合, ' hoge fuga' という文字列を hoge , fuga に分割して,それぞれに m を適用して返す,というだけらしい

Mon Aug 26 11:25:46 JST 2013

2013/8/24 (Sat.) に上野,国立科学博物館で「深海」という展示を見ました この日付は幾分か意味を持っていることをメモしておきます

Sun Jan 24 00:44:40 JST 2016

意味が全く思い出せない.