私は非常に長い間ロールに苦労していました。これらの方法を使用して覚えていますが、これらはすべて同等です。
韻 (-ish)
ニューロール
スタック(物の)
おそらく、それを考えるより良い方法は、物理的なスタック (本など) であるため、スタックの一番上は文字通り「一番上」です。
次に、正のロールが上がります。
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$
nとjをカウントアップ (ダウン) します。
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>