2013-04-14 10 views
9

In poscritto, l'operatore roll è molto generale e di difficile visualizzazione. Come ti assicuri di essere nella giusta direzione?Come si mantiene l'operatore `roll` dritto?

voglio ottenere una maniglia solida su roll perché voglio essere in grado di trasformare le funzioni usando le variabili

/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 

in funzioni che utilizzano manipolazioni di stack, più simile a

/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 

o

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

Questi dovrebbero entrambi essere eseguiti più velocemente avendo meno name-lookups (ricerca con hashtable).

Con roll Devo sempre provarlo; e io di solito sbagliarmi al primo tentativo! Sto bene con exch, anche se

+0

Questa domanda è ideata per motivare la risposta (Condividi le tue conoscenze). Eventuali suggerimenti per il miglioramento sono sollecitamente sollecitati. –

risposta

9

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> 
+0

Questo è stato compilato dal materiale che ho postato precedentemente in [comp.lang.postscript] (https://groups.google.com/d/msg/comp.lang.postscript/gCGb5UQAmac/TsQOBNVvFKQJ) –

+0

Se hai letto tutto il strada fino qui, * prova la tua comprensione * cercando di leggere la funzione/xpose [qui] (http://stackoverflow.com/a/14600918/733077) che fa una trasposizione di una matrice * 4x4 * appiattita *. La funzione potrebbe essere calcolata in modo da avere tutti i numeri in un array 2d e '{aload pop roll} forall', ma poi non ci sarebbe da nessuna parte scrivere il commento. :) –

1

Semplice detto: se fai qualche rotolo oggetto rotondo, la sua distanza da voi sarà probabilmente maggiore dopo rispetto a prima, a meno di utilizzare qualcosa di diverso da voi mano (ad esempio: una bacchetta magica, ...) per far rotolare l'oggetto.

5 1 roll significa che l'oggetto 1 in cima allo stack si troverà in seguito a una distanza maggiore dalla cima della pila.

10 11 12 13 14 15 16 17 18 19 20 5 1 roll 

è lo stesso di quello

10 11 12 13 14 15 20 16 17 18 19 

Vedete 20 è andato più in profondità, e l'ultimo di cinque elemento di posizione cambiato.

5 in 5 1 roll significa che solo i primi cinque oggetti dallo stack possono tutti cambiare posizione.

-1 e 4 sono lo stesso modulo 5, quindi è facile ricordare che i numeri negativi devono essere modificati per essere positivi prima di applicare questa soluzione.