Seite 1 von 3

Code-Golf

Verfasst: Mittwoch 16. Oktober 2024, 18:26
von Dennis89
Hallo,

falls jemand Langeweile hat, hier eine Funktion (`find_max_sum`) mit der man das vielleicht spielen könnte:

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup
import re

URL = "https://projecteuler.net/problem=18"


def get_puzzle_input(url):
    html_parser = BeautifulSoup(requests.get(url).text, "html.parser")
    return [
        content.text
        for content in html_parser.find_all("p", {"class": "monospace center"})[1:]
    ]


def parse_input(content):
    numbers = []
    for line in content[0].splitlines():
        matches = [int(match) for match in re.findall(r"\d+", line)]
        if matches:
            numbers.append(matches)
    return list(reversed(numbers))


def find_max_sum(pyramid):
    for row in range(len(pyramid)):
        for column in range(len(pyramid[row]) - 1):
            pyramid[row + 1][column] += max(
                pyramid[row][column], pyramid[row][column + 1]
            )
    print(pyramid[-1][-1])


def main():
    pyramid = parse_input(get_puzzle_input(URL))
    find_max_sum(pyramid)


if __name__ == "__main__":
    main()
Ich überlege schon eine Weile, bin aber mal wieder fest gefahren.

Viel Spass
Dennis

Re: Code-Golf

Verfasst: Mittwoch 16. Oktober 2024, 19:20
von __blackjack__
Erst mal ohne spezielle Code-Golf-Absicht funktional:

Code: Alles auswählen

from functools import reduce
from itertools import pairwise


INPUT = [
    [75],
    [95, 64],
    [17, 47, 82],
    [18, 35, 87, 10],
    [20, 4, 82, 47, 65],
    [19, 1, 23, 75, 3, 34],
    [88, 2, 77, 73, 7, 63, 67],
    [99, 65, 4, 28, 6, 16, 70, 92],
    [41, 41, 26, 56, 83, 40, 80, 70, 33],
    [41, 48, 72, 33, 47, 32, 37, 16, 94, 29],
    [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14],
    [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57],
    [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48],
    [63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31],
    [4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23],
]

# INPUT = [[3], [7, 4], [2, 4, 6], [8, 5, 9, 3]]  # Expected result: 23 (3+7+4+9)


def find_max_sum(rows):
    return reduce(
        lambda xs, ys: [
            max(a + y, b + y) for (a, b), y in zip(pairwise(xs), ys)
        ],
        reversed(rows),
    )


def main():
    print(find_max_sum(INPUT))


if __name__ == "__main__":
    main()

Re: Code-Golf

Verfasst: Mittwoch 16. Oktober 2024, 19:50
von Sirius3
In `parse_input` erzeugst Du erst eine Liste, die Du dann in eine neue Liste kopierst. Was ja eine Liste zu viel ist. Mit List-Comprehension geht das auch kompakter:

Code: Alles auswählen

def parse_input(content):
    matches = (
        re.findall(r"\d+", line)
        for line in reversed(content[0].splitlines())
    )
    return [
        [int(n) for n in row]
        for row in matches
    ]
Der Code kann so nicht funktionieren, weil row+1 im letzten Schleifendurchlauf nicht existieren kann. Da fehlt ein -1. Besser wäre es aber eh, nicht über einen Index zu iterieren, sondern über die Elemente direkt.
Außerdem darf man keine Listenelemente verändern, sondern erzeugt einfach neue Listen.

Code: Alles auswählen

from itertools import pairwise

def find_max_sum(pyramid):
    pyramid = iter(pyramid)
    sum_row = next(pyramid)
    for row in pyramid:
        max_row = [max(pair) for pair in pairwise(sum_row)]
        sum_row = [a + b for a, b in zip(row, max_row)]
    return sum_row[0]
Und natürlich in der Golf-Variante:

Code: Alles auswählen

def f(p):s=p[0];return[s:=[a+max(p)for(a,p)in zip(r,pairwise(s))]for r in p[1:]][-1][0]
Wobei natürlich __blackjacks__ Code kürzer ist, wenn man die Importe wegläßt:

