電卓時計 | rpn入門(中級編) [講座] | 逆ポーランド電卓の実践ウェブ rpn hacks!

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

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

rpn | 講座 | rpn入門 | rpnの使い方を基本から応用まできちんと学習。

HOME > 講座 > rpn入門 > 中級編 > 電卓時計 hatena yahoo buzzurl livedoor del.icio.us nifty newsing twitter facebook rss ソーシャルブックマーク

電卓時計

 rpnは電卓なのですが、簡単な計時機能を持っています。具体的には計時記号の「w」を使うことで、現在の時刻を知ることができます。以下のrpn式を入力してみます。

  >rpn w -fd
  1286681950


これは1970年1月1日(0時0分0秒)からの経過秒数を示しています。現在の秒数だけを知りたい場合は、60で割って余りを出せばOKです。

  >rpn w 60 %
  36


36秒ですね。すぐに同じことを実行してみましょう。

  >rpn w 60 %
  45


9秒経過していることが分かりますね。

体感時間ゲーム

 人間には体感時間があります。数秒くらいなら結構、正確だろうと思います。そこで、体感時間が合っているかどうか確かめる簡単なゲームを作ってみましょう。

ゲームは簡単です。目を瞑って5秒間経ったと思ったらENTERキーを押します。ピッタリ5秒になるか10回試してみましょう。以下のrpn式を実行すると待ち状態になるので、5秒経過したと思ったらENTERキーを押してください。これを10回繰り返します。

  >rpn w #t d _ w @t - -r 10
  5

  4

  4

  5

  5

  5

  5

  5

  5

  4


ENTERキーを押すので改行されて空行ができていますが、気にしないでください。ゲームの結果ですが、体感時間は意外に正確です。10回中、7回は5秒ピッタリです。

体感時間ギャンブル

 もう少し悪乗りしてギャンブル系のゲームにしてみましょう。同じく5秒間の体感時間を計りますが、今度は5秒ピッタリなら2000円貰えます。逆に外れたら(体感時間が長くても短くても)1000円払ことにします。

10回やったらどうなるでしょう。儲けられるでしょうか。前の実験ではピッタリ5秒が70%でした。皮算用なら7回×2000円-3回×1000円で1万1000円の儲けになるはずです。

まずデータ処理を考慮して、体感時間をファイルに格納していくことにしましょう。以下のrpn式でlap.txtに時間が格納されます。

  >rpn w #t d _ w @t - -r 10 >lap.txt


目を瞑って5秒間隔に10回、淡々とENTERキーを押下します。終了したら、lap.txtに時間が格納されているはずです。確認してみます。

  >type lap.txt
  3
  5
  4
  5
  4
  4
  5
  4
  6
  7


時間の保存は大丈夫ですね。次にそれぞれの値から5秒を引きます。

  >rpn 5 - <lap.txt
  -2
  0
  -1
  0
  -1
  -1
  0
  -1
  1
  2


計算結果が0ならピッタリ、それ以外なら外れです。勝ったのか負けたのか、もっと分かりやすくしたいときは演算記号の「z」を使うとよいでしょう。数値の正負に従って、+1(正)、-1(負)、0(零)の符号に変換してくれます。

  >rpn 5 - <lap.txt | rpn z
  -1
  0
  -1
  0
  -1
  -1
  0
  -1
  1
  1


0が勝ったとき、それ以外の1と-1が負けたときです。このデータから負けた金額と買った金額を計算してみましょう。

まず、損失額ですが符号変換してから絶対値にします。合計すると負けた数になるので、-1000(円)を掛ければ損失額です。

  >rpn 5 - <lap.txt | rpn z a -c sum | rpn -1000 *
  -7000


次に利益額ですが、同様に符号変換してから絶対値にします。1を引いてから符号反転して合計すれば勝った数が分かります。2000(円)を掛ければ利益額です。

  >rpn 5 - <lap.txt | rpn z a 1 - m -c sum | rpn 2000 *
  6000


差し引きすると、1000のマイナスでしたね。お金が掛かると冷静に秒数をカウントできなくなったようです。あなたならどれくらいの掛け率なら、このギャンブルに乗りますか。

処理時間の計測(ラップタイム)

 さて、最後にまじめな例を示しておきます。複雑な作業をする数式やプログラムなどの場合、処理する前に時間をレジスタにコピーしておいて、処理後の時間から引けば処理時間が分かります。

例えば、コンピュータ上でチンチロリンを3万回繰り返すと、どれくらいの時間が掛かるか計測できます。-bオプションで処理を開始する前に時間をtレジスタに保存しておいて、-eオプションで現在の時間からtレジスタの値を引けば処理時間が出てきます。

  >rpn 6 ? 6 ? 6 ? __ -r 30000 -b w #t -e w @t -
  2


僅か2秒ですね。より高速なコンピュータなら0秒のはずです。なお「__」はスタックの全ての値を消去するスタック操作記号です。「_」を3回繰り返してもいいのですが、スタックに積まれた数が多いときは一括で削除できるので便利です。

ちなみに「_,」とするとスタックに最後に積まれた数値を除いて全て削除します。要は最後の数値だけが残ります。意外に重宝する使い方です。
        *


 コマンドラインで複数行に渡って計算したり、バッチでの処理が必要な場合は、以下のように一旦、開始時間をファイルに格納します。

  >rpn w -fd >start.txt
        :
  バッチ等の処理
        :
  >rpn w -fd >end.txt


処理後も同じように時間をファイルに格納します。今回はstart.txtとend.txtに保存されています。

  >paste end.txt start.txt | rpn -


最終的に2つのファイルをpasteして、rpnで引き算すれば経過秒数が計算できます。このように、ラップ(lap)ではなくラップ(wrap)するわけです。

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

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

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

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

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

警告rpn試用版の場合、複雑なプログラムや処理時間のかかるプログラムの一部には動作しないものがあるかもしれません。あくまで無料提供であることを勘案・了承ください。rpn標準版は、すべてのプログラムが動作します。