Erstelle ein Python Programm mit dem die Fibonacci-Folge bis zu einer Million ausgegeben wird. Die niedrigste Anzahl Programmzeilen gewinnt (Kommentare zählen NICHT mit). Bei Gleichstand gewinnt die geringste Anzahl Zeichen für alle Programmzeilen summiert (Leerzeichen mitgerechnet, keine Tabs erlaubt). Vielleicht antwortet ihr zuerst nur mit mit xxx/xxx (Zeilen/Zeichen) um den anderen den Spaß nicht zu verderben. Habe einen Versuch mal angehängt.
:
Verschoben durch Moderator
Klingt nach OPCC (Obfuscated Python Code Contest).
Jörg W. schrieb: > Klingt nach OPCC (Obfuscated Python Code Contest). Isses nicht. Normaler Python Code, perfekt lesbar.
war doch klar. 42 Bytes in zwei Zeilen:
1 | 09.07.2026 11:29 42 fib.py |
2 | python fib.py |
3 | 0 |
4 | 1 |
5 | 1 |
6 | 2 |
7 | ... |
8 | 317811 |
9 | 514229 |
10 | 832040 |
:
Bearbeitet durch User
Norbert schrieb: > Die niedrigste Anzahl Programmzeilen gewinnt (Fast) jeder wird es schaffen, den Code in 1 Zeile zu quetschen. Deswegen wäre die Anzahl der Zeichen (einschließlich Leerzeichen und Newlines) ein besseres Kriterium.
Norbert schrieb: > Fibonacci-Folge bis zu einer Million Aber 1000000 ist doch gar keine Zahl dieser Folge.
Beitrag #8071876 wurde vom Autor gelöscht.
Yalu X. schrieb: > den Code in 1 Zeile zu quetschen. leider darf while nicht nach Semikolon stehen, daher zwei Zeilen
Helmut H. schrieb: > Yalu X. schrieb: >> den Code in 1 Zeile zu quetschen. > leider darf while nicht nach Semikolon stehen, daher zwei Zeilen Nimm exec().
Ich habe es in 38 Bytes geschafft. Bin gespannt wie klein es werden kann...
Yalu X. schrieb: > Nimm exec(). Versau's doch gleich für alle. ;-) Dann eben noch eine Version ohne exec…
Norbert schrieb: > Stefan P. schrieb: >> Ich habe es in 38 Bytes geschafft. > > Zeilen? 1/2 (bei 80 Zeichen/Zeile)
Aktuell bin ich bei 2 Zeilen mit 34 Bytes. Das Programm darf ruhig bis zur Unendlichkeit weiterlaufen, oder?
Yalu X. schrieb: > Nimm exec(). stimmt, eine Zeile aber 53 byte 09.07.2026 11:29 42 fib.py 09.07.2026 11:54 53 fibex.py
Norbert schrieb: > Yalu X. schrieb: >> Nimm exec(). > > Versau's doch gleich für alle. ;-) Sorry, das war nicht meine Absicht. Ich hatte das da überlesen: Norbert schrieb: > Bei Gleichstand gewinnt die geringste Anzahl Zeichen für alle > Programmzeilen summiert (Leerzeichen mitgerechnet, keine Tabs > erlaubt). Ohne das hätte es viele gleichwertige Lösungen gegeben, deswegen mein Einwand.
Stefan P. schrieb: > Das Programm darf ruhig bis zur Unendlichkeit weiterlaufen, oder? Wenn die Unendlichkeit unterhalb einer Million beginnt, dann ja. ;-)
Stefan P. schrieb: > Aber 1000000 ist doch gar keine Zahl dieser Folge. Die Folge hört sowieso bei 832040 auf. Jede größere Zahl wäre schon größer als eine Million. Da es sich nur um 30 Zahlen handelt, könnte man es sogar schneller mit dem Taschenrechner rechnen, als extra ein Programmchen dafür zu schreiben. Ich kann aber trotzdem mal versuchen ein kleines Quickbasic-Programm auf die Beine zu stellen und das ganze von der Länge her mit einem Turbo-Pascal-Programm zu vergleichen. Ein Excel-Programmchen wäre auch noch ganz interessant, weil es in den normalen Büros am Arbeitsplatz am meisten verwendet wird. Das könnte ich eigentlich gleich in der Mittagspause mal machen, aber ausgerechnet heute gibt es in der Kantine leckere Spaghetti Bolognese da kann ich leider nicht widerstehen.
Yalu X. schrieb: > Ohne das hätte es viele gleichwertige Lösungen gegeben, deswegen mein > Einwand. Wir können das Ganze ja dahingehend erweitern, dass nun nach zwei Lösungen gesucht wird. Eine mit ›exec‹ und eine ohne.
Michael M. schrieb: > Da es sich nur um 30 Zahlen handelt, könnte man > es sogar schneller mit dem Taschenrechner rechnen, als extra ein > Programmchen dafür zu schreiben. Aber nur, wenn man ein extrem schlechter Programmierer ist.
33 Zeichen, wer erkennt die Programmiersprache?
1 | 0p1p[dsa+plarlY1-dsY0<F]sF29sYlFx |
Stefan P. schrieb: > Aktuell bin ich bei 2 Zeilen mit 34 Bytes. rechnet man das LF (0a) nicht mit, komme ich auf 37:
1 | 61 3d 30 3b 62 3d 31 0a 77 68 69 6c 65 20 61 3c |
2 | 31 65 36 3a 70 72 69 6e 74 28 61 29 3b 62 3d 61 |
3 | 2b 62 3b 61 3d 62 |
Bitte um einen kleinen Hinweis wie man noch 3 byte einsparen kann?
Helmut H. schrieb: > Bitte um einen *kleinen Hinweis* Die Antwort findet sich in den ›Built-in Types‹ Aber Obacht: Stefan schrieb: > Das Programm darf ruhig bis zur Unendlichkeit weiterlaufen, oder? Darf es nicht…
:
Bearbeitet durch User
1 | f=lambda a,b:a<=1e6 and (print(a),f(b,a+b));f(0,1) |
50 Zeichen. Ohne die Limite (das "a<=1e6 and ") wären es 39.
Εrnst B. schrieb: > 33 Zeichen Bin die Zählvariable "Y" noch losgeworden, 24 Zeichen
1 | 0p1p[dsa+plard7d^>F]dsFx |
(Trick ist: Die Rekursion auf "F" läuft, solange 7⁷ ("7d^") größer als
die vorletzte Zahl ist)
Danke an Michael für die Idee:
Michael M. schrieb:
> Taschenrechner
Daniel A. schrieb: > f=lambda a,b:a<=1e6 and (print(a),f(b,a+b));f(0,1) > > 50 Zeichen. Ohne die Limite (das "a<=1e6 and ") wären es 39. Du genießt es bestimmt dich hinter die Kinokasse zu stellen und jedem der sich gerade eine Karte gekauft hat zu erzählen wie der Film ausgeht.
Eventuell gibt es ja noch bessere Lösungen. Ausserdem gibt es viele Ansätze. Die hier sind etwas länger:
1 | print([round(1.618034**x/2.236068) for x in range(31)]) |
1 | x=[0,1];print([x:=[*x,sum(x[-2:])] for i in range(29)][-1]) |
1 | x=[0,1];print([x:=[*x,x[-1]+x[-2]] for i in range(29)][-1]) |
1 | print([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040]) |
:
Bearbeitet durch User
Beitrag #8071962 wurde vom Autor gelöscht.
Daniel A. schrieb: > Eventuell… Meine Methode: Eine Aufgabe. Einsteiger, Forgeschrittene und Experten suchen und finden Lösungen auf ihrem Niveau. Dass ein Einsteiger nicht die gleichen Resultate wie ein Profi liefert, ist jedem klar. Ob nun mit 1,2,5 oder 10 Zeilen, who cares? Aber darauf kommt es gar nicht an. Denn jeder beschäftigt sich zunächst einmal damit, denkt selbstständig darüber nach und findet dabei vielleicht ein paar neue Aspekte. Deine Methode: Hier isses! Mit dem erwartbaren Resultat: Ah … Yo … click … abputzen … fertig. Ich hatte für meine im Eröffnungsbeitrag angehängte Version (Passwort wäre morgen gekommen) schon eine vollständige, dokumentierte Erklärung (für die Einsteiger), die jeder in Schritten hätte nachvollziehen können.
1 | -rw------- 1 norbert norbert 2307 9. Jul 14:25 'Eine_mögliche_Version Herleitung.txt' |
2 | -rwx------ 1 norbert norbert 1492 9. Jul 12:04 Eine_mögliche_Version.py |
3 | -rw------- 1 norbert norbert 955 9. Jul 10:26 Eine_mögliche_Version.py.asc |
Ist jetzt in /dev/null zu finden. Nicht im /dev/null des boards, in meinem. Ad: Ohne exec, ohne lambda
:
Bearbeitet durch User
Daniel A. schrieb: > f=lambda a,b:a<=1e6 and (print(a),f(b,a+b));f(0,1) > > 50 Zeichen. Ohne die Limite (das "a<=1e6 and ") wären es 39. Das läßt sich noch um 3 Zeichen kürzen:
1 | f=lambda a,b:a<1e6and(print(a),f(b,a+b));f(0,1) |
Gibt aber wie das Original noch ein paar Sachen mehr als die Zahlen aus.
:
Bearbeitet durch User
Man könnte auch aus dem Keller raus in die Welt gehen und ne passend grosse Sonnenblume finden: http://www.3d-meier.de/tut22/Sonne/Seite1.html
Norbert schrieb: > Die niedrigste Anzahl Programmzeilen gewinnt > (Kommentare zählen NICHT mit). Der Masstab wäre für mich die generierte Codegröße, nicht ob das Ergebnis ein nicht wartbarer Quältext ist. Ausser, man schreibt ausdrücklich einen Obfuscated C/Perl/Python/Tcl/Brainfuck ... contest aus. Wie sieht eigentlich obfuscated Brainfuck aus?
Um das Rätsel um die Knorr-Buchstabensuppe aufzulösen:
1 | 0p1p[dsa+plard7d^>F]dsFx |
2 | 0 p 1 p [d sa + p la r d 7 d ^ >F] d sF x |
ist für den "Desk Calculator", "dc", Unix-Kommandozeilen-Taschenrechner
mit RPN von 1971. (Aus der Zeit um Forth)
RIP, Lorinda Cherry.
Der Code ist nicht extra obfuscated, das gehört so (Leerzeichen sind
optional).
Und für diesen Contest natürlich außer Konkurrenz, falsche Sprache.
0 und 1 auf den Stack, jeweils ausgeben ("p"), Makro/String definieren
[..], duplizieren ("d"), als Variable F speichern ("sF"), und die zweite
Kopie ausführen ("x")
innerhalb vom Makro: letzte Fibonacci-Zahl nach Variable "a" kopieren
("d" und "sa"), dann die beiden letzten Zahlen addieren ("+") Summe
ausgeben ("p"), Wert von "a" wieder auf den Stack ("la"), Reihenfolge
der beiden Stack-Elemente umdrehen ("r"), Top-of-stack duplizieren
("d"), 7 zweimal auf den Stack (7 und "d"), potenzieren (^),
Conditional, beide letzten Stackwerte vergleichen, wenn größer, dann
Makro F ausführen (">F") als Rekursion.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
