Rule 110 - zellulärer Automat

  • Ich machs diesma kurz: Bin drüber gestolpert und wollte es nachbauen!

    Conway's Game Of Life ist ähnlich, aber hier sieht man schön den zeitlichen Verlauf auf der Y-Achse.

    Bisschen was zu lesen:

    https://en.wikipedia.org/wiki/Rule_110

    https://en.wikipedia.org/wiki/Elementary_cellular_automaton

    https://de.wikipedia.org/wiki/Zellul%C3%A4rer_Automat

    Wie funktioniert das ganze?

    Man sucht sich eine Zahl aus, die als Regel dienen soll, dabei gibt die Binärrepräsentation der Zahl den Zustand einer Zelle im nächsten Zeitpunkt an.

    Beispiel 110 (kopiert vom ersten Wikipedia Artikel!):

    Current Pattern111110101100011010001000
    New state for center cell01101110

    Dabei stellen die Bits im "Current Pattern" die Zelle links, die selbe Zelle und die Zelle rechts im Zeitpunkt davor dar.

    Der neue Zustand ist die Binärrepresentation von 110d = 01101110b gestreckt auf die entsprechenden Patterns.

    Anschließend muss man nur noch die erste Reihe angeben von der die restlichen Generationen entstehen sollen.

    Der Bereich ist im Skript markiert, entweder kann man hier einfach nur einen Pixel 1 setzen oder man lässt sich was kreatives einfallen ;) Alle x Pixel, oder ein Muster, ganz links, ganz rechts.

    Für den Anfang ist es in der Mitte platziert um es nicht bei einem 'schlechten' Pattern etwas zu verpassen.

    Vielleicht etwas träge auf langsameren Systemen, und da ist bestimmt noch ordentlich Performance drin, insbesondere mit bisschen ASM-Magie, wer mag kann sich gerne austoben.

    Wie sieht das ganze dann aus?

    Ein paar interessante Patterns hab ich im Skript aufgeschrieben. Viel Spaß! :)

  • Hier eine tick schnellere Version:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (12. Februar 2020 um 16:11) aus folgendem Grund: Kleines Update.

  • //EDIT

    UEZ war schneller....so ist das, wenn man die Posts erst Stunden/Tage nach dem Editieren los schickt :Face:


    Hi,

    ich hatte die Idee, dein Programm auf "oldschool"-GDI umzuschreiben.

    Sourcecode ist ca halb so lang, dafür doppelt so schnell^^

    Es wird eine Bitmap in den DC des Fensters erstellt, die Funktion dazu liefert den Pointer auf die Pixel. Über eine DllStruct() an der Position dieser Bitmap kann man nun per DllStructSetData() direkt "Pixel" schreiben.

    Leider gibt es keinen Datentyp "BIT" in der DllStruct(), um eine 1-Bit-Bitmap über die DllStruct() mit Daten füttern zu können, deshalb habe ich eine "normale" 32-Bit-Bitmap (die ist 32x so groß wie eigentlich benötigt wtf) verwendet.


    Und ja, wer noch eine "sehr" (ca. 10 Jahre) alte AutoIt-Version hat, der kann sich über noch mehr Geschwindigkeit freuen, im Zuge der "Weiterentwicklung für PRO-Scripter" hat man nämlich damals sämtliche nativen String- und DllStruct-Funktionen in AutoIt verlangsamt, um die PRO-Funktionen (bspw. RegEx aka PCRE) Geschwindigkeitsmäßig besser aussehen zu lassen.....die entsprechenden Threads dazu hier im Forum sind wie so viele andere im Nirvana verschwunden...