M.2. Scrivere script

Per ciascuno dei compiti sotto elencati, si scriva uno script che svolga correttamente quanto richiesto.

FACILI

Elenco della directory home

Si esegua un elenco ricorsivo della directory home dell'utente e si salvino le informazioni in un file. Questo file va compresso e lo script deve visualizzare un messaggio che invita l'utente ad inserire un dischetto e a premere, successivamente, il tasto INVIO. Alla fine il file dovrà risultare registrato su un floppy disk.

Script autoriproducente

Si scriva uno script che effettui il proprio back up, cioè, copi sé stesso in un file di nome backup.sh.

Suggerimento: si usino il comando cat e l'appropriato parametro posizionale.

Modifica dei cicli for in cicli while e until

Si sostituiscano i cicli for presenti in Esempio 10-1 con cicli while. Suggerimento: si registrino i dati in un array, quindi si passino in rassegna gli elementi dell'array stesso.

Essendo "il più" già fatto, ora si convertano i cicli dell'esempio in cicli until.

Modifica dell'interlinea di un file di testo

Si scriva uno script che legga ciascuna riga del file indicato e la visualizzi allo stdout, ma seguita da una riga bianca aggiuntiva. Questo produrrà, come risultato, un file con interlinea doppia.

Si aggiunga il codice necessario affinché venga effettuato un controllo sui necessari argomenti che devono essere passati allo script da riga di comando (il nome di un file) e per verificare che il file esista.

Una volta certi che lo script funzioni correttamente, lo si modifichi in modo da ottenere una interlinea tripla del file indicato.

Infine, si scriva uno script che rimuova tutte le righe vuote dal file indicato in modo che il testo risulti composto con interlinea singola.

Elenco inverso

