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.
Εrnst B. schrieb: > 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"), 21 + 13 = 34 34 + 21 = 55 55 + 34 = 89 89 + 55 = 144 usw. Eigentlich bräuchte man nur das Summenergebnis mit der größeren Zahl der beiden Summanden erneut addieren und diese Schleife einfach nur 30 Mal wiederholen lassen. Die Überprüfung, ob die Zahl letztendlich größer als eine Million ist, kann man wegfallen lassen. Man weiß ja dass es nur 30 Zahlen sind. Also lässt man die Schleife einfach automatisch nach 30 Wiederholungen enden. Fertig.
Εrnst B. schrieb: > Der Code ist nicht extra obfuscated, das gehört so (Leerzeichen sind > optional). Dem würde ich für den Thread hier trotzdem uneingeschränkt das obfuscation award zugestehen. ;-) Ich habe auch mal FORTH programmiert und auch HP48, aber dc ist ja durchaus noch 'ne Runde kryptischer.
Wenn man sich das als Blockbild digitaler Logik (siehe Anhang) hinpinselt zerfällt das Ganze in wenige Subblöcke: * ein Summierer * zwei Register, eins davon mit (invertiertem) enable/load * ein Toggle-FlipFlop Die Register haben jeweils "0" oder "1" als Reset-value, mehr ist da nicht an Datenpfad. Der controllpfad (FSM) ist auch nicht viel komplexer, kommt halt ein counter oder ein komperator "kleiner als" hinzu. Sollte in ein kleines CPLD passen.
:
Bearbeitet durch User
Bradward B. schrieb: > kommt halt ein counter oder ein komperator "kleiner als" hinzu. und ein Anlasser um das erste Element (0) zu erzeugen.
Michael M. schrieb: > Eigentlich bräuchte man nur das Summenergebnis mit der größeren Zahl der > beiden Summanden erneut addieren das macht "dsa+plar" Stack: fib(n-1),fib(n) "d" Stack: fib(n-1),fib(n),fib(n) "sa" Stack: fib(n-1),fib(n) Variable: a: fib(n) "+" Stack: fib(n+1) "p" -> print fib(n+1), Stack unverändert "la" Stack: fib(n+1),fib(n) "r" Stack: fib(n),fib(n+1) -> Bereit für den nächsten Durchlauf > und diese Schleife einfach nur 30 Mal > wiederholen lassen. War so in der ersten Version von mir. Ist in "dc" umständlich, wenn die Zählvariable am Stack liegt, als Variable geht viel Code für load&store drauf: "29sY" -> 29 in Variable Y in der Schleife: "lY1-dsY" -> loadY, -1, dup, storeY > Die Überprüfung, ob die Zahl letztendlich größer als > eine Million ist, kann man wegfallen lassen. War dann aber ein paar Zeichen kürzer. 1 Mio ließe sich in dc als "10 6^" schreiben, bräuchte aber ein Leerzeichen. die Fibonacci-Zahlen liegen "da oben" weit genug auseinander, dass ich als Alternativ-Zahl 7^7 für den Vergleich nehmen konnte. "7 7^" oder mit dup "7d^", nochmal zwei Buchstaben gespart. Jörg W. schrieb: > Ich habe auch mal FORTH programmiert und auch HP48, aber dc ist ja > durchaus noch 'ne Runde kryptischer. Ja... Die Syntax ist vermutlich als "Welche Tasten würde ich in welcher Reihenfolge am Taschenrechner tippen" entstanden. Und musste in ASM gut verarbeitbar sein, das Original-"dc" ist kurz vor "C" entstanden. Macht mal Spaß, sich wieder in das alte Zeug reinzufuchsen, aber real verwenden möchte ich es nicht mehr.
1 | a, b = 0, 3 |
2 | for _ in range(10): |
3 | print(a) |
4 | a, b = b, 7 * b - a |
Die KI ist auch gar nicht schlecht, wenn man nur die Endfibo-Zahl braucht.
:
Bearbeitet durch User
>> kommt halt ein counter oder ein komperator "kleiner als" hinzu. > > und ein Anlasser um das erste Element (0) zu erzeugen. Ja, der RST(reset)-generator, sehe ich extra zur FSM, so als POR (PowerOnReset).
:
Bearbeitet durch User
Rbx schrieb: > Die KI ist auch gar nicht schlecht, wenn man nur die Endfibo-Zahl > braucht. Wenn KI erlaubt ist und man benötigt wirklich nur die Endfibonaccizahl, die direkt unter einer Million liegt, dann wäre ich mit nur einer einzigen Zeile fertig und hätte das Rennen somit automatisch gewonnen. 😅 Man gibt einfach die Frage direkt in die Suchzeile von der KI ein: "Wie lautet die größte Fibonaccizahl unter einer Million?" Und man bekommt direkt im Klartext die Antwort, sowohl durch das gesprochene Wort von einer netten Dame (Audioausgabe aus dem Lautsprecher) und auch als geschriebenen Text zum Ablesen vom Bildschirm: 832040 Das ist aber in Wirklichkeit etwas gemogelt. Die eigentliche Rechenleistung fällt dadurch ja nicht weg, sie wird nur aus den eigenen 4 Wänden in die Cloud verlagert.
>> Die KI ist auch gar nicht schlecht, wenn man nur die Endfibo-Zahl >> braucht. > > Wenn KI erlaubt ist und man benötigt wirklich nur die Endfibonaccizahl, > die direkt unter einer Million liegt, dann wäre ich mit nur einer > einzigen Zeile fertig und hätte das Rennen somit automatisch gewonnen. Also ohne KI bräuchte es statt einer Zeile nur einen Suchstring wie "Fibonacci wiki". Klar, dann müsste man noch scrollen, aber man hätte auch den Kontext und wäre überzeugt das die 832 040 die Höchste der Gesuchten ist. Ohne Computer könnte man in Tabellenbüchern nachschlagen - Überraschenderweise ist in "meinem" Tabellenbuch keine Fibonacci-Folge angegeben. Braucht wohl in der Praxis keiner, anders als diverse Integrale, Verteilungen und Fourierentwicklungen die in dem Tabellenbuch gelistet werden.
:
Bearbeitet durch User
Bradward B. schrieb: > Überraschenderweise ist in "meinem" Tabellenbuch keine Fibonacci-Folge > angegeben. Die kanonische Sammlung von Folgen ganzer Zahlen ist diese: https://oeis.org/ https://oeis.org/A000045 Gab es auch mal in Buchform (1973).
Zino schrieb: > Bradward B. schrieb: >> Überraschenderweise ist in "meinem" Tabellenbuch keine Fibonacci-Folge >> angegeben. > > Die kanonische Sammlung von Folgen ganzer Zahlen ist diese: > > https://oeis.org/ > https://oeis.org/A000045 > > Gab es auch mal in Buchform (1973). Aus der Zeit hab ich in der Erbmasse wohl noch Logarithmentafeln, -bücher. Braucht man glücklicherweise seit der Erfindung des Taschenrechners nicht mehr. Ansonsten ab und zu mal ein standardisiertes Polynom, ja da hat die Fernmeldeunion mal ein paar magic numbers wie ne CRC-32 o.ä. publiziert. Ja mei, heute sind sogar Telefonbücher ausgestorben und SF-Autoren wie Lem, hätten philosophische Werke wie "Die Stimmes des Herrn" nicht geschrieben (in letzterem ist der Einstiegsgedanke, das in einem Tabellenbuch eine Zufallsfolge abgedruckt ist, die sich unerwarteterweise wiederholt) ... https://de.wikipedia.org/wiki/Die_Stimme_des_Herrn Ja, Zahlenfolgen können so manchen zur "Spinnerei" verleiten ;-)
Zu Abwechslung eine Zeile Postscript in der Ghostscript-Konsole:
GS>0 1{dup 3 1 roll add dup 1e6 gt{exit}if}loop pop =
832040
GS>
oder
GS>0 1 29{dup 3 1 roll add}repeat = pop
832040
GS>
oder
GS>0 1 29{exch 1 index add}repeat = pop
832040
GS>
Erklärung:1 | Code Stack |
2 | 0 1 dup 0 1 1 |
3 | 3 1 roll 1 0 1 rotiert die oberen 3 Stackelemente um 1 nach rechts |
4 | add dup 1 1 1 |
5 | 3 1 roll 1 1 1 exch 1 index macht [fast] das gleiche |
6 | add dup 1 2 2 |
7 | 3 1 roll 2 1 2 |
8 | add dup 2 3 3 |
9 | 3 1 roll 3 2 3 |
10 | add dup 3 5 5 |
11 | 3 1 roll 5 3 5 |
12 | add dup 5 8 8 |
13 | 3 1 roll 8 5 8 |
14 | add dup 8 13 13 |
15 | etc. |
:
Bearbeitet durch User
Norbert schrieb: > Erstelle ein Python Programm mit dem die Fibonacci-Folge bis zu einer > Million ausgegeben wird. Da der Freitag nun vorbei ist, poste ich mal zwei Möglichkeiten mit je 38 Byte.
Stefan P. schrieb: > Da der Freitag nun vorbei ist, poste ich mal zwei Möglichkeiten mit je > 38 Byte. Die Aufgabenstellung wurde hier zwar schon in jeder erdenklichen Art und Weise kaputt gemacht, aber dein Einsatz verdient eine Antwort. fib1: Mhhhh, prüft aber nicht auf 1e6 sondern führt etwas vorbestimmt 31 mal aus. fib2: Gut soweit, aber zwei Zeilen. Übernehme die zweite Zeile genau so wie sie ist als Basis. Lösche die Erste und modifiziere nun die einzig verbleibende Zeile bis es funktioniert. Ohne Exec, Lambda, List compr., usw… Das geht, versprochen. ;-)
:
Bearbeitet durch User
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.