Code: Alles auswählen

f=lambda r:reduce(lambda x,y:[c+max(a,b)for(a,b),c in zip(pairwise(x),y)],r)[0]

Re: Code-Golf

Verfasst: Mittwoch 16. Oktober 2024, 20:14
von Dennis89
Fasziniert mich immer wieder, wir ihr das hinbekommt. Echt cool, vielleicht können wir das Thema ja auch immer mal wieder für so Spielereien nutzen.

@Sirius3 Das mit der doppelten Liste sehe ich ein. Dass da noch ein "-1" fehlt verstehe ich noch nicht ganz. An sich funktioniert der Code. Aber du hast auch "kann" geschrieben, als meinst du dass vielleicht so dass der Code nur speziell mit dieser Pyramide funktioniert.
Dieses mal habe ich die Schleife, wie man sieht, nicht ohne Indexzugriff hinbekommen. Darüber nachgedacht hatte ich zwar, aber bin zu keiner Lösung gekommen. Hatte aber nicht mal an `pairwise` gedacht, obwohl ich das bei Rätsel öfters verwende.

Danke für eure Lösungen.

Grüße
Dennis

Edit: Die Golf-Varianten geben ein zu großes Ergebnis zurück, bin noch auf Problemsuche, wollte das nur kurz schreiben, solange ich noch editieren kann.
Edit2: War mein Fehler in `parse_input`, sorry :D

Re: Code-Golf

Verfasst: Freitag 18. Oktober 2024, 18:47
von __blackjack__
Ich kann bei so etwas ja nicht widerstehen: Mein C64 braucht für die Lösung etwas mehr als 5 Sekunden mit folgendem BASIC-Programm:

Code: Alles auswählen

   10 TI$="000000"
   20 DIM T(15,15):FOR I=1 TO 15:FOR J=1 TO I:READ T(I,J):NEXT:NEXT
   30 FOR I=15 TO 2 STEP -1:FOR J=1 TO I-1
   40 K=J:IF T(I,J)<T(I,J+1) THEN K=K+1
   50 T(I-1,J)=T(I-1,J)+T(I,K):NEXT:NEXT
   60 PRINT T(1,1),TI/60
  850 DATA 75
  860 DATA 95,64
  870 DATA 17,47,82
  880 DATA 18,35,87,10
  890 DATA 20,4,82,47,65
  900 DATA 19,1,23,75,3,34
  910 DATA 88,2,77,73,7,63,67
  920 DATA 99,65,4,28,6,16,70,92
  930 DATA 41,41,26,56,83,40,80,70,33
  940 DATA 41,48,72,33,47,32,37,16,94,29
  950 DATA 53,71,44,65,25,43,91,52,97,51,14
  960 DATA 70,11,33,28,77,73,17,78,39,68,17,57
  970 DATA 91,71,52,38,17,14,91,43,58,50,27,29,48
  980 DATA 63,66,4,68,89,53,67,30,73,16,69,87,40,31
  990 DATA 4,62,98,27,23,9,70,98,73,93,38,53,60,4,23

Re: Code-Golf

Verfasst: Freitag 18. Oktober 2024, 19:09
von Dennis89
Ich dachte schon der wäre ksputt 🤪

Wieso kommt nach Zeile 60 nicht 70?

Muss man den Daten höhere Nummern geben, falls man den Code erweitern will?


Grüße
Dennis

Re: Code-Golf

Verfasst: Freitag 18. Oktober 2024, 19:44
von narpfel
@Dennis89: Die gleiche Antwort wie auf die Frage, warum nach Zeile 10 nicht Zeile 11 kommt: Wenn du mehr Code einfügen willst, brauchst du Platz.

Re: Code-Golf

