La mente vola lontana come un gabbiano impaurito senza testa e con le zampette triturate da una grattuggia

Come implementare il Gioco della Vita di Conway in C#

Dopo il primo post sugli automi di Wolfram, passiamo allo studio ben più interessante e vario degli automi a due dimensioni. Un mondo artificiale, chiamato comunemente “Game of Life” gioco della vita perchè è un misto variegato di pattern e conglomerati di bytes che si raccolgono e si evolvono in fantasiose creature, o variegati accrescimenti sincronizzati, o in una morte certa ed atroce, fa sempre un po’ tristezza quando ti muore un automa cellulare, sono momenti che non vorresti mai accadessero nella tua vita. Non è giusto che un automa vive solo perchè ha delle regole favorevoli o delle condizioni iniziali tarate ad hoc da una entità superiore. Personalmente non trovo giusto ed eticamente corretto che si creino degli automi cellulari per poi farli morire, o ancora peggio per godere mentre questi muoiono nell’indifferenza più totale della società moderna. Un po’ come Pernolino il tenero buchino nero, tanto amato ma tanto temuto del mondo intero. Per questo mi impegnerò nella salvaguardia degli automi cellulari, voglio fondare una associazione, in modo tale da organizzare una forza lavoro per raccogliere risorse, dibattiti, divulgazione, volantini informativi. Tutti devono sapere che gli automi cellulari esistono e molti incontrano la morte solo dopo neanche un paio di cicli di evoluzione!

Accrescimento cellulare sincronizzato

Accrescimento cellulare sincronizzato generato dal Gioco della Vita regola S23/B246.

Accrescimento cellulare incontrollato game of life conway

Accrescimento cellulare incontrollato generato dalla regola S23/B2356

Replicatore cellulare Game of Life Conway

Replicatore cellulare generato dalla regola S1357/B1357

Espanditore cellulare Game of Life Conway

Espanditore cellulare generato dalla regola S012345678/B3

Espanditore cellulare labirintico Game of Life Conway

Espanditore cellulare labirintico generato dalla regola S1234/B3

Questi sono degli automi cellulari possenti! Sembrano non morire mai, ed infatti così è! Ma ne esistono anche di altamente insicuri e precari, i quali dipendono fortemente dalle condizioni iniziali. Ma sono anche i più interessanti, come il classico gioco della vita di Conway basato sulla regola S23/B3 (qui potete leggervi la descrizione delle regole Game of Life di Conway).

Game of Life S23B356 Conway

Regola S23B356

Vediamo il codice, dove la classe astratta Automata e la classe Environment2D sono descritte nel precedente post sugli automi unidimensionali di Wolfram.

public class Automata2DGameLife : Automata {
  protected readonly List<byte> RuleSurvival = null;
  protected readonly List<byte> RuleBirth = null;

  public Automata2DGameLife(byte[] ruleSurvival, byte[] ruleBirth, Environment2D env0 = null) {
    this.RuleSurvival = ruleSurvival.ToList();
    this.RuleBirth = ruleBirth.ToList();
    this.Env0 = env0;
  }

  public override void StandardInit() {
    if (this.Env0 != null)
      this.Env.Merge(this.Env0);
    else {
      Env.SetValue(Env.Width / 2, Env.Height / 2, 1);
      Env.SetValue(Env.Width / 2 + 1, Env.Height / 2, 1);
      Env.SetValue(Env.Width / 2 - 1, Env.Height / 2 - 1, 1);
      Env.SetValue(Env.Width / 2 - 2, Env.Height / 2 - 1, 1);
      Env.SetValue(Env.Width / 2 - 2, Env.Height / 2 - 2, 1);
      Env.SetValue(Env.Width / 2 - 3, Env.Height / 2 - 2, 1);
      Env.SetValue(Env.Width / 2 - 3, Env.Height / 2 - 3, 1);
      Env.SetValue(Env.Width / 2 - 4, Env.Height / 2 - 2, 1);
    }
  }
  
