またまた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
コメント