Verfasst: Freitag 18. Oktober 2024, 19:51
von __blackjack__
@Dennis89: Ich hatte mit den DATA-Zeilen angefangen und hatte die so gewählt, dass die nicht vierstellig werden. Darum fangen die bei 850 an. Und dann habe ich ab Zeile 10 angefangen das Programm zu schreiben und bin dabei bis 60 gekommen. Wobei es technisch völlig egal ist wo die DATA-Zeilen stehen. Wenn die ”ausgeführt” werden, dann wird das DATA und alles was danach kommt, einfach übersprungen. Man könnte die also auch zwischen den anderen Code-Zeilen verteilen:

Code: Alles auswählen

LIST

10 DATA HELLO
20 READ A$
30 DATA WORLD
40 PRINT A$;" ";
50 DATA !
60 READ A$:PRINT A$;:READ A$:PRINT A$
READY.
RUN
HELLO WORLD!

READY.
Ab dem ”nächsthöheren” Rechner von Commodore wären die Zeilennummern fortlaufend, denn ab CBM BASIC V3.5 gibt es einen RENUMBER Befehl der die Zeilen neu durchnummeriert und auch GOTO & Co entsprechend anpasst.

Re: Code-Golf

Verfasst: Freitag 18. Oktober 2024, 20:16
von sparrow
Das mit der Zeilennummerierung und wie man damit Zeilen auf dem C64 "kopiert" kann man sich in aktuellen Umgebungen nur schwer vorstellen.
Hier sieht man das ganz gut. Fühlt man sich direkt 30 Jahre jünger.

Re: Code-Golf

Verfasst: Freitag 18. Oktober 2024, 20:29
von Dennis89
Achso okay, verstanden, Danke.

Vor 30 Jahren konnte ich noch keinen Computer bedienen. 🫣


Grüße
Dennis

Re: Code-Golf

Verfasst: Freitag 18. Oktober 2024, 22:39
von nezzcarth
Heute sieht man das so ähnlich manchmal noch bei Konfigurationsdateien, wenn man die Verarbeitungsreihenfolge festlegen und sich Raum für Ergänzung lassen möchte. Zum Beispiel bei Apache Setups mit mehren vhosts Configs ist es gängig, dass die mit einem 2- oder 3-stelligen Präfix in 10er Schritten benannt werden, um Platz zu lassen, z.B. für separate SSL configs etc.

Re: Code-Golf

Verfasst: Sonntag 20. Oktober 2024, 14:32
von __blackjack__
Zu DATA als Schlüsselwort vielleicht noch: Also BASIC erfunden wurde, war das in einigen Rechnerumgebungen die einzige Art variable Daten in das Programm zu bekommen, weil die Leute nicht selbst vor dem Rechner gesessen haben, sondern das Programm auf Lochkarten oder -streifen gestanzt haben, und das dann beim Rechnerbetrieb abgegeben haben, damit die das dann irgendwann in den Rechner der Uni, des Forschungsinstituts, oder der Firma fütterten. Und den nächsten Tag konnten sie sich dann das Ergebnis ausgedruckt oder als Lochstreifen abholen. Da hätte man dann zur Entwicklung beispielsweise zwei Lochstreifen abgegeben — das Programm und die Beispieldaten wo man das Ergebnis kennt:

Code: Alles auswählen

   10 TI$="000000":READ N:DIM T(N,N)
   20 FOR I=1 TO N:FOR J=1 TO I:READ T(I,J):NEXT:NEXT
   30 FOR I=N TO 2 STEP -1:FOR J=1 TO I-1
   40 K=J:IF T(I,J)<T(I,J+1) THEN K=K+1
   50 T(I-1,J)=T(I-1,J)+T(I,K):NEXT:NEXT
   60 PRINT T(1,1),TI/60
und

Code: Alles auswählen

  790 DATA 4:REM # OF ROWS TO FOLLOW
  800 DATA 3
  810 DATA 7,4
  820 DATA 2,4,6
  830 DATA 8,5,9,3
Um dann hoffentlich am nächsten Tag die 23 als Ergebnis bekommen. Oder eine andere Zahl → Fehlersuche. Oder einen Syntaxfehler oder einen Laufzeitfehler → Fehlersuche. Programm ändern, Lochstreifen stanzen, und das Ganze von vorne. Ein edit/run/debug-Cycle der in Tagen gemessen wird, und an dem mehrere Personen beteiligt sind. 🤓

