Ich würde ja sagen, es gibt "HUHU" aus und in Zeile 120 fehlt nicht step-1, sondern :print"huhu":end ![]()
Beiträge von berni im Thema „Kleine BASIC-Knobelei“
-
-
Genau. Und das hat noch eine Nebenwirkung am Ende der Schleife. Ist aber nur ein Detail und mit ein Grund, warum ich Zeile 50 mit aufgenommen habe.Ich löse es jetzt einfach mal auf, dann hat auch noch jemand anderes die Möglichkeit ein weiteres Programm einzustellen: Was ich witzig finde, ist, dass die zweite For-Schleife effektiv ein FOR j=1TO23 STEP 2 ist. Also die ungeraden Zahlen von 1 bis 23 durchläuft (und eben nicht nur bis 21). Dadurch sind es je 12 und nicht 11 Sterne und das GOTO dient dazu, dass die Ausgabe nicht oben aus dem Bildschirm scrollt.
Das mit Zeile 50 war doch Ironie.
Hatte ich ursprünglich auch so verstanden, aber nach dem Kommentar von hexfile war ich mir nicht mehr so sicher. Ich bin ja neu hier...

-
Das goto 50 in Zeile 50 sollte das Programm doch eigentlich "nur anhalten", wenn ich mich nicht irrre. Fragen sind, ob das Anhalten tatsächlich erforderlich ist (warum?) oder nur ein nice-to-have ist - oder tatsächlich noch was übersehen?
Ja, man hätte auch WAIT198,1:POKE198,0 schreiben können, dann hätte das Programm auf einen Tastendruck gewartet; aber dann wäre es ja wieder mit einem POKE gewesen...
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.
Genau. Und das hat noch eine Nebenwirkung am Ende der Schleife. Ist aber nur ein Detail und mit ein Grund, warum ich Zeile 50 mit aufgenommen habe. -
Ja, das stimmt schon fast.
Danke. Das "fast" bedeutet also, dass noch ein relevantes(?) Detail von Ticker und mir übersehen wurde. Vielleicht hat ja noch jemand einen Lösungstipp.
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... -
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?
Etwa 10 Minuten. Ich hatte relativ schnell eine Idee, etwas damit rumexperimentiert und war recht schnell mit dem Ergebnis zufrieden.
-
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).
Ja, das stimmt schon fast.
-
-
Datei öffnen?
Mein VICE kann sowas nicht. Zumindest gibt es den Eintrag nicht im Menü. Ich hab' aber inzwischen rausgefunden, dass, wenn ich ihn mit "x64 bsp.prg" starte, das Programm geladen und sofort ausgeführt wird. Und mit "smart attach" hab' ich auch hinbekommen, dass es geladen wird, ohne gleich danach ausgeführt zu werden. Das ist glaube ich noch nicht ganz das, was du mit "Datei öffnen" meinst, aber ich muss da in die ganze Emulationswelt noch reinwachsen...
Aber: Jetzt sehe ich auch, dass ich oben nicht ganz richtig lag. Es gibt noch ein Detail, das ich übersehen habe.
-
Wer das Programm ausführen will: Anbei die prg-Datei.
Öh, wie kriegt man die jetzt in VICE rein?
-
Ich würde mal sagen: Der Poke sorgt dafür, dass der Bildschirm irgendwie hin und her zappelt. Genauer kann ich das nicht beschreiben. Der Rest hingegen ist eine Hashtag, der fröhlich durch die Gegend irrt und dabei eine Spur aus vollausgefüllten Feldern hinterlässt.
-
Im C64 Zeichensatz ist das der "Pfeil nach oben"
Ja, danke, jetzt ist es klar. Dann muss ich wohl jetzt mal nachdenken...
-
Was ist das für ein Zeichen zwischen 2 und 7 in der dritten Zeile? Mein Browser kennt das nicht...
-
Na dann sag doch gleich, dass es um CHRGET ($0073) und/oder CHRGOT ($0079) geht

Hab' ich doch - steht im Spoiler - hast du den übersehen?
-
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?
Spoiler anzeigen
Die Lösung ist: Der Rahmen wird schwarz und ein gelber Balken wandert von oben nach unten durch den Rahmen. Die Zeile beendet sich nie.
Warum? Der POKE122,1 setzt den Zeiger auf den nächsten zu bearbeitenden Befehl zurück auf den Doppelpunkt nach dem CLR. Danach werden die drei Pokes erneut ausgeführt. Der CLR-Befehl ist im Grunde genommen nicht notwenig (dann muss es POKE122,0 heißen), allerdings muss dann die Zeile mit einem Doppelpunkt anfangen, da der Interpreter nach dem dritten Poke einen Doppelpunkt erwartet, diesen aber jetzt, aufgrund des geänderten Zeigers, am Anfang der Zeile sucht. Mit dem CLR-Befehl wollte ich diesen Doppelpunkt etwas verschleiern.
Noch etwas Hintergrund zu dem POKE122,1: Der Zeiger dort befindet sich mitten in einer zentralen Routine (CHRGET) des BASIC-Interpreters, die als so wichtig angesehen wurde, dass sie der schnelleren Ausführung wegen in die Zeropage ausgelagert wurde. Das hat zudem den Vorteil, dass die Routine sich selbst modifizieren kann (eben jenen Zeiger) und macht es BASIC-Erweiterungen leichter, sich in das BASIC einzuklinken.
Eine Variante, die mir noch eingefallen ist, lautet:
poke122,16:poke53280,0:poke53281,0
Hier sorgt der erste Poke dafür, dass der zweite nie ausgeführt wird, der dritte aber schon.

-
Im Programmmodus geht das auch:
Wobei da allerdings auch viel schief gehen kann. Beispielsweise wenn jemand noch eine weitere Zeile eingibt:
50 print"cooler trick:"
Oder wenn der BASIC-Start nicht bei $0800 liegt. Und zudem hat man im Programmmodus natürlich auch den GOTO-Befehl, der einem im Direktmodus fehlt.
-
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?
Ja, klar darfst du Varianten posten. Ich hatte ja selber im Vorfeld damit etwas rumexperimentiert. Es funktioniert zum Beispiel nicht so gut, wenn bei einem der ersten beiden Pokes die zweite Zahl zweistellig ist. Jetzt bin ich gespannt, welche Varianten dir so eingefallen sind...
-
Also da musste ich auch nachgucken, und dann durch's Kernal blättern, was da eigentlich passiert. Echt interessant! Das kann man aber ehrlicherweise kaum erraten, wenn man das nicht mal durchexerziert hat

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.

-
berni das ist fies, da muss man ja erst mal suchen, was in 122 passiert

Und ich seh' grad im Wiki ist es auch noch falsch... Hab's jetzt korrigiert.
-
Sorry, tut mir leid, so schöne, knackige Rätsel wie 4k4rvi hab ich nicht drauf. Darum bin ich gespannt auf seine weiteren Progs, wenn er wieder da ist! Freue mich schon!

Ich bin ganz neu hier, hab' keine Ahnung von den knackigen Rätseln von 4k4rvi, noch warum und bis wann er weg ist...
Aber: Ich bin heute gerade zufällig über eine lustige Basic-Zeile gestolpert (und auch über dieses Quiz) und frage mich seither, wo und wie ich das wem anderes, der was damit anfangen kann, zeigen kann. Auch wenn es mit POKEs ist (darf man gerne im C64-Wiki nachschlagen), glaube ich, dass es hier noch am ehesten hinpasst. Also, was passiert wenn man folgende Zeile im Direktmodus eingibt?
clr:poke53280,7:poke53280,0:poke122,1