Si scriva uno script che si autovisualizzi allo stdout, ma in senso inverso (prima l'ultima riga, poi la penultima, ecc.).

Decompressione automatica di file

Dato come input un elenco di file, questo script interrogherà ciascun file (verificando l'output del comando file) per controllare quale tipo di compressione è stata ad esso applicata. Lo script, quindi, dovrà invocare automaticamente l'appropriato comando di decompressione (gunzip, bunzip2, unzip, uncompress o altro). Se, tra i file indicati, ve ne dovessero essere di non compressi, lo script dovrà visualizzare un messaggio d'avvertimento e non effettuare, su tali file, nessun'altra azione.

ID unico di sistema

Si generi un numero identificativo "unico", di sei cifre esadecimali, per il vostro computer. Non si usi l'inadeguato comando hostid. Suggerimento: md5sum /etc/passwd e quindi si scelgano le prime sei cifre dell'output.

Backup

Si archivino come "tarball" (file *.tar.gz) tutti i file presenti nella vostra directory home (/home/vostro-nome) che sono stati modificati nelle ultime 24 ore. Suggerimento: si usi find.

Verifica di un processo in esecuzione

Dato come argomento l'ID di processo (PID), lo script dovrà controllare, ad intervalli di tempo specificati dall'utente, se quel processo è ancora in esecuzione. Si dovrebbero usare i comandi ps e sleep.

Numeri primi

Si visualizzino (allo stdout) tutti i numeri primi compresi tra 60000 e 63000. L'output dovrebbe essere elegantemente ordinato in colonne (suggerimento: si usi printf).

Numeri della lotteria

Un tipo di lotteria prevede l'estrazione di cinque numeri diversi nell'intervallo 1 - 50. Si scriva uno script che generi cinque numeri pseudocasuali compresi in quell'intervallo, senza duplicazioni. Lo script dovrà dare la possibilità di scelta tra la visualizzazione dei numeri allo stdout o il loro salvataggio in un file, con data e ora in cui quella particolare serie numerica è stata generata.

INTERMEDI

Intero o stringa

Scrivete una funzione per uno script in grado di determinare se l'argomento ad esso passato è un numero o una stringa. La funzione deve restituire TRUE (0) in caso di intero o FALSE (1) se si tratta di una stringa.

Suggerimento: cosa restituisce l'espressione seguente nel caso $1 non sia un intero?

expr $1 + 0

Gestione dello spazio su disco

Si elenchino, uno alla volta, tutti i file della directory /home/nomeutente di dimensioni maggiori di 100K. Ad ogni file elencato si dovrà dare all'utente la possibilità di scelta tra la sua cancellazione o la sua compressione, dopo di che verrà visualizzato il file successivo. Si registrino in un file di log i nomi di tutti i file cancellati nonché la data e l'ora della cancellazione.

Rimozione di account inattivi

Su una rete, degli account inattivi rappresentano uno spreco di spazio del disco oltre che un rischio per la sicurezza. Scrivete uno script d'amministrazione (deve essere invocato da root o dal demone cron) che controlli e cancelli gli account degli utenti inutilizzati da più di 90 giorni.

Rispettare le quote disco

Scrivete uno script, per un sistema multiutente, che verifichi l'utilizzo del disco. Nel caso un utente oltrepassi il limite preassegnato (ad esempio, 100 MB) alla sua directory /home/nomeutente, lo script dovrà inviare automaticamente, a quell'utente, una e-mail d'avvertimento.

Devono essere utilizzati i comandi du e mail. Come opzione, si dovrà poter impostare e controllare le quote usando i comandi quota e setquota.

Informazioni sugli utenti connessi

Per ogni utente connesso, si visualizzi il suo vero nome e la data e l'ora sel suo ultimo login.

Suggerimento: si usino who, lastlog, e si verifichi /etc/passwd.

Cancellazione sicura

Si scriva, in forma di script, il comando per la cancellazione di "sicurezza" srm.sh. I file, passati allo script come argomenti da riga di comando, non verranno cancellati, ma, se non già compressi, dovranno esserlo tramite gzip (per la verifica si usi file), e quindi spostati nella directory /home/nomeutente/trash. Al momento dell'invocazione, lo script controllerà nella directory "trash" i file in essa presenti da più di 48 ore e li cancellerà.

Scambiare soldi

Qual'è la via più efficiente per scambiare $ 1.68, usando il minor numero di monete correntemente in circolazione (fino a 25 cents)? 6 quarti di dollaro, 1 dime (moneta da dieci centesimi di dollaro), un nickel (moneta da 5 centesimi) e tre monete da un centesimo.

Dato come input, da riga di comando, un importo arbitrario espresso in dollari e centesimi ($*.??), si calcoli come scambiarlo utilizzando il minor numero di monete. Se il vostro paese non sono gli Stati Uniti, si può utilizzare la valuta locale. Lo script dovrà verificare l'input e, quindi, trasformarlo in multipli dell'unità monetaria più piccola (centesimi o altro). Suggerimento: si dia un'occhiata a Esempio 23-8.

Equazioni quadratiche

Si risolva un'equazione "quadratica" nella forma Ax^2 + Bx + C = 0. Lo script dovrà avere come argomenti i coefficienti A, B e C, e restituire il risultato con quattro cifre decimali.

Suggerimento: si colleghino i coefficienti, con una pipe, a bc, utilizzando la ben nota formula x = ( -B +/- sqrt( B^2 - 4AC ) ) / 2A.

Somma di numeri di corrispondenza

Si calcoli la somma di tutti i numeri di cinque cifre (compresi nell'intervallo 10000 - 99999) che contengono esattamente due, e solo due, cifre della serie seguente: { 4, 5, 6 }. All'interno dello stesso numero, queste possono ripetersi, nel qual caso la stessa cifra non può apparire più di due volte.

Alcuni esempi di numeri di corrispondenza che soddisfano il criterio più sopra enunciato sono 42057, 74638 e 89515.

Numeri fortunati

Un "numero fortunato" è quello in cui la somma, per addizioni successive, delle cifre che lo compongono dà come risultato 7. Per esempio, 62431 è un "numero fortunato" (6 + 2 + 4 + 3 + 1 = 16, 1 + 6 = 7). Si ricerchino tutti i "numeri fortunati" compresi tra 1000 e 10000.

Ordinare alfabeticamente una stringa

Si pongano in ordine alfabetico (in ordine ASCII) le lettere di una stringa arbitraria passata da riga di comando.

Verifica

Si verifichi il file /etc/passwd e se ne visualizzi il contenuto in un preciso, e facilmente comprensibile, formato tabellare.

Registrare le connessioni

Si scorra il file /var/log/messages e si crei un file ben ordinato contenente le connessioni effettuate da un dato utente con la relativa ora. Lo script deve essere eseguito da root. (Suggerimento: si ricerchi la stringa "LOGIN.")

Visualizzazione intelligente di un file dati

Alcuni programmi per database e fogli di calcolo sono soliti salvare i propri file usando, come separatore di campo, la virgola (CSV - comma-separated values)). Spesso, altre applicazioni hanno la necessità di accedere a questi file.

Dato un file con queste caratteristiche, nella forma:

Jones,Bill,235 S. Williams St.,Denver,CO,80221,(303) 244-7989
Smith,Tom,404 Polk Ave.,Los Angeles,CA,90003,(213) 879-5612
...
si riorganizzino i dati e li si visualizzi allo stdout in colonne intestate e correttamente distanziate.

Giustificazione

Dato come input un testo ASCII, fornito o dallo stdin o da un file, si agisca sulla spaziatura delle parole di ogni riga, con giustificazione a destra, in modo che la stessa corrisponda alle dimensioni specificate dall'utente, inviando, successivamente, il risultato allo stdout.

Mailing List

Usando il comando mail, si scriva uno script che gestisca una semplice mailing list. Lo script dovrà spedire automaticamente, per e-mail, un'informativa mensile della società, il cui testo viene preso dal file indicato, a tutti gli indirizzi presenti nella mailing list, che lo script ricaverà da un altro file specificato.

Creare password

Si generino password di 8 caratteri (compresi negli intervalli [0-9], [A-Z], [a-z]) pseudocasuali. Ogni password dovrà contenere almeno due cifre.

Ricerca di link interrotti

Usando lynx con l'opzione -traversal, si scriva uno script che verifichi i link interrotti presenti in un sito Web.

DIFFICILI

Verifica delle password

Si scriva uno script che controlli e convalidi le password. Lo scopo è quello di segnalare le password "deboli" o che possono essere facilmente indovinate.

Allo script deve essere passata una password di prova, come parametro da riga di comando. Per essere considerata valida, una password deve avere i seguenti requisiti minimi:

  • Lunghezza minima di 8 caratteri

  • Deve contenere almeno un carattere numerico

  • Deve contenere almeno uno dei seguenti caratteri non alfabetici: @, #, $, %, &, *, +, -, =

Facoltativi:

  • Eseguire un controllo di dizionario su tutte le sequenze di almeno quattro caratteri alfabetici consecutivi presenti nella password in verifica. Questo per eliminare quelle password contenenti "parole" che si possono trovare in un normale dizionario.

  • Permettere allo script di controllare tutte le password presenti sul sistema. Possano risiedere, o meno, nel file /etc/passwd.

Questo esercizio richiede la perfetta padronanza delle Espressioni Regolari.

Riferimenti incrociati

Si scriva uno script che generi un riferimento reciproco (concordanza) di un file di riferimento. Il risultato dovrà essere un elenco di tutte le occorrenze delle parole del file di riferimento, assieme ai numeri di riga in cui ciascuna parola si trova. Tradizionalmente, per questo tipo di applicazioni, si dovrebbero usare i costrutti lista collegata. Di conseguenza, nel corso dell'esercizio, si dovranno esaminare a fondo gli array. Esempio 15-11, probabilmente, non è un buon punto di partenza.

Radice quadrata

Si scriva uno script per il calcolo delle radici quadrate dei numeri impiegando il metodo di Newton.

L''algoritmo, espresso in pseudo-codice Bash, è il seguente:

#  Metodo di Newton (Isaac) per velocizzare l'estrazione
#+ delle radici quadrate.
							  
ipotesi = $argomento
#  $argomento è il numero di cui si deve trovare la radice quadrata.
#  $ipotesi è ogni successiva "ipotesi" calcolata -- soluzione per tentativi --
#+ della radice quadrata.
#  La prima "ipotesi" di radice quadrata è l'argomento stesso.
							  
vecchia_ipotesi = 0
# $vecchia_ipotesi è la precedente $ipotesi.
							  
tolleranza = .000001
# Margine di errore di calcolo.
							  
contaciclo = 0
# Tiene traccia delle iterazioni del ciclo.
# Alcuni argomenti richiedono più iterazioni di altri.
							  
							  
while [ ABS( $ipotesi $vecchia_ipotesi ) -gt $tolleranza ]
#       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Sintassi da sistemare, naturalmente.
							  
#      "ABS" è una funzione (virgola mobile) che restituisce il valore assoluto
#+      della differenza tra due termini.
#      Quindi, finché la differenza tra il tentativo di soluzione corrente
#+     e quello precedente (ipotesi) è maggiore della tolleranza, 
#+     il ciclo continua.
							  
do
   vecchia_ipotesi = $ipotesi  #  Aggiorna $vecchia_ipotesi alla 
                               #+ precedente $ipotesi.
							  
#  ========================================================================
   ipotesi = ( $vecchia_ipotesi + ( $argomento / $vecchia_ipotesi ) ) / 2.0
#        = 1/2 ( ($vecchia_ipotesi **2 + $argomento) / $vecchia_ipotesi )
#  equivalente a:
#        = 1/2 ( $vecchia_ipotesi + $argomento / $vecchia_ipotesi )
#  cioè, "fa la media" tra il tentativo di soluzione e
#+ il rapporto di deviazione dell'argomento
#+ (in pratica, divide l'errore a metà).
#  Questo fa convergere verso una soluzione accurata
#+ con un numero sorprendentemente basso di iterazioni . . .
#+ per argomenti > $tolleranza, naturalmente.
#  ========================================================================
							  
   (( contaciclo++ ))          # Aggiorna il contatore del ciclo.
done

È abbastanza semplice da capire e dovrebbe essere abbastanza facile da convertire in un vero script di Bash. Il problema, però, è che Bash non possiede un supporto nativo per i numeri in virgola mobile. Quindi è necessario; per i calcoli e la conversione dei numeri, usare bc o possibilmente awk. E questo rende il tutto piuttosto caotico . . .

Log degli accessi ai file

Si crei un file di log degli accessi ai file presenti in /etc avvenuti nel corso della giornata. Le informazioni devono comprendere: il nome del file, il nome dell'utente, l'ora di accesso. Si dovrà anche contrassegnare quel/quei file che ha/hanno subito delle modifiche. Questi dati dovranno essere registrati nel file di log in record ben ordinati.

Controllo dei processi

Lo script deve controllare in continuazione tutti i processi in esecuzione e annotare quanti processi figli sono stati generati da ciascun processo genitore. Se un processo genera più di cinque processi figli, allora lo script deve spedire una e-mail all'amministratore di sistema (o a root) con tutte le informazioni di maggior importanza, tra cui l'ora, il PID del processo genitore, i PID dei processi figli, ecc. Lo script deve anche scrivere un rapporto in un file di log ogni dieci minuti.

Togliere i commenti

Si tolgano tutti i commenti da uno script di shell il cui nome andrà specificato da riga di comando. Si faccia attenzione a non cancellare la "riga #!".

Conversione HTML

Si converta un dato file di testo nel formato HTML. Questo script non interattivo dovrà inserire automaticamente tutti gli appropriati tag HTML nel file specificato come argomento.

Togliere i tag HTML

Si tolgano tutti i tag da un file HTML specificato, quindi lo si ricomponga in righe di dimensione compresa tra i 60 e i 75 caratteri. Si reimpostino appropriatamente i paragrafi e le spaziature dei blocchi di testo, e si convertano le tabelle HTML in quelle approssimativamente corrispondenti del formato testo.

Conversione XML

Si converta un file XML sia nel formato HTML che in formato testo.

Caccia agli spammer

Si scriva uno script che analizzi una e-mail di spam eseguendo una ricerca DNS sugli indirizzi IP presenti nell'intestazione del messaggio, per identificare i vari host così come l'ISP d'origine. Lo script dovrà reindirizzare il messaggio di spam inalterato agli ISP responsabili. Naturalmente, sarà necessario togliere l'indirizzo IP del proprio provider per non finire col lamentarsi con se stessi.

Se necessario, si usino gli appropriati comandi per l'analisi di rete.

Per farsi qualche idea in merito, si veda Esempio 15-37 e Esempio A-28.

Facoltativo: scrivete uno script che ricerchi gli spam in un elenco di messaggi e-mail e li cancelli in base alle regole dei filtri specificati.

Creare pagine di manuale

Si scriva uno script che automatizzi il processo di creazione delle pagine di manuale.

Dato un file di testo contenente informazioni da impaginare in una pagina di manuale, lo script dovrà leggere il file, quindi invocare gli appropriati comandi groff per visualizzare la risultante pagina di manuale allo stdout. Il file di testo deve essere strutturato in blocchi di informazioni secondo le intestazioni standard di una pagina di manuale, es. "NAME," "SYNOPSIS," "DESCRIPTION," ecc.

Vedi Esempio 15-26.

Codice Morse

Si converta un file di testo in codice Morse. Ogni carattere del testo verrà rappresentato dal corrispondente carattere dell'alfabeto Morse, formato da punti e linee (si usi il trattino di sottolineatura), separato l'uno dall'altro da spazi. Per esempio,

Si invochi lo script "morse.sh" con "script"
come argomento da convertire in codice Morse.
		    
		    
$ sh morse.sh script
		    
... _._. ._. .. .__. _
s   c    r   i   p   t

Editor esadecimale

Si esegua una visualizzazione in esadecimale di un file binario specificato come argomento. L'output dovrà avere i campi ben ordinati in forma tabellare, con il primo campo che indica l'indirizzo di memoria, ciascuno dei successivi otto campi un numero esadecimale di 4 byte e l'ultimo campo l'equivalente ASCII dei precedenti otto campi.

L'ovvia conseguenza è quella di trasformare lo script in un disassemblatore. Usando una tabella di consultazione, o qualche altra trovata intelligente, si convertano i valore esadecimali nei codici operativi 80x86.

Simulare uno scorrimento di registro

Ispirandosi all'Esempio 26-14, si scriva uno script che simuli uno shift di registro a 64 bit, in forma di array. Si implementino le funzioni per il caricamento del registro, per lo scorrimento a sinistra, per lo scorrimento a destra e la rotazione. Infine, si scriva una funzione che interpreti il contenuto del registro come caratteri ASCII di otto per otto bit.

Determinante

Si risolva una determinante 4 x 4.

Parole nascoste

Si scriva un generatore di puzzle di "parole", vale a dire uno script che celi 10 parole fornite come input in una matrice 10 x 10 di lettere casuali. Le parole possono essere inserite orizzontalmente, verticalmente o diagonalmente.

Facoltativo: si scriva uno script che risolva tali puzzle di parole. Per non rendere la soluzione troppo difficile, si ricerchino solo le parole orizzontali e verticali. (Suggerimento: ogni riga e colonna va considerata come un'unica stringa in cui trovare le sottostringhe.)

Anagrammare

Si trovino gli anagrammi di un input di quattro lettere. Ad esempio, gli anagrammi di word sono: do or rod row word. Come elenco di riferimento si può utilizzare /usr/share/dict/linux.words.

Parole concatenate

Una "catena di parole" è formata da una sequenza di parole in cui ognuna differisce da quella che la precede per una sola lettera.

Per esempio, una "catena" che va da mark a vase:

mark --> park --> part --> past --> vast --> vase
	 ^           ^       ^      ^           ^

Si scriva uno script che risolva una catena di parole. Date quella iniziale e quella finale, lo script dovrà elencare tutte quelle intermedie a formare la "catena". Si faccia attenzione a che tutte le parole della serie siano valide.

Indice di comprensione

L'"indice di comprensione" di un brano di un testo, indica la difficoltà di lettura dello stesso per mezzo di un numero che corrisponde, approssimativamente, al livello di scolarizzazione. Ad esempio, un brano con indice 12 dovrebbe essere capito da tutti coloro che hanno avuto dodici anni di scolarizzazione.

La versione Gunning dell'indice di comprensione usa il seguente algoritmo.

  1. Si sceglie un brano, di almeno cento parole, da un testo.

  2. Si conta il numero delle frasi (la parte di frase che è stata troncata perché alla fine del brano, si calcola come se fosse intera).

  3. Si calcola il numero medio di parole per frase.

    MEDIA_PAROLE = PAROLE_TOTALI / NUMERO_FRASI

  4. Si conta il numero delle parole "difficili" presenti nel brano -- quelle formate da almeno tre sillabe. Questa quantità viene divisa per il totale delle parole, per ottenere la proporzione di parole difficili.

    PRO_PAROLE_DIFFICILI = PAROLE_LUNGHE / TOTALE_PAROLE

  5. L'indice di comprensione Gunning risulta dalla somma delle due precedenti grandezze moltiplicata per 0.4, con arrotondamento all'intero più prossimo.

    INDICE_GUNNING = int ( 0.4 * (MEDIA_PAROLE + PRO_PAROLE_DIFFICILI ) )

Il passaggio nr. 4 è la parte di gran lunga più difficile dell'esercizio. Esistono diversi algoritmi per il conteggio delle sillabe di una parola. Una formula empirica approssimativa potrebbe prendere in considerazione il numero di lettere che compongono la parola e il modo in cui le consonanti e le vocali si alternano.

L'interpretazione restrittiva dell'indice di comprensione Gunning non considera come parole "difficili" le parole composte e i nomi propri, ma questo avrebbe reso lo script enormemente complesso.

Calcolo del PI Greco usando il metodo dell'Ago di Buffon

Il matematico francese del XVIII secolo De Buffon se n'è uscito con un esperimento insolito. Ha fatto cadere ripetutamente un ago di lunghezza "n" su un pavimento di legno, formato da assi lunghe e strette disposte parallelamente. Le linee di giunzione delle assi del pavimento, che sono tutte della stessa larghezza, si trovano, l'una dall'altra, alla distanza fissa "d". Ha annotato il numero totale delle cadute dell'ago nonché il numero di volte in cui lo stesso andava ad intersecare le giunzioni delle assi del pavimento. Il rapporto tra queste due grandezze è risultato essere un multiplo frazionario del PI Greco.

Prendendo come spunto l'Esempio 15-45, si scriva uno script che esegua una simulazione Monte Carlo dell'Ago di Buffon. Per semplificare le cose, si imposti la lunghezza dell'ago uguale alla distanza tra le giunzioni, n = d.

Suggerimento: in verità bisogna tenere in considerazione due variabili critiche: la distanza dal centro dell'ago alla giunzione ad esso più vicina e l'angolo formato dall'ago con quella giunzione. Per l'esecuzione dei calcoli si dovrà usare bc.

Cifrario Playfair

Si implementi in uno script il cifrario Playfair (Wheatstone).

Il cifrario Playfair codifica un testo mediante la sostituzione dei "digrammi" (gruppi di due lettere). Per consuetudine si dovrebbe usare, per la cifratura e la decodifica, una chiave a matrice quadrata di 5 x 5 lettere, poste in un certo ordine.

   C O D E S
   A B F G H
   I K L M N
   P Q R T U
   V W X Y Z

Ogni lettera alfabetica appare una sola volta, con la "I" che rappresenta
anche la "J". La parola chiave "CODES", scelta arbitrariamente, viene
per prima e, di seguito, tutte le lettere dell'alfabeto, ordinate da sinistra
a destra, saltando quelle che formano la parola chiave.

Per la cifratura, si suddivide il messaggio in chiaro in digrammi
(gruppi di 2 lettere). Se un gruppo risulta formato da due lettere
uguali, si cancella la seconda e si forma un nuovo gruppo. Se per
l'ultimo digramma rimane una sola lettera, come seconda si usa un
carattere "nullo", di solito una "X". 

QUESTO È UN MESSAGGIO TOP SECRET

QU ES TO EU NM ES SA GI OT OP SE CR ET

Per ogni digramma vi sono tre possibilità.
----------------------------------------------
1) Entrambe le lettere si trovano su una stessa riga della chiave a
   matrice quadrata. Ciascuna lettera va sostituita con quella che si
   trova immediatamente alla sua destra. Se la lettera da sostituire
   è l'ultima della riga, si userà la prima della stessa riga.

oppure

2) Entrambe le lettere si trovano su una stessa colonna della chiave a
   matrice quadrata. Ciascuna lettera va sostituita con quella che si
   trova immediatamente al di sotto. Se la lettera da sostituire è
   l'ultima della colonna, si userà la prima della stessa colonna.

oppure

3) Entrambe le lettere formano gli angoli di un rettangolo all'interno
   della chiave a matrice quadrata. Ciascuna lettera viene sostituita
   con quella che si trova all'angolo opposto, ma sulla stessa riga. 