Und wenn es dann gelaufen ist, den Lochstreifen mit den Testdaten durch den Lochstreifen mit den tatsächlichen Eingabedaten ersetzen:

Code: Alles auswählen

  840 DATA 15:REM # OF ROWS TO FOLLOW
  850 DATA 75
  860 DATA 95,64
  870 DATA 17,47,82
  880 DATA 18,35,87,10
  890 DATA 20,4,82,47,65
  900 DATA 19,1,23,75,3,34
  910 DATA 88,2,77,73,7,63,67
  920 DATA 99,65,4,28,6,16,70,92
  930 DATA 41,41,26,56,83,40,80,70,33
  940 DATA 41,48,72,33,47,32,37,16,94,29
  950 DATA 53,71,44,65,25,43,91,52,97,51,14
  960 DATA 70,11,33,28,77,73,17,78,39,68,17,57
  970 DATA 91,71,52,38,17,14,91,43,58,50,27,29,48
  980 DATA 63,66,4,68,89,53,67,30,73,16,69,87,40,31
  990 DATA 4,62,98,27,23,9,70,98,73,93,38,53,60,4,23
Und im Grunde könnte man den Lochsteifen mit dem Programm dann für Project Euler #67 — Maximum Path Sum Ⅱ wiederverwenden und einfach einen weiteren Lochstreifen mit den Daten dafür (”Pyramide” mit 100 Zeilen) mitgeben.

Was bei den Zeilennummern auch praktisch ist, ist das der Rechner die beim Einlesen richtig in den Programmspeicher einsortiert. Ein BASIC-Programm auf Lochkarten die heruntergefallen und durcheinander gekommen sind, kann man einfach so ungeordnet einlesen, sofern jede Zeilennummer nur einmal vorkommt.

Warum sollten Zeilennummern mehrfach vorkommen? Weil eine Zeile die es schon gab durch die neue Zeile ersetzt wird, und man so Änderungen und Ergänzungen zu einem Programm auf einem zusätzlichen Lochstreifen kodieren kann, statt das gesamte Programm mit den Änderungen und Ergänzungen noch mal zu stanzen. Das Programm oben könnte man Beispiel durch das hier ergänzen:

Code: Alles auswählen

   10 TI$="000000":READ N:DIM T(N,N),O(N,N)
   20 FOR I=1 TO N:FOR J=1 TO I:READ K:T(I,J)=K:O(I,J)=K:NEXT:NEXT
  500 INPUT"PRINT RESULT (Y/N)";C$:IF C$<>"Y" THEN END
  510 DIM P(N):E$=CHR$(27):OPEN 1,4
  520 PRINT#1,CHR$(14);"PROJECT EULER #18";CHR$(20);" - MAXIMUM PATH SUM I"
  530 PRINT#1
  540 FOR I=1 TO N:IF I=1 THEN P=1:GOTO 560
  550 IF T(I,P)<T(I,P+1) THEN P=P+1
  560 P(I)=O(I,P):FOR J=1 TO (N-I+1)*2:PRINT#1," ";:NEXT
  570 FOR J=1 TO I:K=O(I,J)
  580 IF K<10 THEN PRINT#1," ";
  590 IF J=P THEN PRINT#1,E$;CHR$(69);
  600 PRINT#1,K;
  610 IF J=P THEN PRINT#1,E$;CHR$(70);
  620 NEXT:PRINT#1:NEXT:PRINT#1:C$="+"
  630 FOR I=1 TO N:PRINT#1,P(I);:IF I=N THEN C$="="
  640 PRINT#1,C$;:NEXT:PRINT#1,T(1,1):CLOSE 1
Das ersetzt die ersten beiden Zeilen und fügt Code zum Drucken des Ergebnisses ein. In den ersten beiden Zeilen ist das Array ``O`` wie „Original“ dazu gekommen, weil ``T`` ja beim berechnen verändert wird. Der neue Code druckt dann auf Nachfrage die Pyramide, wobei die Zahlen vom Pfad fett gedruckt sind, und die Rechnung + Ergebnis aus.

