Code Kata - Christmas Tree

  • Ich habe mir heute auch mal ChatGPT angesehen und gleich mal mit dieser Aufgabe hier betraut.

    Meine Frage war einfach: "Schreibe ein AutoIt-Programm, welches einen Tannenbaum in der Konsole ausgibt."

    Tja und das hier war das Ergebnis:

    gruselig...

  • Um mal wieder penetrant Werbung einzubauen - hier meine Methode mit der _ArrayPlus-UDF:

  • Hi AspirinJunkie ,

    [...] ChatGPT [...]
    Meine Frage war einfach: "Schreibe ein AutoIt-Programm, welches einen Tannenbaum in der Konsole ausgibt."

    Tja und das hier war das Ergebnis:


    gruselig...

    Ja absolut. Das sogar genug Daten für eine eher Nischensprache wie AutoIt vorhanden sind, ist krass!
    Auch wenn Dinge wie # RequireAdmin (falsch) und das Sleep(10000) am Ende darauf hindeuten das da nicht wie ein Mensch überlegt wurde, ist es schon beachtlich das zumindest die Grundlogik um das Problem zu lösen stimmt 🤯😅 .

    Um mal wieder penetrant Werbung einzubauen - hier meine Methode mit der _ArrayPlus-UDF:

    Super Beispiel was ein wenig Abstraktion an Qualität bringen kann 👍 . Gefällt mir gut, deine ArrayPlus.au3.
    Elegant und super simple, cool!

    Ein kleines aber gibt es trotzdem von mir: Ein wenig schade ist, dass bei dem expliziten Ansatz, eine Funktion als Parameter zu übergeben, jegliche Kontrolle vor dem ausführen bzw. beim Kompilieren verloren geht, da es ja einfach ein string ist. Zudem kommt dazu, dass eine weitere UDF eingebunden werden muss, doch insgesamt überwiegen auch für mich die Vorteile 😀 .

    💡 Fazit: Auch deine Variante ist natürlich korrekt, Danke dir fürs Mitmachen.


    Viele Grüße
    Sven

  • Ein wenig schade ist, dass bei dem expliziten Ansatz, eine Funktion als Parameter zu übergeben, jegliche Kontrolle vor dem ausführen bzw. beim Kompilieren verloren geht, da es ja einfach ein string ist.

    Da musst du mir nochmal auf die Sprünge helfen, da ich dies nicht verstanden habe.

    Wo genau geht Kontrolle verloren?

    Du legst ja selbst fest, welcher Code ausgeführt werden soll.
    Es muss auch kein String sein - es geht auch ein Funktionspointer oder ein fester String als Wert (dann darf halt kein $A drin vorkommen).

  • HI AspirinJunkie ,

    ich meine das so:

    Am Ende keine größe Sache, aber die Verwendung von Strings maskiert hierbei Fehler (im Fall der Fälle 😅).

    Viele Grüße
    Sven

  • Am Ende keine größe Sache, aber die Verwendung von Strings maskiert hierbei Fehler

    Das stimmt sicher und wir gelangen wieder zum Punkt: Wieviel Fehlermanagement soll der Ersteller einer UDF anbieten und wieviel soll der Anwender tun.

    Ich bin der Meinung, wenn klar definiert ist, wie ein Parameter auszusehen hat (in diesem Fall "String mit einer Funktion"), dann kann die UDF davon ausgehen, dass genau das übergeben wird und muss nicht extra Prüfungen durchführen. Diese Prüfung kann der Anwender problemlos selbst vorab durchführen, z.B. durch exportieren des Codes in eine Temp.au3 und Auswertung dieser mit Syntaxcheck.

  • Es gibt ja Alternativen zur Definition des Codes als Stringparameter.
    Diese ist ja nur mit in die UDF gekommen um eben extra zu schreibende Funktionen für kleinere Sachen zu vermeiden.

    Du kannst daher auch weiterhin direkt eine Funktion übergeben und dann hast du wieder dein Code-Parsing:

    AutoIt
    _ArrayCreate("1:" & 2*$nEbenen & ":2", meinefunktion)
    
    Func meinefunktion($Y)
        Return _StringRepeat("X", $Y)
    EndFunc
  • Hi BugFix ,

    [...] Wieviel Fehlermanagement soll der Ersteller einer UDF anbieten und wieviel soll der Anwender tun.

    Ich bin der Meinung, wenn klar definiert ist, wie ein Parameter auszusehen hat (in diesem Fall "String mit einer Funktion"), dann kann die UDF davon ausgehen, dass genau das übergeben wird und muss nicht extra Prüfungen durchführen. Diese Prüfung kann der Anwender problemlos selbst vorab durchführen, z.B. durch exportieren des Codes in eine Temp.au3 und Auswertung dieser mit Syntaxcheck.

    Da bin ich absolut bei dir 👍 . Ich würde diese Prüfung auch dem Anwender überlassen, wollte nur auf den Umstand aufmerksam machen, dass dies "unter umständen" zu längeren Fehlersuchaktionen führen kann.

    AspirinJunkie:

    [...] Diese ist ja nur mit in die UDF gekommen um eben extra zu schreibende Funktionen für kleinere Sachen zu vermeiden.

    Dies hätte ich persönlich so einfach nicht angeboten bzw. zugelassen. Die eine Variante, Funktionen zu übergeben, sollte "reichen". Das wäre strikter und ggf. weniger Fehleranfällig. Allerdings möchte ich auch keine Grundsatzdiskussion anheizen. Ich verstehe die Beweggründe und den Gedanken einer komfortablen Nutzung gut 👍 .

    Viele Grüße
    Sven

    PS.: Bitte lasst uns weitere Diskussionen dieser Art, falls sie nötig wären, in einem separaten Thread führen, Danke 🤝 .

  • Spoiler anzeigen
    Code
    Local $n=8,$0,$1='    ',$2=$1&$1&$1,$1=$2&$2&$2,$2=$1&$1&$1,$1=$2&$2&$2,$2=StringLeft,$4=$n-1,$5=Chr,$42=42,$3=$2(StringReplace($1&$1,' ',$5($42*2+4)),2*$n-4)
    For $i = 0 To $4 Step 1
        $0&=($i=0?$2($1,$n-$i-1):$i=$4?$2($1,$n-2):$2($1,$n-$i))&($i=0?$5($42):$i=$4?$5($42+82)&' '&$5($42+82):$2($3,$i*2-1))&($i=0?$2($1,$n-$i-1):$i=$4?$2($1,$n-2):$2($1,$n-$i))&@CRLF
    Next
    ConsoleWrite($0)
  • OMG Mars,

    du machst mich fertig 🤪😂 . Danke auch für deine Teilnahme 👍 .

    Kurz: Ist auch eine Lösung, stimmt auch.
    Noch kürzer: #augenbluten 😅 .

    Viele Grüße
    Sven

  • Mars

    nix komplizierte udf nix irgend etwas seltsammes - nur ein wenig nachgedacht und schon hat man mit ein paar Zeilen alles erledigt :klatschen::klatschen::klatschen:

    LG

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hab mal geschaut wie kurz ich es ohne irgendeine UDF in reinem AutoIt hinbekomme.
    Aktuell scheint bei mir bei 156 Zeichen Schluss zu sein:

    Spoiler anzeigen
    AutoIt
    $B=""
    For $i=1 To 14 Step 2
    $B&=StringFormat("%13."&$i&"s\n","XXXXXXXXXXXXX")
    Next
    ConsoleWrite("      *"&@LF&StringReplace($B,"  "," ")&"     | |"&@LF)

    Wer bietet weniger?

    2 Mal editiert, zuletzt von AspirinJunkie (22. Dezember 2022 um 08:01) aus folgendem Grund: Edit: Spoiler hinzugefügt

  • AspirinJunkie :rofl: Und es hätte noch eine Zeile sparen können, indem das Global in der 2. Teile steht

    ChatGPT hat auf Nachfrage dann einen dynamischen Code erstellt, der das ganz mit 177 Zeichen macht. Daraufhin habe ich ihm deinen Code geschickt und bekam folgende Antwort:

    Zitat

    Du hast Recht, dass der von dir vorgeschlagene Code tatsächlich kürzer ist als das von mir vorgestellte Beispiel. Der Code verwendet eine Schleife, um den Baumstring Schritt für Schritt aufzubauen, indem er jedes Mal eine zusätzliche Zeile hinzufügt, die aus Sternen besteht. Diese Sternzeichen werden mithilfe der StringFormat-Funktion generiert und dann dem Baumstring hinzugefügt.

    Es gibt jedoch einige mögliche Nachteile an diesem Ansatz. Zum einen ist der Code etwas schwieriger zu verstehen, da er eine Reihe von Funktionen verwendet, die für sich genommen vielleicht nicht offensichtlich sind. Zum anderen ist der Code nicht sehr flexibel und kann nur Baumhöhen generieren, die eine gerade Anzahl von Zeilen haben. Wenn du beispielsweise versuchen würdest, einen Baum mit einer Höhe von 7 Zeilen zu erstellen, würde der Code fehlschlagen.

    Letztendlich hängt es davon ab, welche Anforderungen du an deinen Weihnachtsbaum hast und wie wichtig dir die Lesbarkeit und Flexibilität des Codes sind. Beide von uns vorgestellten Beispiele könnten in unterschiedlichen Situationen sinnvoll sein. Ich hoffe, das hilft bei der Entscheidung! Wenn du weitere Fragen hast, lass es mich wissen.

  • [...] Letztendlich hängt es davon ab, welche Anforderungen du an deinen Weihnachtsbaum hast und wie wichtig dir die Lesbarkeit und Flexibilität des Codes sind. Beide von uns vorgestellten Beispiele könnten in unterschiedlichen Situationen sinnvoll sein. Ich hoffe, das hilft bei der Entscheidung! Wenn du weitere Fragen hast, lass es mich wissen.

    Das ist krass! Ich bin begeistert das Clean Code Aspekte in Betracht gezogen werden, bin gleichermaßen aber auch entsetzt wie gut die KI ist 🤪 . Wow.

    Viele Grüße
    Sven

  • Daraufhin habe ich ihm deinen Code geschickt und bekam folgende Antwort:

    What the hell?! =O

    Auch wenn er mit seiner Einschätzung, dass damit nur gerade Anzahl von Zeilen funktionieren daneben liegt.
    Ich vermute, das Step 2 wird ihn auf diesen Dreh gebracht haben.

    Zum anderen aber trifft er den Nagel komplett auf den Kopf indem er auf die mangelnde Lesbarkeit hinweist.

  • AspirinJunkie

    Ich bin beeindruckt. Nicht nur dass der Code verständlich ist, er ist flexibel anpassbar und wunderbar kurz. So soll Code sein!!!

    Frohe Weihnachten

    Peter

    Ps.: Kürzer kann ich mir nicht mehr (wirklich) vorstellen. Aber ich lasse mich gerne überraschen :)

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)