Il digramma "QU" ricade nel caso nr. 1.
P Q R T U   (Riga che contiene sia "Q" che "U")

Q --> R
U --> P     (si è tornati ad inizio riga)


Il digramma "GI" ricade nel caso nr. 3.
A B F G     (Rettangolo avente "G" e "I" agli angoli)
I K L M

G --> A
I --> M

=========================================================================

Per la decodifica del testo cifrato bisogna invertire, nei casi nr. 1
e nr. 2, la procedura (per la sostituzione ci si sposta nella
direzione opposta). Mentre nulla cambia per quanto riguarda il caso
nr. 3. 


Il lavoro, ormai classico, di Helen Fouche Gaines, "ELEMENTARY
CRYPTANALYSIS" (1939), fornisce un resoconto veramente dettagliato
sul Cifrario Playfair e sui relativi metodi di soluzione.

Lo script dovrà essere composto da tre sezioni principali

  1. Generazione della "chiave a matrice quadrata", basata su una parola scelta dall'utente.

  2. Cifratura del messaggio "in chiaro".

  3. Decodifica del testo cifrato.

Lo script dovrà fare un uso intensivo di array e funzioni.

--

Si è pregati di non inviare all'autore le soluzioni degli esercizi. Vi sono modi migliori per impressionarlo con le proprie abilità, come segnalargli errori e fornirgli suggerimenti per migliorare il libro.