Forum: PC-Programmierung Eine kleine Knobelei. Auch für den kommenden Freitag…


von Norbert (der_norbert)


Angehängte Dateien:

Lesenswert?

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
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Klingt nach OPCC (Obfuscated Python Code Contest).
von Norbert (der_norbert)


Lesenswert?

Jörg W. schrieb:
> Klingt nach OPCC (Obfuscated Python Code Contest).

Isses nicht. Normaler Python Code, perfekt lesbar.
von Helmut H. (helmuth)


Lesenswert?

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
von Yalu X. (yalu) (Moderator)


Lesenswert?

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.
von Stefan P. (form)


Lesenswert?

Norbert schrieb:
> Fibonacci-Folge bis zu einer Million

Aber 1000000 ist doch gar keine Zahl dieser Folge.
Beitrag #8071876 wurde vom Autor gelöscht.
von Helmut H. (helmuth)


Lesenswert?

Yalu X. schrieb:
> den Code in 1 Zeile zu quetschen.
leider darf while nicht nach Semikolon stehen, daher zwei Zeilen
von Yalu X. (yalu) (Moderator)


Lesenswert?

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().
von Stefan P. (form)


Lesenswert?

Ich habe es in 38 Bytes geschafft. Bin gespannt wie klein es werden 
kann...
von Ron-Hardy G. (ron-hardy)


Lesenswert?

6/88
von Norbert (der_norbert)


Lesenswert?

Yalu X. schrieb:
> Nimm exec().

Versau's doch gleich für alle. ;-)

Dann eben noch eine Version ohne exec…
von Norbert (der_norbert)


Lesenswert?

Stefan P. schrieb:
> Ich habe es in 38 Bytes geschafft.

Zeilen?
von Andreas B. (bitverdreher)


Lesenswert?

Norbert schrieb:
> Stefan P. schrieb:
>> Ich habe es in 38 Bytes geschafft.
>
> Zeilen?

1/2 (bei 80 Zeichen/Zeile)
von Stefan P. (form)


Lesenswert?

Aktuell bin ich bei 2 Zeilen mit 34 Bytes.
Das Programm darf ruhig bis zur Unendlichkeit weiterlaufen, oder?
von Helmut H. (helmuth)


Lesenswert?

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
von Yalu X. (yalu) (Moderator)


Lesenswert?

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.
von Norbert (der_norbert)


Lesenswert?

Stefan P. schrieb:
> Das Programm darf ruhig bis zur Unendlichkeit weiterlaufen, oder?

Wenn die Unendlichkeit unterhalb einer Million beginnt, dann ja. ;-)
von Michael M. (Firma: Autotronic) (michael_metzer)


Lesenswert?

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.
von Norbert (der_norbert)


Lesenswert?

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.
von Sheeva P. (sheevaplug)


Lesenswert?

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.
von Εrnst B. (ernst)


Lesenswert?

33 Zeichen, wer erkennt die Programmiersprache?
1
0p1p[dsa+plarlY1-dsY0<F]sF29sYlFx
von Norbert (der_norbert)


Angehängte Dateien:

Lesenswert?

Εrnst B. schrieb:
> wer erkennt die Programmiersprache?

Knorr!
von Helmut H. (helmuth)


Lesenswert?

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?
von Norbert (der_norbert)


Lesenswert?

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
von Daniel A. (daniel-a)


Lesenswert?

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.
von Εrnst B. (ernst)


Lesenswert?

Ε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
von Norbert (der_norbert)


Lesenswert?

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.
von Daniel A. (daniel-a)


Lesenswert?

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.
von Norbert (der_norbert)


Lesenswert?

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
von F. P. (fail)


Lesenswert?

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
von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

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
von Nick (b620ys)


Lesenswert?

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?
von Εrnst B. (ernst)


Lesenswert?

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
Noch kein Account? Hier anmelden.