  public override bool IsFinite() { return false; }
  public override void RandomInit() {
    Env0 = new Environment2D(20, 20);
    Random rand = new Random(Environment.TickCount);
    for (int i = 0; i < (Env.Width * Env.Height); i++) {
      int x = rand.Next(0, Env.Width);
      int y = rand.Next(0, Env.Height);
      Env.SetValue(x, y, (byte)rand.Next(0, 2));
    }
  }
  public override bool Next() {
    Environment2D etmp = new Environment2D(Env.Width, Env.Height);
    for (int x = 0; x < Env.Width; x++)
      for (int y = 0; y < Env.Height; y++)
        etmp.SetValue(x, y, ComputeRule(x, y));

    Env = etmp;
    return true;
  }		
  protected override byte ComputeRule(int x, int y) {
    byte neighbours = GetNeighbours(x, y);
    byte c = Env.GetValue(x, y);
    if (c > 0) {
      return (byte)(RuleSurvival.Contains(neighbours) ? 1 : 0);
    } else {
      return (byte)(RuleBirth.Contains(neighbours) ? 1 : 0);
    }
  }
  private byte GetNeighbours(int x, int y) {
    byte neighbours = 0;
    if (x > 0) { if (Env.GetValue(x - 1, y) > 0) neighbours++; }
    if (x > 0 && y > 0) { if (Env.GetValue(x - 1, y - 1) > 0) neighbours++; }
    if (x > 0 && y < Env.Height - 1) { if (Env.GetValue(x - 1, y + 1) > 0) neighbours++; }
    if (y > 0) { if (Env.GetValue(x, y - 1) > 0) neighbours++; }
    if (y < Env.Height - 1) { if (Env.GetValue(x, y + 1) > 0) neighbours++; }
    if (x < Env.Width - 1 && y > 0) { if (Env.GetValue(x + 1, y - 1) > 0) neighbours++; }
    if (x < Env.Width - 1) { if (Env.GetValue(x + 1, y) > 0) neighbours++; }
    if (x < Env.Width - 1 && y < Env.Height - 1) { if (Env.GetValue(x + 1, y + 1) > 0) neighbours++; }
    return neighbours;
  }  
  public override string ToString() {
    return string.Format("Game of Life S{0}/B{1}",
      string.Concat(RuleSurvival.Select(b => b.ToString()).ToArray()),
      string.Concat(RuleBirth.Select(b => b.ToString()).ToArray()));
  }
}
Annunci

Primo buco nero fotografato al cern di ginevra

La terra sarà distrutta da un buco nero? Secondo calcoli quantistici, che inglobano al loro interno la nuova teoria delle superstringhe sviluppata proprio al cern di ginevra, la terra verrà inghiottita dal buco nero nei nove mesi successivi al 31/09/2012, assicurando la fine del mondo all’umanità intera.


Il 31 gennaio del 2012, durante la fase di accensione e di start up del nuovo mega acceleratore di particelle, è stata rivelata una forte emissione di raggi gamma in un particolare punto dell’acceleratore. Si tratta del primo buco nero prodotto dall’uomo. Gli scienziati che stanno continuando a studiare questo fenomeno fisico in veloce espansione, si dicono sconfitti dalla manifestazione della natura e delle sue leggi fisiche. La fine del mondo sembra vicina, eppure così illogica e utopistica. La filosofia degli ultimi secoli non ci ha fornito ancora le basi per superare questo fatidico momento, ed elevarci ad entità fisiche superiori. Nonostante tutto, la determinazione e la devozione dei ricercatori alla scienza ed alla letteratura scientifica continua a persistere anche in una situazione catastrofica come quella in cui ci troviamo. Un evento così sensazionale non si era mai potuto osservare così da vicino, e sottrarsi allo studio di un tale fenomeno risulterebbe contrario ad ogni etica morale, scientifica e giuridica che il mondo ha plasmato come propria immagine e somiglianza. Il team di scienziati che lavora al progetto si è fatto scappare una piccola chicca: al neonato buco nero è stato assegnato il nome di Pernolino.

Danimarca 2009, a chi non piace l’Europa?

Ho fatto un piccolo viaggetto in treno questa estate…
Mappa percorso
Blog di viaggio

Click sui links per informazioni utili, cosa fare cosa vedere, spunti e luoghi in cui fermarsi e riflettere, tartine inzuppate nelle ciotole dei cani, istruzioni su come sopravvivere ad un attacco di coccinelle indifese! Cammina salta schiaccia putride coccinelle sociali.

danimarca inter-rail percorso tragitto itinerario

Danimarca in inter-rail: Verona, Monaco di Baviera, Amburgo, Copenaghen, Hoje Taastrup, Lindhom, Aalborg, Hjorring, Hirtshals, Skagen, Grenen, Frederikshavn, Fredericia, Kolding, Colonia, Utrecht, Amsterdam, Parigi, Provenza, Nizza, Ventimiglia, Novara.