Lua-Aufgabe 20: einsamer Teenager

!!! 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 zurück, ob genau eine von zwei Zahlen a und b im Bereich zwischen 13 und 19 einschließlich liegt.


    Beispiele:

    einTeen(14, 21) -> true

    einTeen(16, 17) -> false



    LUA Source Code
    1. function einTeen(a, b)
    2. end

    Ergänze die obige Funktion so, dass sie true zurück gibt, wenn eine und nur eine der beiden Zahlen a und b im Bereich zwischen 13 und 19 einschließlich liegt, 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.

  • Meine Lösung:

    Code
    1. function einTeen(a, b)
    2. return ((a < 20 and a > 12) or (b < 20 and b > 12)) and not (a < 20 and a > 12 and b < 20 and b > 12)
    3. end
    4. Die Funktion hat alle 13 Tests bestanden.

    Fried-liche Grüße:aq_1:

  • Für eine komplette Lösung bin ich gerade zu faul, deshalb habe ich nur im Lua Reference Manual nachgeschaut.

    "Genau eins von beidem" ist XOR. Dazu findet man im Manual nichts vernünftiges, aber zur ausgeschrieben Form exclusive OR. Nämlich: ~ ist der Operator für bitweises XOR. Wenn man allerdings weiterliest, merkt man: Der Operator gilt für Zahlen. Wenn die Argumente keine Zahlen sind, werden sie zu Zahlen konvertiert. Das Ergebnis ist auf jeden Fall eine Zahl. Wir wollen aber nur ein einfaches true/false.

    Aber in dem Fall hilft weiterlesen. Im nächsten Abschnitt geht es um "relationale Operatoren". Da gibt es einen, der ähnlich aussieht, aber anders heißt: ~=, Ungleichheit.

    Aber wenn wir mal genau überlegen, ist das genau das, was wir wollen: Wenn genau eine Zahl im erlaubten Bereich sein soll, muss die andere außerhalb sein. Oder mit anderen Worten: Der "Erlaubt-Status" der beiden Zahlen muss ungleich sein.


    Und wo ich jetzt schon so viel geschrieben habe, will ich es doch noch in Code fassen:

    LUA Source Code
    1. function einTeen(a, b)
    2. return (a>=13 and a<=19) ~= (b>=13 and b<=19)
    3. end

    (Wenn man unbedingt Zeichen sparen will, könnte man das >=13 durch ein >12 ersetzen, gleiches natürlich auch mit <=19)


    Viele Grüße

    Benny

  • Hallo zusammen,


    hier ein weiterer Vorschlag mit Variablenzuweisungen:

    LUA Source Code: mit Zuweisungen
    1. function einTeen(a, b)
    2. local aIsTeen = a >= 13 and a <= 19
    3. local bIsTeen = b >= 13 and b <= 19
    4. return aIsTeen ~= bIsTeen
    5. end


    ... und einer mit einer Hilfsfunktion:

    (das local vor der Funktion sorgt dafür, dass diese nicht global ist).

    LUA Source Code: mit extra-Funktion
    1. --- Hilfsfunktion um rauszubekommen, ob das Alter ein "Teen" ist.
    2. local function isTeen(age)
    3. return age >= 13 and age <= 19
    4. end
    5. function einTeen(a, b)
    6. return isTeen(a) ~= isTeen(b)
    7. end

    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)