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. (Frei nach 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

  • 2022_12_22_08_55_40_Hi_Assistant_Greeting.jpg

    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. (Frei nach Albert Einstein)

  • Das Thema ist zwar schon alt, aber ich habe es erst gestern gefunden und außerdem steht wieder Weihnachten vor der Tür und ich möchte euch an meinen Ergenissen teilhaben lassen.


    Wer bietet weniger?

    Du mit 152 Zeichen, wenn du die Wagenrückläufe weglässt. ;)


    Ich bekomme morgen vom Nikolausi noch weniger Zeichen bereitgestellt, deshalb muss ich noch schnell ein paar mehr vergeuden! ^^

    Die etwas abgewandelte Variante von AspirinJunkie (143 Zeichen bei CRLF; 139 Zeichen bei LF):

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringFormat('%'&6-$i&'s%0'&$i*2-1&'s\n','',0)
    Next
    ConsoleWrite(StringReplace($t,'0','X')&'    | |'&@LF)

    Schaut halt etwas kryptisch aus. Hiermit wird es klarer (135 bzw. 131 Zeichen):

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringLeft('     ',6-$i)&StringLeft('XXXXXXXXXXX',$i*2-1)&@LF
    Next
    ConsoleWrite($t&'    | |'&@LF)

    Damit etwas kürzer (132/128 Zeichen):

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringMid('     ',$i)&StringMid('XXXXXXXXXXX',13-$i*2)&@LF
    Next
    ConsoleWrite($t&'    | |'&@LF)

    Und hiermit ganz kurz und klar (115/111 Zeichen):

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringMid('     XXXXXXXXXXX',$i,$i+5)&@LF
    Next
    ConsoleWrite($t&'    | |'&@LF)

    Leider erfüllen alle obigen Codes in diesem Thema bis auf jene von SOLVE-SMART, Moombas und Mars streng genommen nicht die Anforderungen von SOLVE-SMART (jedenfalls seinen Bildern nach zu urteilen), weil keine Leerzeichen rechts am Weihnachtsbaum angehängt werden.


    Die mit zwei zusätzlich vorangestellten sowie auffüllend angehängten Leerzeichen und in der Zeilenanzahl anpassbare, jedoch nicht mehr so klare letzte Variante von AspirinJunkie ohne sparsame Syntax wäre (582 Zeichen bei CRLF):

    Meine kürzeste Variante habe ich auch noch entsprechend angepasst (519 Zeichen bei CRLF):


    Gruß, fee

  • Hi fee 👋 ,

    witzig das die kleine Coding Kata morgen (17.12.) genau ein Jahr alt ist ... die Zeit vergeht 😅 .
    Danke auch dir für deinen Beitrag. Du hast gut zusammengefasst was gültig ist und was nicht - also laut Aufgabenstellung.
    Passt so wie beschrieben 🤝 und deine letzten beiden Code-Beispiele erfüllen die Kriterien #yeah .

    Btw.: Deine ersten 4 Code-Beispiele, welche kurz und nicht 100%tig der Aufgabenstellung entsprechen, sind außerdem noch unflexibel was die Anpassung auf 15 Zeilen angeht. Doch abgesehen davon: super kurz ==> hätte ich niemals so erstellen können (auch nicht wollen 😂), aber Hut ab!

    Viele Grüße
    Sven

  • Neues Jahr, neuer Weihnachtsbaum!

    (Entspricht nicht den Vorgaben, aber ich wollte einfach Basteln)

    lg

    M

  • außerdem noch unflexibel was die Anpassung auf 15 Zeilen angeht

    Ich weiß, aber als ich den Code von AspirinJunkie "verbesserte" (naja, wohl eher verkrüppelte 8o), verstand ich die detaillierte Funktionsweise des Codes immer besser und konnte durch weiteres Nachdenken die kürzeren Varianten entwickeln. Bei "gestauchten" 111 Zeichen war halt Schluss.

    Die Anpassung von acht Christbaumzeilen:

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringMid('     XXXXXXXXXXX',$i,$i+5)&@LF
    Next
    ConsoleWrite($t&'    | |'&@LF)

    auf 15 Zeilen (152/148 Zeichen):

    AutoIt
    $t='            *'&@LF
    For $i=1 To 13
    $t&=StringMid('            XXXXXXXXXXXXXXXXXXXXXXXXX',$i,$i+12)&@LF
    Next
    ConsoleWrite($t&'           | |'&@LF)

    ist doch gar nicht so schwer. 8o Naja, verständlicher und flexibler wäre es so: (231/223 Zeichen; leider erst ab $l=4 fehlerfrei)

    AutoIt
    $l=15
    $s=StringFormat('%'&$l-3&'s','')
    $p=StringReplace($s&$s&StringLeft($s,1),' ','X')
    $w=StringLen($s)
    $t=$s&'*'&@LF
    For $i=1 To $l-2
    $t&=StringMid($s&$p,$i,$i+$w)&@LF
    Next
    ConsoleWrite($t&StringTrimRight($s,1)&'| |'&@LF)


    Sehr schön Mars, gut gemacht! :thumbup:
    Ich dachte erst wegen deines Bildschirmfotos entgegen deiner Einleitung, es wird ein Weihnachtswald statt eines einzelnen Baumes ausgegeben. Naja, bleibt noch eine Aufgabe fürs nächste Jahr. ^^

    Im übernächsten Jahr wird erst der Weihnachtsbaum und im Jahr darauf ein Weihnachtswald funkelnd animiert, gell? :part:8):D Die beiden Jahre danach bilden mit farbig funkelndem Weihnachtsbaum und Weihnachtswald den krönenden Abschluss, wenn die Konsole Junge bekommen hat, hehe! :rofl:

    Nur so am Rande:

    • Mindestens diese Überbleibsel sind noch in deinem Code: , $o = False, - 0 und zwei Step 1.
    • Die lange Zeile in der Schleife mit $s &= (…) wäre mit verschachtelten If-Anweisungen deutlich lesbarer, sähe aber nicht so interessant aus.

    Der Weihnachtsbaum ist dir auf alle Fälle sehr gut gelungen, Respekt!

    Gruß, fee

    3 Mal editiert, zuletzt von fee (17. Dezember 2024 um 16:32)