dcスタックを逆順に

またまた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

コメント

タイトルとURLをコピーしました