Ho avuto difficoltà con il rotolo per un tempo molto lungo. Lo ricordo ora usando questi modi, che sono tutte equivalenti:
la rima (-ish)
nj rotolo
j positiva, di rotolare via
7 8 9 3 1 roll
% 9 7 8
negativo, per tornare indietro (o "negateeve, per poi recuperare")
% 9 7 8
3 -1 roll
% 7 8 9
pila (delle cose)
Forse un modo migliore per pensare di esso è una pila fisica (di libri, per esempio) quindi la cima dello stack è letteralmente "in cima".
Poi un rotolo positiva va su:
for j number of times
pick up n books
put the top one on the bottom (shifting the substack "up")
put them back down
e un rotolo negativo va giù:
for j number of times
pick up n books
put the bottom one on top (shifting the substack "down")
put them back down
lateralmente
Ma io di solito immagino la pila di lato, il modo in cui gli oggetti guarderebbero in un file come una sequenza di valori letterali. Quindi penso a il tiro positivo come se stentassi le cose migliori di j dietro l'ennesima cosa ; e il negativo rotola come oggetti j di avviamento a partire da con l'ennesima cosa. Dare e prendere.
Assente.
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
E indietro.
__ 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
lanugine-rullo
Ancora un altro modo è quello di immaginare lateralmente e definisce una ruota adesiva su alto (a lanugine-rulli, forse)
(a) (b) (c) (d) (e) 5 3 roll
_______
/ \
| 3 |
|/| \ |
\_______/
(a) (b) (c) (d) (e)
Poi un il rotolo positivo va in senso antiorario proprio come l'arco e ruota.
_______ (e)
/ /\
| 3 --| (d)
| \ |
\_______/ (c)
(a) (b)
(e)__(d)__(c)
/\ | /\
| 3 |
| |
\_______/
(a) (b)
(c)_______
/\ \
(d) |-- 3 |
|/ |
\_______/
(e) (a) (b)
_______
/ \
| 3 |
|/| \ |
\_______/
(c) (d) (e) (a) (b)
e un rotolo negativo va in senso orario come arcn e una rotazione negativa.
_______
/ \
| 3 |
|/| \ |
\_______/
(a) (b) (c) (d) (e)
(a)_______
/\ \
(b) |-- 3 |
|/ |
\_______/
(c) (d) (e)
(c)__(b)__(a)
/\ | /\
| 3 |
| |
\_______/
(d) (e)
_______ (c)
/ /\
| 3 --| (b)
| \ |
\_______/ (a)
(d) (e)
_______
/ \
| 3 |
|/| \ |
\_______/
(d) (e) (a) (b) (c)
eliminare il negativo
Non dovrebbe essere difficile vedere che rotola negativi sono del tutto inutile perché se j < 0, può essere sostituito da n-j. per esempio.
3 -1 roll % roll bottom 1 element from 3 to the top
3 2 roll % roll top 2 elements behind the 3rd
sono gli stessi.
16 -4 roll % roll bottom 4 elements from 16 to the top
16 12 roll % roll top 12 elements behind the 16th
sono gli stessi.
Questo porta alla vista finale, finale semplificata (anche se ognuna delle precedenti funzionerà, anche).
Roll è solo un grande Swap
Sei davvero solo scambiando i primi j elementi con i n-j elementi di sotto di tale.
Diciamo che avete questo pasticcio sulla pila (dove $ TOS $ segna la cima della pila), e desidera ordinare in modo corretto:
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$
Conteggio incrementale (verso il basso) per n e 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
Un valore negativo per j posiziona semplicemente tale linea di demarcazione rispetto all'elemento più profonda tra le n elementi (conta dal basso).
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
Ecco una funzione convenienza che fornisce un'interfaccia a rotolare che è più strettamente analoga alla grande scambio vista.
% 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
uscita:
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>
Questa domanda è ideata per motivare la risposta (Condividi le tue conoscenze). Eventuali suggerimenti per il miglioramento sono sollecitamente sollecitati. –