N進法、N進数の数字


2進法とか16進法、36進法で桁の位があがったり、10進数に変換したりとか、理屈ではわかっても、テストで計算はできてもなんとなくすとんとわかった気がしません。
そんなときにも活躍するのがJ言語です。

   i.20   NB.ふつうは10進法です
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   2b101   NB.101は2進数では5
5
   3b101   NB.101は3進数では10
10
   36b101   NB.101は36進数では1297
1297
   36babc   NB.abcは36進数では13368
13368
   36bz
35
   16bff
255
   2 #.1 0 1   NB.#.という動詞で変換もできます
5
   3 #.1 0 1
10
   36 #.1 0 1
1297
   36 #. a b c
domain error
36 #.a b c
36 #.10 11 12 13368 36 #.35 35 16 #.15 15 255

とりあえずこんな感じですが、逆に2進数で表したり、36進数で表したりしたいときはどうするか。
C言語Rubyではprint文でフォーマットして文字列にするのだったよなぁと思い出しつつ、たぶんそのやり方もあると思う。


逆関数(^:_1)を使ってできるかどうかと思いついたので実験です。

   2 ( #.^:_1) 5
1 0 1
   3 ( #.^:_1) 5
1 0 1
   3 ( #.^:_1) 10
1 2
   3 ( #.^:_1) 10
1 0 1
   36 ( #.^:_1) 1297
1 0 1
   36 ( #.^:_1) 13366
10 11 10
   16 ( #.^:_1) 255
15 15

なんか工夫すればできそうですね。とりあえず、数字だけ1桁の結果なら次のように出来ます。

   $ ,":"0 (#.^:_1) 25   NB.1 1 0 0 1という配列にして、それを文字に変換
11001