Für die beiden Datensätze, Beispiel und eigentliche Aufgabe:
Bild
Das Endergebnis habe ich mal geschwärzt. 😎

Re: Code-Golf

Verfasst: Sonntag 20. Oktober 2024, 21:08
von Dennis89
Finde ich megal cool!

Gibt es irgendwas für Linux um den BASIC-Code auf einem modernen Rechner ausführen zu können, das ihr empfehlen könnt?

Grüße
Dennis

Re: Code-Golf

Verfasst: Sonntag 20. Oktober 2024, 23:10
von __blackjack__
Unverändert? Ein C64-Emulator. Zum Beispiel VICE. Sollte in den Paketquellen von den meisten Linux-Distributionen sein. Leider nach der Installation oft nicht direkt ausführbar, weil Debian & Co gerne die ROM-Dateien nicht mitliefern, weil nicht als Open Source lizensiert. Der übliche Tipp ist diese Dateien aus der Installationsdatei von VICE für Windows zu extrahieren. Das VICE-Projekt (GPL lizensiert) hat die Dateien nämlich in den Quelltexten. Der mutmassliche Urheberrechtsinhaber hat kein Problem wenn die ROMs für Emulatoren verwendet werden.

Mit Veränderungen bekommt man das sicher mit FreeBASIC mit der ``-lang qb``-Option kompiliert. Dann ist der Compiler halbwegs QBasic-kompatibel, was wiederum rückwärtskompatibel zu GW-BASIC ist — also das klassische Microsoft-BASIC für MS-DOS. FreeBASIC sollte auch bei den meisten Linux-Distribution aus den Paketquellen kommen.

Für GW-BASIC gibt es mit PC-BASIC einen in Python geschriebenen Simulator, den man per ``pip`` installieren kann.

Re: Code-Golf

Verfasst: Montag 21. Oktober 2024, 14:49
von __blackjack__
Ich habe es mal im Emulator ausprobiert und musste dafür für den emulierten Drucker zwei Steuercodes ändern. Bei meinem Drucker gibt es für „doppelt breit“ ein-/ausschalten Codes die nur ein Byte lang sind. Der emulierte Star NL10 in VICE kennt diese kurzen Codes nicht, sondern nur die lange Variante (die mein Drucker auch kennt).

In den Emulator bekommt man das wenn man den Quelltext in Kleinbuchstaben im Emulator am BASIC READY-Prompt über „Edit → Paste“ ”eingibt”:

Code: Alles auswählen

   10 ti$="000000":read n:dim t(n,n),o(n,n)
   20 for i=1 to n:for j=1 to i:read k:t(i,j)=k:o(i,j)=k:next:next
   30 for i=n to 2 step -1:for j=1 to i-1
   40 k=j:if t(i,j)<t(i,j+1) then k=k+1
   50 t(i-1,j)=t(i-1,j)+t(i,k):next:next
   60 print t(1,1),ti/60
  500 input"print result (y/n)";c$:if c$<>"y" then end
  510 dim p(n):e$=chr$(27):open 1,4
  520 print#1,e$;"w1";"project euler #18";e$;"w0 - maximum path sum i"
  530 print#1
  540 for i=1 to n:if i=1 then p=1:goto 560
  550 if t(i,p)<t(i,p+1) then p=p+1
  560 p(i)=o(i,p):for j=1 to (n-i+1)*2:print#1," ";:next
  570 for j=1 to i:k=o(i,j)
  580 if k<10 then print#1," ";
  590 if j=p then print#1,e$;chr$(69);
  600 print#1,k;
  610 if j=p then print#1,e$;chr$(70);
  620 next:print#1:next:print#1:c$="+"
  630 for i=1 to n:print#1,p(i);:if i=n then c$="="
  640 print#1,c$;:next:print#1,t(1,1):close 1
  790 rem data 4:rem example
  800 rem data 3
  810 rem data 7,4
  820 rem data 2,4,6
  830 rem data 8,5,9,3
  840 data 15:rem # of rows to follow
  850 data 75
  860 data 95,64
  870 data 17,47,82
  880 data 18,35,87,10
  890 data 20,4,82,47,65
  900 data 19,1,23,75,3,34
  910 data 88,2,77,73,7,63,67
  920 data 99,65,4,28,6,16,70,92
  930 data 41,41,26,56,83,40,80,70,33
  940 data 41,48,72,33,47,32,37,16,94,29
  950 data 53,71,44,65,25,43,91,52,97,51,14
  960 data 70,11,33,28,77,73,17,78,39,68,17,57
  970 data 91,71,52,38,17,14,91,43,58,50,27,29,48
  980 data 63,66,4,68,89,53,67,30,73,16,69,87,40,31
  990 data 4,62,98,27,23,9,70,98,73,93,38,53,60,4,23
