La programmazione in Awk II: Life in a Shell

 

Il gioco Life fu inventato negli anni ’70 dal prolifico matematico John H. Conway (vedi [5] per la sua biografia) ed è diventato famoso dopo la pubblicazione di Martin Gardner nella sua rubrica di matematica amatoriale sulla rivista Scientific American [1,2]. Il gioco è basato sugli automi cellulari concepiti da Konrad Zuse e Stanislaw M. Ulam all’inizio degli anni ’50, e poi adottati da John von Neumann per il suo studio sugli automi auto-replicanti [2,3]. Un automa cellulare è composto da unità (celle) interagenti disposte in una griglia quadrataIl sistema si evolve in cicli di vita in cui ogni cella cambia stato e nuove celle possono nascere e altre possono sopravvivere o, eventualmente, morire. Lo stato di ogni cella nel ciclo successivo è definito dall’interazione con le celle adiacenti in base a delle regole. L’interazione avviene con i primi vicini di ciascuna cella. Come mostrato nella Figura 1, è possibile utilizzare due tipi di intorni (cerchi) della cella centrale. Il gioco Life usa il tipo di proposto da Moore. 

neumannmoore.jpg

Figura 1: Two tipi di intorni: a sinitra quello cosiddetto di Moore e a destra quello di Neumann.

Life in a Shell

Tempo fa, scrissi un programma di ennesima vita in linguaggio awk per visualizzare l’evoluzione di Life su uno schermo terminale (vedi Appendice). Questo programma è solo un esercizio per esplorare altre caratteristiche del linguaggio awk. È limitato nella grafica e nelle prestazioni rispetto ai molti programmi esistenti del gioco della vita, ma è ancora uno strumento utile per esplorare questo argomento affascinante. Inoltre, per coloro che hanno buoni ricordi della rivoluzione del microcomputing degli anni ’80, dà anche una sensazione di retro-computing!  

Il programma legge configurazioni del gioco in formato RLE (run-length encoding). Per eseguire il tipo di programma 

awk -f Life.awk RLEfile

Quindi ottiene la dimensione della finestra del terminale (linee X colonne) usando la funzione TermSize () dal comando della shell tput. La dimensione del terminale viene utilizzata per impostare le dimensioni delle matrici utilizzate dal gioco. La funzione GenFrame () prepara la cornice che si affaccia sull’arena del gioco. Il tipo di vicini utilizzati dal gioco è impostato usando la funzione Neighbor (1), il parametro 1 è per il tipo di Moore. La funzione RLEreader legge i contenuti del file RLE e aggiunge la configurazione iniziale della cella al centro della matrice di gioco. Il programma non legge il tipo di regola poiché utilizza solo le regole di Conway originali (B3 / S23). Pertanto, si prega di verificare il tipo di regola nel file RLE prima di utilizzarlo anche se non è difficile implementare anche altri tipi di regole leggendole dal file RLE e implementando nella funzione applyRule (). Il programma quindi stampa un menu che consente di scegliere di eseguire il gioco in modo continuo impostando il numero di generazioni o, in modo interattivo, fornendo manualmente il numero di passaggi da avanzare. Il menu viene impostato utilizzando il ciclo do while (implementato in gnu awk) e ottenendo l’input dalla tastiera utilizzando il comando getline ch <“-“. L’animazione viene eseguita stampando la matrice del gioco che viene aggiornata in base alle regole del gioco ad ogni ciclo. I colori e la cancellazione dello schermo sono ottenuti usando caratteri ESC. In Mac OSX, è possibile aumentare o ridurre la dimensione dei caratteri utilizzati nel terminale con i tasti Cmd +/- , rispettivamente. Riducendo la dimensione dei caratteri, si puo’ aumentare il numero di linee e colonne ingrandendo in questo modo la finestra del terminale. Questo produrrà un campo di gioco più ampio per una grande configurazione iniziale del gioco, ma si pagherà il prezzo di una riduzione della velocità del programma. Se la variabile PBC nel blocco BEGIN del programma è impostata su 1, il gioco viene eseguito con condizioni al contorno periodiche. Questo equivale a far correre il gioco sulla superficie di un toroide. Il programma è fornito così com’è e tutti sono invitati a provare e se riesci a migliorarlo, inviami la nuova versione!

Ho aggiunto alcuni esempi di configurazioni ben note gli esempi sono generati usando il file RLE ottenuto dal sito web Conwaylife sopra citato. Buon divertimento! 

GosperGlider.mov

Esempio 1: Gospel glider gun.

Tumbler.mov

Esempio 2: Tumbler.

Harvester.mov

Esempio 3: harvester.

CheshireCat.mov

Esempio 4: Cheshire cat.

Period2osc.mov

Esempio 5: Period 2 oscillators.

Period5osc.mov

Esempio 6: Period 5 oscillators.

Pentadecathon_Synth.mov.gif

Esempio 7: Pentadechalon Synthesizer.

BIBLIOGRAFIA

  1. M. Gardner. The fantastic combination of John Conway’s new solitaire game “life”.”. Scientific American, October 1970.
  2. M. Gardner. On cellular automata, self-reproduction, the Garden of Eden and the game of “life”. Scientific American, Feb. 1971.
  3. M. Schroeder. Fractal, Chaos, Power Laws: minutes from an infinite paradise., Dover Ed., 1991.
  4. S. Wolfram. A new kind of Science. Wolfram Media Inc.
  5. S. Roberts. Genius at Play. Bloomsbury Publishing, 2015.

APPENDICE

Il gioco è stato sviluppato e provato su Mac OSX usando il gawk. Il programma si trova in questo file: 

LIFE

Per usarlo, copiatelo in un file di testo chiamato, ad esempio, Life.awk  e poi fatelo girate usando il comando: gawk -f Life.awk.

About Danilo Roccatano

I have a Doctorate in chemistry at the University of Roma “La Sapienza”. I led educational and research activities at different universities in Italy, The Netherlands, Germany and now in the UK. I am fascinated by the study of nature with theoretical models and computational. For years, my scientific research is focused on the study of molecular systems of biological interest using the technique of Molecular Dynamics simulation. I have developed a server (the link is in one of my post) for statistical analysis at the amino acid level of the effect of random mutations induced by random mutagenesis methods. I am also very active in the didactic activity in physical chemistry, computational chemistry, and molecular modeling. I have several other interests and hobbies as video/photography, robotics, computer vision, electronics, programming, microscopy, entomology, recreational mathematics and computational linguistics.
This entry was posted in Leonardo's Corner, Programming, Science Topics. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s