連番の生成 | package入門(ユーティリティー編) [講座] | 逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓rpnの実践ウェブ   
rpn hacks! アールピーエヌ・ハックスサイトマップ

rpn | 講座 | package入門 | ポテンシャルを飛躍的に高めるrpnパッケージを学習。

連番の生成

 連続する番号が欲しいことがよくあります。少ない数なら単に数字を並べればよいので、大した技巧は要りません。例えば、次のrpn式を使うと1から10までの数字(数列)が縦に表示されます。

  >rpn 1 2 3 4 5 6 7 8 9 10 | rpn 1 -c fold'
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10

技巧的な数列生成

 10個くらいなら面倒には思いませんが、より多くの数字が欲しくなると大変です。そこで、同じ1から10までの数字を作るにしても、ちょっと技巧を凝らしたのが、次のrpn式です。nレジスタを1ずつ増やす動作を10回繰り返していますね。

  >rpn @n 1 + #n @n -r 10
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10


これは等差数列というもので、数字と数字の差が一定です。上の例では数字と数字が等しく、1ずつ間が開いています。

もっと楽に数列を生成

 この等差数列を楽に作り出すことはできないでしょうか。そこで、ユーティリティーパッケージではseqプログラムを用意しました。seqは開始、終了、増分を順に指定することで等差数列を作ってくれます。以下の例で試してみましょう。

  >rpn 1 10 1 -c seq
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10


開始が1、終了が10、増分が1の数列を生成していますね。ちなみに開始を2にして、増分を2にするとどうなるでしょうか。

  >rpn 2 10 2 -c seq
  2
  4
  6
  8
  10


2から10までの偶数だけが表示されました。このseqプログラムを使えば、今まで面倒だった数列の作成が簡単にできます。

ちなみに、今までと同様、seqにも横に表示するタイプのプログラムもあります。ダッシュ付きのseq'で、開始、終了、増分の指定はseqと同じです。

  >rpn 2 10 2 -c seq'
  2 4 6 8 10


縦が横に変わっただけですから、簡単ですね。

当然ですが、開始、終了、増分はマイナスの数値でも構いません。以下は10から1まで1つずつ数値が小さくなっていく例と、5から-5まで2つずつ小さくなっていく例です。seq'を使ってみましょう。

  >rpn 10 1 -1 -c seq'
  10 9 8 7 6 5 4 3 2 1

  >rpn 5 -5 -2 -c seq'
  5 3 1 -1 -3 -5

数列生成の省略形

 このseqプログラムですが、より使いやすくするために開始と増分の省略ができるようになっています。まず、増分を省略する例を試してみましょう。

  >rpn 1 10 -c seq'
  1 2 3 4 5 6 7 8 9 10


このように増分が1の場合、省略することができます。同様に開始が1の場合も省略できます。以下のrpn式でも上の例と同じように、1から10までの数列を生成できます。

  >rpn 10 -c seq'
  1 2 3 4 5 6 7 8 9 10

小数点には注意

 開始、終了、増分には小数点を伴った数値も指定することができます。次のrpn式は1から2.5ずつ増加させた場合の数列です。

  >rpn 1 10 2.5 -c seq
  1
  3.5
  6
  8.5


問題なさそうですね。しかし、次の例を見てください。

  >rpn 1 2 .1 -c seq
  1
  1.1
  1.2
  1.3
  1.4
  1.5
  1.6
  1.7
  1.8
  1.9


最後に2が表示されるはずなのですが、表示されていません。これはパソコンが小数点をうまく扱えないからです。小数点の演算を繰り返すとピッタリとした数値にならないことがあるのです。

例えば、数学では0.01を100回足すと1になりますが、パソコンで同じことをすると1にはなりません。従って、小数点を含む場合は、きちんと思ったとおりの数列ができているかを確認する癖を付けたほうがいいでしょう。

上の例にあるような、1から2まで0.1ずつ増加させる数列を作りたい場合は、以下のrpn式を使えば問題はなくなります。

  >rpn 10 20 -c seq | rpn .1 *
  1
  1.1
  1.2
  1.3
  1.4
  1.5
  1.6
  1.7
  1.8
  1.9
  2


整数の数列を作ってから1/10にしていますので、今度はきちんと生成されていることが分かります。

データ分析中にテスト用のデータが欲しいときなど、連番の生成は意外に使うものです。複雑な数列になればプログラムなどで対応するしかありませんが、単純な等差数列ならseqプログラムを使ったほうが圧倒的に早く確実に生成できるので重宝します。

情報本講座で使用したプログラムは、ユーティリティーパッケージとして購入することができます。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。

ユーティリティーパッケージ

ユーティリティー

マイスター

カレンダー

警告文字で作られた図表や式が崩れることがあります。ブラウザによっては固定幅フォントをMSゴシックにするときれいに表示されます。それでも崩れる場合は図表や式をメモ帳にコピー後、閲覧下さい。

警告rpn標準版(2kリビジョン)はダブルクォートで囲ってください。

rpn 1 2 + ⇒ rpn "1 2 +"
rpn 1 -c foo ⇒ rpn "1" -c "foo"

ダブルクォートは省略できることが多いのですが、慣れない間は囲んだほうが無難です。なお、本ウェブサイトの記事ではrpn標準版(98リビジョン)を使用しているため囲っていません。詳しくは技術サポートの「rpn TIPS」を参照ください。

注意rpnの障害情報と対策はこちら