Oder man speichert das ”übersetzte”/tokenisierte Programm als Binärdatei und gibt die beim start des Emulators beim Aufruf an.

Das Ergebnis von ``gzip < 018.prg | base64 > 018.ascii``, das man mit ``base64 -d 018.ascii | gzip -d > 018.prg`` wieder in eine Binärdatei umwandeln kann:

Code: Alles auswählen

H4sIAEtFFmcAA2VSMY/cRBR+t2m89onihKggGjmryCYPxTNje8Y2IFYbR/F61zZ7Pt2dlCpFqhSI
ApRUdwcEoUhJSUIDQkgn7oIAn5SCConiJCQqqFLwF2gogALxxpvlkHBhv3nve9/3vjdesy5aNrTF
qHOD/nHTD1mV3mWtV2HlY91/YMd6HvZZ0XH2BVX32bSPCsKWaesVOPW7Mq1XwUF6AO9a5/uOinCC
fcmO+VnbMYdHlgdlN03vsWX7Sf854j47ZGVXHnH4zhJAyWNuOFfBkYGVfq/wk/UqPKJ2jtzHtvgq
DuAP6/e1D9xmUVQtW+SbW7OWebuXK9/NJiOSmoxOvnV3XZLYg43h32t3WeNVfpqPulNPKD/9lHEM
YTG0Bg855qPM3eZuRnT1NJ+0LN+a5Qt2gWs362sBe4XNxzvFfGvOmnF7jW1SULiwO9ygfrg9fHFw
trJ7fXTImo6nH7GIZv14eHGwdN8s3TdL901HAfwwDAaNV/hd3QP+3Z1XHReEeyxSGtFlbkaLeDpM
B2dXUnbLe4DfhldIoDzhAbE+Q4NlV5Scds0yR0ZOvTjxM9iwd4zrMoNL9o3/QVRAkDfsW4MD0k37
14R+mUsu3LTf+Y9Nwpups95vRQQG9ZoL+/aeYZ+Msr4Zl7eWfsY4fGK/cO4BuzJuxyxMF/mc5Tvj
eTPL4dBmq4KEJ/bLq4OiOzq1w9VRYIgxPLVfXyU0RpighD/ta+feYzxKH7ALrL7KFvX2JmtrdrWe
zeptGDgLKqsInnOuU5BEGIfwknPT9JCEQi3gsvOWOWqUEWqFPICJc4cyIiBRLQwqjmDXed+gEuQo
JKoIJcoQ3nbuU1ZrFKgUKipgLDFWcN95aPQSaiUWoTFGHqMKMBHwtfM51UL6DYkrxihGLTEMUAcG
ICX87Dx+BtCoBGXMDJICZUgS4kvgL+cJYSJSJFhoZAQpSUw4RgIThREtP4TR+vdmAQFybnhokOWc
5F6RY5pPmzhS8Ob6j2ZibgiJQfZ5HhpCoo1o4QEKRdI0Feyt/0JgYzU2N6NRJxgZ4yiDnj7GODHb
JFuSwzfrvxpDGNNkumehQfttaINOpJEz/WblQgLAP8Vi2nGzBAAA
Der Drucker ist normalerweise in den Defaulteinstellungen nicht konfiguriert. Da kommt man über „Preferences → Settings… → Peripheral devices → Printer“ hin. Dort bei „Emulation type“ Haken bei „File system access“ und „Enable IEC device“ machen. Bei „Driver“ den „NL10“ wählen, und bei „Output mode“ dann „Graphics“. Jetzt generiert der Emulator eine BMP-Datei pro gedruckter Seite (im aktuellen Arbeitsverzeichnis). Die letzte Seite erscheint unter Umständen erst wenn der Emulator beendet wird, weil es ja sein könnte, dass noch mehr auf die Seite gedruckt wird.

