13

あとがきでは、roll演算子は非常に一般的で、視覚化するのが困難です。正しい方向に転がっていることをどのように確認しますか?

roll変数を使って関数を変換できるようにしたいのでしっかりと使いこなしたい

/f { % x y z
    /z exch def
    /y exch def
    /x exch def
    x dup mul
    y dup mul
    z dup mul add add % x^2+y^2+z^2
} def

スタック操作を使用して関数に変換します。

/f { % x y z
    3 1 roll dup mul % y z x^2
    3 1 roll dup mul % z x^2 y^2
    3 1 roll dup mul % x^2 y^2 z^2
    add add % x^2+y^2+z^2
} def

また

/f { % x y z
    3 { 3 1 roll dup mul } repeat
    2 { add } repeat      % x^2+y^2+z^2
} bind def

これらは両方とも、名前検索 (ハッシュテーブル検索) が少なくなるため、より高速に実行されるはずです。

roll私はいつもそれをテストする必要があります。そして、私は通常、最初の試行でそれを間違えます! 交換は大丈夫だけど

4

2 に答える 2

12

私は非常に長い間ロールに苦労していました。これらの方法を使用して覚えていますが、これらはすべて同等です。

韻 (-ish)

ニューロール

  • 正の j、転がる

    7 8 9  3 1 roll
    % 9 7 8

  • 否定、取り戻す (または「negateeve、それから取り戻す」)

    % 9 7 8
    3 -1 roll
    % 7 8 9


スタック(物の)

おそらく、それを考えるより良い方法は、物理的なスタック (本など) であるため、スタックの一番上は文字通り「一番上」です。

次に、正のロールが上がります。

   j回
     n 本を拾う
     一番上のものを一番下に置きます(サブスタックを「上に」シフトします)
     それらを元に戻す

そして負のロールが下がります:

   j回
     n 本を拾う
     一番下のものを上に置きます(サブスタックを「下に」シフトします)
     それらを元に戻す

横向き

しかし、私は通常、オブジェクトが一連のリテラルとしてファイル内で見えるように、スタックを横向きに描いています。したがって、正のロールとは、上位 j 個のものを n 番目のものの後ろに隠しておくことだと考えています。そして、n 番目のものから始まる j 個のものがひっかかったときの負のロール。ギブアンドテーク。

あちらへ。

n j roll

__ j > 0 __     move top j elements to the bottom of n

 n            TOS
  -------------|
 |       j     |
 |        -----|
 |       |     |
 V       V     |

 a b c d e f g h

^       |       |
|       |-------|
^           |
 -<-<-<-<-<-
   move

帰ってきた。

__ j < 0 __   move j elements from the bottom of n to the top

 n            TOS
  -------------|
 |     j       |
 |-----        |
 |     |       |
 V     V       |

 a b c d e f g h

|       |       ^
|-------|       |
   |           ^
    ->->->->->- 
       move

リントローラー

さらに別の方法は、それを横向きに想像し、その上に粘着性のあるホイール (糸くずローラーなど) を置くことです。

(a) (b) (c) (d) (e) 5 3 巻

           ________
          / \
          | | 3 |
          | | / | \ |
          \_______/
 (a) (b) (c) (d) (e)

次に正のロールは、円弧と回転のように反時計回りになります。

       ________ (e)
      / / \
      | | 3 --| (ニ)
      | | \ |
      \_______/ (c)
 (a) (b)


   (e)__(d)__(c)
     /\ | /\
     | | 3 |
     | | | |
     \_______/
   (a) (b)


   (c)_______
     /\ \
 (d) |-- 3 |
     |/ |
     \_______/
  (e) (a) (b)


    ________
   / \
   | | 3 |
   | | / | \ |
   \_______/
 (c) (d) (e) (a) (b)

そして、負のロールはアークンと負の回転のように時計回りに進みます。

    ________
   / \
   | | 3 |
   | | / | \ |
   \_______/
 (a) (b) (c) (d) (e)


   (a)_______
     /\ \
 (b) |-- 3 |
     |/ |
     \_______/
  (c) (d) (e)


   (c)__(b)__(a)
     /\ | /\
     | | 3 |
     | | | |
     \_______/
   (ニ) (ホ)

       ________ (c)
      / / \
      | | 3 --| (ロ)
      | | \ |
      \_______/ (a)
 (ニ) (ホ)
           ________
          / \
          | | 3 |
          | | / | \ |
          \_______/
 (d) (e) (a) (b) (c)

ネガティブをなくす

j<0 の場合は nj に置き換えることができるため、負のロールがまったく不要であることを理解するのは難しくありません。例えば。

3 -1 roll  % roll bottom 1 element from 3 to the top
3 2 roll   % roll top 2 elements behind the 3rd

同じだ。

16 -4 roll  % roll bottom 4 elements from 16 to the top
16 12 roll  % roll top 12 elements behind the 16th

同じだ。


これは、最終的な究極の単純化されたビューにつながります (ただし、上記のそれぞれも機能します)。

ロールは単なる大きなスワップです

実際には、上位のj要素をその下のnj要素と交換しているだけです。

スタック ($TOS$ はスタックの一番上を示します) にこの混乱があり、それを適切に並べたいとします。

g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  a  b  c  d  e  f $TOS$

njをカウントアップ (ダウン) します。

g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  a  b  c  d  e  f
26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1
|                                                         | j = 6 .  .  .  .
| n = 26 .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

> 26 6 roll   pstack

 a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

jの負の値は、 n 個の要素の中から最も深い要素 (下から数えます) を基準にしてその分割線を配置するだけです。

t  u  v  w  x  y  z  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s
26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1
.  .  .  .   j = -7 |                                                      |
.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . n = 26 |

> 26 -7 roll  pstack

 a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

これは、大きなスワップビューによりよく似たロールへのインターフェイスを提供する便利な関数です。

% r0..rN  s0..sM  N  M   swap   s0..sM  r0..rN
% a gentler interface to the power of roll
/swap {
    exch 1 index add exch
    roll
} def
0 1 2 3 /a /b /c 4 3 swap pstack

出力:

GPL Ghostscript 8.62 (2008-02-29)
Copyright (C) 2008 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
3
2
1
0
/c
/b
/a
GS<7>GS<7>
于 2013-04-14T09:23:11.723 に答える