Beiträge von hexfile im Thema „Kleine BASIC-Knobelei“

    Ja, eine Sache fehlt mir noch, bzw. ist eigentlich falsch (in Zeile 20 nochmal genau hingucken!). Ich möchte mal sagen, deine Lösung ist in mehreren Punkten knapp daneben...

    Ah, in Zeile 20 wird auf =0 verglichen (also de-facto invertiert), d.h. es sind die ungeraden Werte von j, die im weiteren Programmcode (unter Zeile 20) benutzt werden und nicht die geraden wie in meinem Beitrag oben erwähnt.

    Mal die Frage an Alle, die schon obfuskierten Code hier zum Rätseln aufgegeben haben: wir lange habt Ihr eigentlich gebraucht, bis das Ganze fertig war?

    Ich schätze das es bei mir 30 bis 60 Minuten dauerte, da ich verschiedene Möglichkeiten probiert und einiges getestet hatte. Manche Ansätze erschienen mir letztlich zu einfach und bei anderen befürchtete ich, dass sie (viel) zu kompliziert sind.

    Ticker, so ähnlich sehe ich das auch.

    Wegen der Berechnung der Anzahl der Leerzeichen in Zeile 30: Die Berechnung scheint wie folgt zu sein

    • für i=1 wird berechnet 13.4 - 0.5*j, wobei j=2,4,6,...,22. Die Anzahl der Leerzeichen sollten in diesem Fall also 12, 11, 10, ..., 2 sein. Je in einer Zeile, danach je ein *. (11 Sterne in einer Diagonalen, die so / geht)
    • für i=2 wird 26.8 + 0.5*j berechnet (auch hier j=2,4,6,...22). Die Anzahl der Leerzeichen sollten in diesem Fall 28 (oder 27?), 29, 30, ..., 38 sein. Je in einer Zeile, danach je ein *. (11 Sterne in einer Diagonalen, die so \ geht).

    Vielleicht noch ein paar Worte zum Code:

    Spoiler anzeigen

    1 A$="[--] {LEFT}{UP}{RIGHT}{DOWN} [++]":C=RND(0):B=RND(.5)*4+1

    In A$ sind nur die mitteleren vier Zeichen von Bedeutung - sie bestimmen später die Bewegung des Hastagszeichens. C dient der Obfuskation und spielt eigentlich keine relevante Rolle für die eigentliche Programmfunktion. B wählt von den vier relevanten Zeichen für die Bewegung eines aus:


    2 PRINTMID$(A$,B+5,1)"#{LEFT}{UP}{DOWN}#{LEFT}";:FORI=1TO6:C=C+1:NEXT:PRINT"{RVSON} {LEFT}";
    Zeile 2 setzt die zufällige Bewegung des Hashtags um und setzt (hinterlässt) ein weißes Feld dort wo es war. Die For-Schleife dient zusammen mit dem Wert C an dieser Stelle lediglich eine kleine Zeitverzögerung, damit das Programm etwas langsamer ist. C ist hier nach der Schleife als Integer Wert betrachtet 6.

    3 POKEC+53014+27*2-6,INT(106+3*SIN(B*C)):GOTO1
    Zeile 3 bezieht sich auf die VIC-II Adresse 53270, die mit den untersten vier Bit einer Zahl (die sich u.a. aus dem Sinus mit ergibt) werden die Bildschirmeffekte ausgelöst: Das zufällige Screen-Zappeln: Horizontal raster scroll und Screen-Breite entweder 38 oder 40 Zeichen.

    Eigentlich ist das kaum vorhersehbar wegen den beiden RND, selbst C kann dabei ja 1 sein (C kann also in Zeile 3 nur 6 oder 7 sein). Auch den Sinus auf dem Papier vorherzusagen, ist eigentlich unmöglich.


    Bei dem Rätsel kann man eigentlich nur auf ein Bauchgefühl hoffen. Mein Tipp daher: ein Zeichen (Hashtag) ändert fröhlich die Farbe...

    Bitte melde dich an, um diesen Link zu sehen. liefert Werte zwischen 0.0 (inklusive) und 1.0 (exklusive) . Für die Zeile 3 kann der Wert von C durchaus abgeleitet werden.

    Zufall spielt eine Rolle. Farben ändern sich aber keine. Was anderes ist zufällig.

    Edit: Wegen des Sinus: Der hat ja auch nur einen bestimmten Wertebereich...

    Was ist das für ein Zeichen zwischen 2 und 7 in der dritten Zeile? Mein Browser kennt das nicht...

    Im C64 Zeichensatz ist das der "Pfeil nach oben" (zwischen * und Restore-Taste) :

    Bitte melde dich an, um diesen Anhang zu sehen.

    Sollte oben ungefähr so aussehen:

    Bitte melde dich an, um diesen Anhang zu sehen.

    OK. Dann löse ich mal auf. Sollte ja ohnehin nur ein kurzes Intermezzo sein und ich freue mich auch schon auf neue Knobeleien. Wer ist denn jetzt dran?

    Ich stelle auch gerne einen Code zum Knobeln vor:

    Code: C64 Basic
    1 A$="[--] {LEFT}{UP}{RIGHT}{DOWN} [++]":C=RND(0):B=RND(.5)*4+1
    2 PRINTMID$(A$,B+5,1)"#{LEFT}{UP}{DOWN}#{LEFT}";:FORI=1TO6:C=C+1:NEXT:PRINT"{RVSON} {LEFT}";
    3 POKEC+53014+27*2-6,INT(106+3*SIN(B*C)):GOTO1

    :f5: :?:

    Ich bin auf die Lösungsvorschläge gespannt...

    Edit: Als Listing auf dem C64 sieht es so aus:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Eine Variante sei bitte noch erlaubt, da sie noch etwas anderes aus dem Thread hier, das weiter oben erwähnt wurde, aufgreift und somit eine "Kombination" ist :zaunpfahl::

    :poke53280,0:poke53280,1:poke1024+512*(rnd(0)+rnd(0)),42:poke122,0 bzw. unter Verwendung der Kurzschreibweise für poke-Befehle geht noch etwas mehr

    :a=53280:pOa,0:pOa,1:a=512*(rnd(0)+rnd(0)):pO1024+a,42:pO55296+a,1:pO122,0

    :thumbsup:

    Ne, erraten dürfte schwer sein. War ja auch nur als Lückenfüller gedacht, bis jemand ein neues richtiges Rätsel einstellt - ich löses es auf, sobald das neue Rätsel da ist.

    Auch ich habe Überlegungen angestellt und musste es, der Neugier geschuldet, aber auch ausprobieren und die Kernal-Doku sichten, um es zu verstehen. Interessante Sache. Dürfen leichte Abwandlungen davon hier eingestellt werden (vielleicht als eine Art Hinweis/Tipp für diejenigen, die regelkonform den Programmcode nur gedankenmäßig ausführen), die praktisch dasselbe bewirken - oder es lieber sein lassen, damit die Interessenten anhand des Originalbeispiels weiterraten können?