Re: Code-Golf

Verfasst: Montag 21. Oktober 2024, 18:39
von Dennis89
Danke für die ausführliche Erklärung.

Habe nun VICE installiert, klappte problemlos und wenn ich den Emulator öffne erscheint mir ein bekanntes Bild, das neulich noch in deiner Signatur war.
Den Drucker habe ich umgestellt und deinen überarbeiteten Code, wie du geschrieben hast, eingefügt.

Und nun? Wie kompiliert der das? Übrigens werden die kleinen Buchstaben bei mir automatisch zu Großen. Ist das normal oder muss ich noch mehr einstellen?

Danke und Grüße
Dennis

Re: Code-Golf

Verfasst: Montag 21. Oktober 2024, 19:45
von __blackjack__
@Dennis89: Da wird nichts kompiliert. Wenn man den Quelltext über „Edit → Paste“ einfügt, dann ist das als wenn man den eintippt. Man sollte sicher sein, dass man auch das Zeilenende der letzten Zeile eingefügt hat, also quasi auch bei der letzten Zeile RETURN ”gedrückt” hat (Eingabetaste/Enter auf dem PC), damit auch die letzte Zeile in den Arbeitsspeicher übernommen wurde. Das Programm kann man sich mit LIST wieder am Bildschirm auflisten lassen, oder mit RUN starten.

Vielleicht doch noch mal kurz das Prinzip wie diese klassischen BASICs arbeiten: Nach dem einschalten ist man im „Direktmodus”, das heisst es läuft kein Programm, sondern man kann mit dem Cursor den sichtbaren Bildschirm bearbeiten. Wenn man die Eingabetaste drückt, schaut sich der Rechner die Zeile an in der sich der Cursor befindet. Fängt die nicht mit einer Zeilennummer an, dann wird versucht die Zeile direkt auszuführen, im Grunde so ähnlich wie in der interaktiven Python-Shell. Man kann also ``PRINT 2+3`` eingeben, die Eingabetaste drücken und es wird 5 ausgegeben. Falls die Zeile mit einer Zeilennummer anfängt, wird sie nicht ausgeführt, sondern in den Programmspeicher übernommen und an der richtigen Stelle nach Zeilennummer einsortiert. Falls es die Zeilennummer schon im Programmspeicher gab, wird die Zeile dort ersetzt. ``10 PRINT 2+3`` und Eingabetaste übernimmt diese Zeile in das Programm und man muss dann erst RUN eingeben, damit die 5 ausgegeben wird.

Wenn Du Buchstaben tippst, werden die auch gross angezeigt. Mit Shift+Buchstabe bekommt man Grafikzeichen. Mit Shift+S beispielsweise ein Herz. Tastatureinstellung hätte ich vielleicht auch erwähnen sollen. Bei deutscher Tastatur am besten in VICE das „Symbolic (DE)“-Layout einstellen. Hier gibt's ein Bild was dann auf welcher PC-Taste ist: https://vice-emu.sourceforge.io/vice_1.html#SEC14

Wenn man Shift und die Commodore-Taste (Tab-Taste auf'm PC) drückt, wird auf den anderen Zeichensatz umgeschaltet. Die normalen Buchstaben sind dann klein, und statt der Grafikzeichen, die man mit vorher mit Shift eingeben hat, bekommt man Grossbuchstaben.

Re: Code-Golf

Verfasst: Montag 21. Oktober 2024, 21:41
von Dennis89
Danke nochmal für die ausführliche Erklärung.

Habe ich soweit verstanden und funktioniert auch. Wenn ich dein Programm ausführe, dann fragt er `PRINT RESULT (Y/N)?` wenn ich "Y" eingebe und bestätige, geht es kurz und dann erscheint wieder `READY.`. Sieht für mich so aus, als ob das dann erfolgreich war. Zur Sicherheit noch einmal die Druckereinstellungen geprüft, die passen auch noch, aber ich finde kein Bild.

Egal ob ich mit `mmin` nach Dateien suche die vor ein paar Minuten erstellt worden sind oder mit `-iname *.bmp`. Im Netz habe ich noch Standardnamen wir `viceprnt.out` gefunden, aber auch die finde ich nicht.
Du meintest, dass die Datei im Arbeitsverzeichnis liegt. Ich habe einen `vice` Ordner gefunden unter `/usr/share/` darin liegen:

Code: Alles auswählen

[dennis@dennis vice]$ tree -L 1
.
├── C128
├── C64
├── C64DTV
├── CBM-II
├── common
├── DRIVES
├── GLSL
├── PET
├── PLUS4
├── PRINTER
├── SCPU64
└── VIC20
In den Ordnern liegen vermutlich die ROMS, in `common` icons von VICE, aber sonst kein Bild.
Es gibt noch ein `~/.cache/vice` Verzeichnis, aber das ist leer und wäre ja auch nicht für das ablegen von Ausdrucken geeignet.

Bin ich doof? Nach 2 Stunden Ordner durchsuchen, sollte man doch mal drauf kommen.

Danke und gute Nacht
Dennis

Re: Code-Golf

Verfasst: Montag 21. Oktober 2024, 23:15
von __blackjack__
@Dennis89: Das Arbeitsverzeichnis des Prozesses, also in der Regel das Verzeichnis in dem sich die Shell befand von wo aus man das Programm startet.

Vor dem Programmlauf sieht das bei mir so aus:

Code: Alles auswählen

bj@s8n:~/work/project_euler/00018$ ls -l
total 12
-rw-rw-r-- 1 bj bj   1808 Okt 21 14:59 018.bas
-rw-rw-r-- 1 bj bj   1203 Okt 21 14:12 018.prg
-rw-r--r-- 1 bj bj    977 Okt 18 19:22 018.py
Dann starte ich ``x64sc`` in dem Terminal und füge den Quelltext den Emulator ein, starte das Programm mit RUN. Nach der Eingabe von ``Y`` auf die Frage ob ich drucken möchte erscheint im Terminal „Serial Interface: Auto-opening printer #4,0.“ und wenn ich den Emulator beende nachdem das READY nach dem Programmende ausgegeben wurde, sieht's im Verzeichnis so aus:

Code: Alles auswählen

bj@s8n:~/work/project_euler/00018$ ls -l
total 956
-rw-rw-r-- 1 bj bj   1808 Okt 21 14:59 018.bas
-rw-rw-r-- 1 bj bj   1203 Okt 21 14:12 018.prg
-rw-r--r-- 1 bj bj    977 Okt 18 19:22 018.py
-rw-rw-r-- 1 bj bj 964350 Okt 22 00:01 print.dump01.bmp
Da ist das Bild von der gedruckten Seite.

Re: Code-Golf

Verfasst: Dienstag 22. Oktober 2024, 18:09
von Dennis89
Meeeeega! 😎
Bild

Vielen Dank. Muss nur noch Zeit finden, das Programm lesen zu lernen.

Ich habe bei der Installation von VICE schöne Desktop-Icons bekommen und den Emulator darüber gestartet und nicht über das Terminal. Jetzt wenn ich mein Arbeitsverzeichnis kannte, habe ich auch das Bild gleich gefunden, allerdings muss man den Emulator über "File" -> "Exit emulator" verlassen, sonst bleibt die Datei leer. Also im Terminal Strg+c bricht den wohl unkontrolliert ab.

Aus Interesse habe ich das System mal nach dem erzeugten Bildname suchen lassen, weil von gestern müsste ja irgendwo ein Bild liegen, aber die Suche war erfolglos.

Grüße
Dennis