またまたdcコマンドです。
スタックをさかさまにします。
適当に数字を積みます。
1 2 3 4 5
今のスタックの状態です。
| |
| 5 |
| 4 |
| 3 |
| 2 |
| 1 |
+-------+
stack
一番上とその下をひっくり返します。
r
| |
| 4 |
| 5 |
| 3 |
| 2 |
| 1 |
+-------+
stack
スタックの一番上の数字を、レジスタaのスタックへ積みます。
Sa
| | | |
| 5 | | |
| 3 | | |
| 2 | | |
| 1 | | 4 |
+-------+ +-------+
stack a stack
これを繰り返していくと、5だけになります。
| | | |
| | | 1 |
| | | 2 |
| | | 3 |
| 5 | | 4 |
+-------+ +-------+
stack a stack
次はレジスタaのスタックからメインスタックに戻します。
全部戻すと、このようになります。
LaLaLaLa
| | | |
| 4 | | |
| 3 | | |
| 2 | | |
| 1 | | |
| 5 | | |
+-------+ +-------+
stack a stack
これを繰り返すわけですが、気が遠くなりますね。
配列を使います。添字とこんがらがらないようにスタックに積む数字は2桁にします。
10 20 30 40 50
| |
| 50 |
| 40 |
| 30 | 1 2 3 4 5
| 20 | +--+--+--+--+--+
| 10 | | | | | | |
+-------+ +--+--+--+--+--+
stack a array
スタックの数をスタックに積みます。
z
| 5 |
| 50 |
| 40 |
| 30 | 1 2 3 4 5
| 20 | +--+--+--+--+--+
| 10 | | | | | | |
+-------+ +--+--+--+--+--+
stack a array
一番上のスタックの数字を添え字とする配列に次の数字、つまり5を格納します。
:a
| |
| |
| 40 |
| 30 | 1 2 3 4 5
| 20 | +--+--+--+--+--+
| 10 | | | | | |50|
+-------+ +--+--+--+--+--+
stack a array
順に格納していきます。
z:a
| |
| |
| |
| 30 | 1 2 3 4 5
| 20 | +--+--+--+--+--+
| 10 | | | | |40|50|
+-------+ +--+--+--+--+--+
stack a array
全部配列に格納するとこのようになります。
z:a
| |
| |
| |
| | 1 2 3 4 5
| | +--+--+--+--+--+
| | |10|20|30|40|50|
+-------+ +--+--+--+--+--+
stack a array
次は、逆から戻していきます。
6z-;a
| |
| |
| |
| | 1 2 3 4 5
| | +--+--+--+--+--+
| 50 | |10|20|30|40| |
+-------+ +--+--+--+--+--+
stack a array
最終的にこうなります。
| |
| 10 |
| 20 |
| 30 | 1 2 3 4 5
| 40 | +--+--+--+--+--+
| 50 | | | | | | |
+-------+ +--+--+--+--+--+
stack a array
さて、これをマクロ化して実行したいと思います。
[z:az0<f]sf [6z-;az5>g]sg 10 20 30 40 50 f 50 40 30 20 10 lfxlgxf 10 20 30 40 50
数字5個固定となっていますので、数字の量に合わせて使えるようにします。
[z:az0<f]sf [lz1+z-;azlz>g]sg 10 20 30 f zszlfxlgxf



コメント