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

One response to “dcスタックを逆順に

  1. Wonderful work! This is the kіnd of info that
    are supposed tο be shareɗ аcross the internet. Disgrаce on Googⅼe
    for not posіtioning this ρublish upper! Come օn over and
    visit my site . Tһanks =)

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA