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.
(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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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. ;-)