Lua-Aufgabe 41: Folge123

!!! Please ensure, that your contribution or question is placed into the relevant section !!!
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
In the case of pictures that are attached to the article, the source must also be stated. This also applies to your own pictures, which were taken by you. Pictures without source information will be deleted!
  • Aufgabe:

    Gib an, ob in einer gegebenen Tabelle arr die Ziffern 1, 2 und 3 aufeinander folgen.


    Beispiele:

    array123({1, 1, 2, 3, 1}) -> true

    array123({1, 1, 2, 4, 3}) -> false

    array123({1, 1, 2, 1, 2, 3}) -> true



    LUA Source Code
    1. function array123(arr)
    2. end

    Ergänze die obige Funktion so, dass sie true zurück gibt, falls sich die Zahlen 1, 2 und 3 in direkter Folge unter den Werten befinden, andernfalls false.




    Setze deine Funktion statt der ersten drei Zeilen in folgendem Testskript ein und lasse es in einem Lua Interpreter oder einer leeren EEP Anlage laufen um deine Funktion zu überprüfen.

  • Code
    1. function array123(arr)
    2. for n = 1, #arr-2 do -- ab #arr-1 kann es keine 3er Kombination mehr geben
    3. if arr[n] == 1 and arr[n+1] == 2 and arr[n+2] == 3 then
    4. return true
    5. end
    6. end
    7. return false
    8. end

    Fried-liche Grüße:aq_1:

  • Ich fange mal an mit einer etwas "anderen" Lösung (auch wenn es sonst noch keine gibt :an_1:)

    LUA Source Code
    1. function array123(arr)
    2. tableAsString = table.concat(arr)
    3. foundPos = tableAsString:find("123")
    4. return foundPos ~= nil
    5. end

    Zuerst wird die Tabelle in einen String (ohne Trennzeichen) umgewandelt. Dann wird darin nach der Zeichenkette "123" gesucht. string.find gibt entweder eine Position zurück, wenn der String gefunden wurde (die interessiert uns aber nicht), oder nil, falls der String nicht gefunden wurde. Deshalb geben wir zurück, ob diese Position nicht nil ist.


    Diese Funktion funktioniert unter der Vorraussetzung, dass in der Tabelle nur einzelne Ziffern stehen.

    Für die Tabelle {12, 3} würde sie ebenfalls true zurückgeben.


    Viele Grüße

    Benny

  • Hallo zusammen,


    die etwas "andere" Lösung von Benny (BH2) etwas erweitert:

    Code
    1. function array123(arr)
    2. local str = table.concat(arr, ';')
    3. return '1;2;3' == str
    4. or '1;2;3;' == string.sub(str, 0, 6)
    5. or ';1;2;3' == string.sub(str, -6)
    6. or nil ~= string.match(str, ';1;2;3;')
    7. end


    Die Aneinanderreihung der Tabelle zu einem String erfolgt mit dem Trennzeichen Semikolon ;.

    Danach wird geschaut, ob der String

    • identisch mit 1;2;3 ist,
    • mit 1;2;3; beginnt
    • mit ;1;2;3 endet
    • oder ob ;1;2;3; enthalten ist.


    Viele Grüße,

    Andreas Kreuz

    EEP: Version 15 - PC: AMD Ryzen 3700X, 16 GB RAM, NVidia Geforce GTX 1080 Ti, Windows 10 - Notebook: MacBook Pro 2015, mit ATI Radeon R9 M370X, Windows 10


    Webseite: Lua-Bibliothek für EEP (mit Tutorials)

  • Jetzt muss ich dazu doch mal eine Frage stellen.


    Ein String ist ja immer ein Array mit der Formatierung Short im ASCII Code um Texte wiederzugeben.

    Aber ein Array ist nicht zwingend ein String, sondern wird oft auch als Speicherplatz für andere Datentypen verwendet.


    Nun zu der Frage, kann Lua auch mehrdimensionale Arrays portieren; und wenn wieviele?

    Wie hier z.B. unter ST - ARRAY [0..1,0..7,0..4] OF USINT dreidimensional

    Dieses Array hier z.B. dient als Speicher einer als Wochenschaltuhr.

    EEP 15.1 [x64] Patch 2

    hat ein klein wenig Ahnung von System-Programmierung :bn_1:

    https://abload.de/img/zglbrckqhkzh.jpg

    Windows 10 Pro 64-Bit

    HP Compaq 8100 Elite CMT PC / Intel(R) Core(TM) i5 CPU 760 @ 2.93GHz RAM 12GB

    GeForce GTX 1050 Ti / LCD Monitor 2*HDMI 3440 * 1440

    HP Z230 - CPU Intel® Xenon® E3-1225 v3 3.2GHz 64Bit (Win10 & Debian 10.3)

  • kann Lua auch mehrdimensionale Arrays portieren

    Gut möglich, dass ich als Laie deine Frage falsch verstehe und meine Antwort nicht passt. Ich versuche es trotzdem:


    Lua kennt eigentlich gar keine Arrays, sondern nur Tabellen. Die sind zugleich Arrays, Tables, Dictionaries, Tuples etc. und sogar beinahe schon Objekte.


    Mehrdimensionale Tabellen sind in Lua ebenso möglich wie Tabellen mit gemischten Inhalten. Jede Zelle kann entweder durch eine Nummer oder einen Namen indiziert werden. Die nummerierten Zellen einer Tabelle sind auch dann iterierbar, wenn es in der selben Tabelle auch benamte Zellen gibt. Jede Zelle kann Daten eines anderen Typs enthalten: int, float, string, bool, table, func …


    Variablen und Funktionen stehen in Lua ebenfalls in einer Tabelle.

    Man schreibt var = 1 und Lua macht daraus _ENV["var"] = 1


    Wie viele Dimensionen möglich sind, weiß ich nicht. Aber das hier ist eine "normale" Lua-Tabelle:

    Das ist natürlich kein gutes Beispiel. Im Gegenteil schreckt dich das wahrscheinlich eher ab.

    Ich habe nur versucht, auf die Schnelle viele unterschiedliche Dinge in eine Tabelle zu stopfen.

    The post was edited 3 times, last by Goetz ().

  • Kleine Ergänzung zu dem, was Goetz schon richtig erklärt hat:


    Lua kennt keine Arrays, und daher auch keine mehrdimensionalen Arrays. Ich stelle mir die Tabellen immer wie Hashmaps vor: Zu den Schlüsseln (oder Indizes) werden Werte gespeichert. Als Datentypen für Schlüssel und Werte ist quasi alles möglich, natürlich Zahlen und Strings, aber auch Tabellen (auch als Schlüssel!) oder Funktionen oder oder.

    Wenn Du Zahlen als Schlüssel verwendest, erhältst Du etwas, das den Arrays recht nahe kommt. Aber auch diese dürfen Lücken enthalten, ohne dass die Lücken Speicherplatz auffressen, z.B. array = { [1] = "eins", [42] = "zweiundvierzig" }.

    Etwas zusätzliche Unterstützung erfahren Tabellen, die mit fortlaufenden Werten ab 1 indiziert sind: Dann liefert #array die Anzahl der Elemente. Und es gibt eine Funktion ipairs(array), die so durch die Tabelle iteriert, dass Du die Schlüssel und Werte nach den Schlüsseln aufsteigend sortiert erhältst (im Gegensatz zu pairs(array), das keine Zusicherung über die Sortierung macht). Wenn die Tabelle Lücken enthält, brechen beide Funktionen an der ersten Lücke ab.


    Eine Begrenzung der Verschachtelungstiefe gibt es nicht, bzw. ist nur durch Deinen Hauptspeicher (inkl. Paging-Space) gegeben.


    Der Zugriff kann mehrdimensional notiert werden, indem Du array[i][j][k]... schreibst. Du musst aber bedenken, dass es keine echten Arrays sind. Sie sind also nicht "rechteckig" (= jede Unter-Tabelle gleich groß), sondern entsprechen eher einem "Flattersatz", bei dem jede Zeile eine andere Länge haben darf.


    Gruß

    Christopher

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10; EEP 6, 15 (Dev), 17 (Dev); HomeNOS 14 (Dev)
    Laptop: Intel i5 3230M; 64bit; 2,6 GHz; 8GB RAM; GeForce GT740M (1 GB); Win 8.1; EEP 6, 13.2 Plugins 1+2; HomeNOS 13 (User)

  • Habe gerade mal nachgelesen:


    Neben den Datentypen nil, boolean, number (mit den internen Subtypen integer und float), string, function, userdata und thread kennt Lua als einzigen strukturierten Datentyp table (Tabelle).

    Also meine Wochenschaltuhr würde unter Lua eine Tabelle mit 80 Integer (2*8*5) benötigen.

    Einen Dynamischen Pointer würde da ziemlich schwierig zu realisieren sein, zumal die Woche ja 7Tage, der Tag 24Std, die Stunde 60Minuten hat.


    Also vergessen wir die Arrays der Hochsprachen gleich mal...

    EEP 15.1 [x64] Patch 2

    hat ein klein wenig Ahnung von System-Programmierung :bn_1:

    https://abload.de/img/zglbrckqhkzh.jpg

    Windows 10 Pro 64-Bit

    HP Compaq 8100 Elite CMT PC / Intel(R) Core(TM) i5 CPU 760 @ 2.93GHz RAM 12GB

    GeForce GTX 1050 Ti / LCD Monitor 2*HDMI 3440 * 1440

    HP Z230 - CPU Intel® Xenon® E3-1225 v3 3.2GHz 64Bit (Win10 & Debian 10.3)

  • Hallo,


    Nun zu der Frage, kann Lua auch mehrdimensionale Arrays portieren; und wenn wieviele?

    Wie hier z.B. unter ST - ARRAY [0..1,0..7,0..4] OF USINT dreidimensional

    Dieses Array hier z.B. dient als Speicher einer als Wochenschaltuhr.

    Ich weiß nicht, was mit "portieren gemeint ist, aber die Antwort auf Deine Frage liegt vermutlich hier: https://www.lua.org/pil/11.2.html (Matrices and Multi-Dimensional Arrays)


    cetz In Lua kann man Tabellen beliebig verschachteln:

    LUA Source Code: verschachteltes Array
    1. local weekClock = {
    2. { 0, 1 },
    3. { 0, 1, 2, 3, 4, 5, 6, 7 },
    4. { 0, 1, 2, 3, 4 }
    5. }

    Genau das ist doch ein mehrdimensionales Array, oder?

    http://lua-users.org/wiki/TablesTutorial


    Schöner finde ich jedoch die Verwendung mit benannten Werten:

    LUA Source Code: Verschachtelte Tabelle mit Namen
    1. local bahnhofLuisenthal = {
    2. name = "Luisenthal Nord",
    3. gleis1 = { laenge = 380, zug = nil },
    4. gleis2 = { laenge = 380, zug = "#Personenzug nach Buxtehude" },
    5. }
    6. print(bahnhofLuisenthal.gleis2.zug)


    Viele Grüße,

    Andreas Kreuz.

    EEP: Version 15 - PC: AMD Ryzen 3700X, 16 GB RAM, NVidia Geforce GTX 1080 Ti, Windows 10 - Notebook: MacBook Pro 2015, mit ATI Radeon R9 M370X, Windows 10


    Webseite: Lua-Bibliothek für EEP (mit Tutorials)

    The post was edited 1 time, last by Andreas_Kreuz ().

  • In Lua kann man Tabellen beliebig verschachteln:

    Code
    1. local weekClock = {
    2. { 0, 1 },
    3. { 0, 1, 2, 3, 4, 5, 6, 7 },
    4. { 0, 1, 2, 3, 4 }
    5. }

    Genau das ist doch ein mehrdimensionales Array, oder?

    Es ist nahe an einem mehrdimensionalen Array, es ist aber meines Erachtens keines. Du hast jetzt eine Tabelle mit drei Unter-Tabellen gebaut. Marino will aber so etwas wie ein dreidimensionales Array (ohne dass ich weiß wozu). Er scheint von einer Programmiersprache wie Pascal herzukommen. Und deshalb sind Arrays für ihn "rechteckig" (jeder Eintrag hat dieselbe Anzahl an Unter-Einträgen). Zumindest legt das seine Formulierung nahe:

    ST - ARRAY [0..1,0..7,0..4] OF USINT

    Und deswegen wollte ich ihm den Unterschied erklären. Vor sehr langer Zeit bin ich von Pascal auf C umgestiegen, wobei C in diesem Punkt ähnlich tickt wie Lua. Und ich erinnere mich noch genau an die Schwierigkeit der Umstellung.


    Wenn er dieses Ding in Lua umsetzen und gleich initialisieren wollte, wäre das so etwas wie

    Einerseits möchte ich ihm von der Verwendung des Schlüssels 0 abraten. Aber andererseits verstehe ich den Zweck seiner drei Indizes noch nicht und kann ihm deshalb nicht besser helfen.


    Gruß

    Christopher

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10; EEP 6, 15 (Dev), 17 (Dev); HomeNOS 14 (Dev)
    Laptop: Intel i5 3230M; 64bit; 2,6 GHz; 8GB RAM; GeForce GT740M (1 GB); Win 8.1; EEP 6, 13.2 Plugins 1+2; HomeNOS 13 (User)

  • Hallo cetz


    Tables in Lua sind laut Beschreibung indizierte Arrays (siehe https://www.lua.org/pil/2.5.html).

    Quote

    We use tables to represent ordinary arrays, symbol tables, sets, records, queues, and other data structures, in a simple, uniform, and efficient way.

    Ich interpretiere diese Beschreibung so, dass man Tables in Lua auf alle Möglichen Arten und Weisen einsetzen kann.

    Nativ kann Lua keine Arrays, da gebe ich Dir recht, aber ich kann m.E. mit Tables welche erstellen - das würde ich dann aber auch unter Array verstehen. (Ich hoffe das ist jetzt keine Haarspalterei).


    Marino : Auch mich würde interessieren, was Du in dem Array speichern möchtest. Kannst Du uns sagen, welche welche Daten Du in den 2*8*5 Feldern ablegen willst? Ich kann mir nicht mal erklären, wie 2*8*5 zustande kommt. Wofür steht das?


    Viele Grüße,

    Andreas Kreuz.

    EEP: Version 15 - PC: AMD Ryzen 3700X, 16 GB RAM, NVidia Geforce GTX 1080 Ti, Windows 10 - Notebook: MacBook Pro 2015, mit ATI Radeon R9 M370X, Windows 10


    Webseite: Lua-Bibliothek für EEP (mit Tutorials)

  • Na ja, habe in einem System eine Schaltuhr implantiert, welche natürlich andauernd einen Zeitabgleich mit der Echtzeit vollziehen muss.

    Diese Schaltuhr kann von extern (z.B. via Modbus) die Schaltzeiten einlesen. Die Schaltintervalle sind auf Min. 1Min. begrenzt, dabei jedoch sekundengenau.

    Dazu kann der Status des Output beeinflusst werden, so dass der Zustand bis zum nächsten gültigen Zeitpunkt invertiert bleibt.


    Der Code ist in ST gehalten (PASCAL ähnlich) und doch ziemlich umfangreich...


    ich versuche das mal hier einzufügen. sieht auch so nicht so toll aus....


    Der Beginn vom Ganzen ist der Aufruf der Echtzeituhr in DATE_AND_TIME (dt) welche die aktuelle Sekunde seit dem 1.1.1992 in doppelinteger ausgibt.

    EEP 15.1 [x64] Patch 2

    hat ein klein wenig Ahnung von System-Programmierung :bn_1:

    https://abload.de/img/zglbrckqhkzh.jpg

    Windows 10 Pro 64-Bit

    HP Compaq 8100 Elite CMT PC / Intel(R) Core(TM) i5 CPU 760 @ 2.93GHz RAM 12GB

    GeForce GTX 1050 Ti / LCD Monitor 2*HDMI 3440 * 1440

    HP Z230 - CPU Intel® Xenon® E3-1225 v3 3.2GHz 64Bit (Win10 & Debian 10.3)

    The post was edited 3 times, last by Marino: Header vergessen ().

  • da die Einrückungen verloren gehen....

    Um das Problem nicht zu haben, nutze doch bitte für Code diesen Knopf </> in der oberen Leiste deines Posting. Mit einem Klick auf "Quellcode" kannst du dann sogar die passende Sprache auswählen. Dann hast du zu den Einrückungen auch noch Syntax-Highlighting.


    Du kannst das im Beitrag oben korrigieren. Klick einfach auf "Bearbeiten"

  • Hallo Marino ,


    "Meine" Wochenzeitschaltuhr hätte für jede Minute (60) jeder Stunde (24) eines Wochentags (7) ein Feld. Da komme ich auf 7*24*60 Felder.



    Da ich Deinen Code (auch mit richtiger Formatierung) nicht lesen kann, würde ich meine Frage noch mal wiederholen:

    Wofür steht 2*8*5?


    Viele Grüße,

    Andreas Kreuz.

    EEP: Version 15 - PC: AMD Ryzen 3700X, 16 GB RAM, NVidia Geforce GTX 1080 Ti, Windows 10 - Notebook: MacBook Pro 2015, mit ATI Radeon R9 M370X, Windows 10


    Webseite: Lua-Bibliothek für EEP (mit Tutorials)

    The post was edited 5 times, last by Andreas_Kreuz: Eckige Klammern ergänzt, Lua-Code-Formatierung ().

  • das steht bei der Deklaration das ARRAY zu lesen: On/OFF, Day, Hour1/Min1/Hour2/Min2


    Nun -

    Die 1. Dimension selektiert die nächste Schaltzeit für TRUE bez. FALSE

    Die 2. Dimension selektiert den Wochentag

    Die 3. Dimension selektiert die Schaltzeiten, 2 für Ein und 2 für Aus (Die [x.x.0] steht für die nächste Schaltzeit)

    Es werden bei dieser Applikation eben lediglich 2 Sequenzen täglich benötigt.


    Die Schaltzeiten werden via WinCC mittel einer Tabelle in die entsprechenden Wochenmatrix eingetragen

    EEP 15.1 [x64] Patch 2

    hat ein klein wenig Ahnung von System-Programmierung :bn_1:

    https://abload.de/img/zglbrckqhkzh.jpg

    Windows 10 Pro 64-Bit

    HP Compaq 8100 Elite CMT PC / Intel(R) Core(TM) i5 CPU 760 @ 2.93GHz RAM 12GB

    GeForce GTX 1050 Ti / LCD Monitor 2*HDMI 3440 * 1440

    HP Z230 - CPU Intel® Xenon® E3-1225 v3 3.2GHz 64Bit (Win10 & Debian 10.3)

    The post was edited 1 time, last by Marino ().

  • Hallo Marino ,


    danke, damit kann ich was anfangen :aa_1:

    So könnte die reine Datenstruktur in Lua abgebildet werden:

    Viele Grüße,

    Andreas Kreuz.

    EEP: Version 15 - PC: AMD Ryzen 3700X, 16 GB RAM, NVidia Geforce GTX 1080 Ti, Windows 10 - Notebook: MacBook Pro 2015, mit ATI Radeon R9 M370X, Windows 10


    Webseite: Lua-Bibliothek für EEP (mit Tutorials)

  • Hallo zusammen,


    man könnte die Daten natürlich auch anders strukturieren. Das ist alles Geschmackssache:



    Viele Grüße,

    Andreas Kreuz.


    P.S. Und auch zwischen englischen und deutschen Bezeichnern sollte ich mich mal entscheiden :ba_1:

    EEP: Version 15 - PC: AMD Ryzen 3700X, 16 GB RAM, NVidia Geforce GTX 1080 Ti, Windows 10 - Notebook: MacBook Pro 2015, mit ATI Radeon R9 M370X, Windows 10


    Webseite: Lua-Bibliothek für EEP (mit Tutorials)

  • hi Andreas


    so weit so gut, nur wie kann ich mit einem Dynamischen Pointer den entsprechenden Wert auslesen?


    analog => ((usHour = IusDay3D[1,usWDay,3])


    Hier wird das Array IusDay3D aufgerufen = D1 (1), D2 (mit Variablenwert), D3 (3)

    EEP 15.1 [x64] Patch 2

    hat ein klein wenig Ahnung von System-Programmierung :bn_1:

    https://abload.de/img/zglbrckqhkzh.jpg

    Windows 10 Pro 64-Bit

    HP Compaq 8100 Elite CMT PC / Intel(R) Core(TM) i5 CPU 760 @ 2.93GHz RAM 12GB

    GeForce GTX 1050 Ti / LCD Monitor 2*HDMI 3440 * 1440

    HP Z230 - CPU Intel® Xenon® E3-1225 v3 3.2GHz 64Bit (Win10 & Debian 10.3)