Contest #1: Fibonacci Zahlen



  • Erster Versuch fuer kurzen Code:

    Zeile 1: 16 Zeichen + 1 Newline
    Zeile 2: 63 Zeichen

    Macht 80 Byte Code. Das sind ~2/3 von der allerersten Lösung von SeppJ.

    Also noch viel Luft für Verkürzungen.

    Link:
    http://codepad.org/yy2fZHrB


  • Mod

    Aber die neue Aufgabe ist, alle Fib-Zahlen zwischen zwei benutzergegebenen Zahlen auszugeben


  • Mod

    nicht besonders kurz, dafür einfach:

    #include<iostream>
    #include<math.h>
    int main(){auto t=[](int x){return[](int x){return x*x;}(sqrt(x))==x;};int a,b;std::cin>>a>>b;for(;a<=b;++a)if(t(5*a*a+4)||t(5*a*a-4))std::cout<<a<<' ';}
    

    193 Zeichen



  • Ich würde eine Regel einführen, dass Whitespaces und Newlines nicht gezählt werden.


  • Mod

    math.h ist länger als cmath 😉 . Auch wenn es nicht Standard ist, so kann man doch ziemlich verlässlich annehmen, dass ein cmath die sqrt auch im globalen Namensbereich auslädt.

    Um solche Konflikte zu vermeiden, sollte man eventuell noch einen oder zwei bestimmten Compiler definieren. Wie wäre es, wenn das Programm entweder auf einem g++ 4.4 oder auf einem MSVC(was immer gerade aktuell ist) compilieren muss?


  • Mod

    SeppJ schrieb:

    math.h ist länger als cmath 😉

    Dafür spar ich mir ein std::


  • Mod

    camper schrieb:

    SeppJ schrieb:

    math.h ist länger als cmath 😉

    Dafür spar ich mir ein std::

    Siehe Rest meines Beitrags. Auch wenn es nicht mehr im Standard liegt, so ist da doch noch Sparpotential.


  • Mod

    #include<iostream>
    int f(int x,int y=0){return y*y==x||y*y<x&&f(x,y+1);}int main(){int a,b;std::cin>>a>>b;for(;a<=b;++a)if(f(5*a*a+4)||f(5*a*a-4))std::cout<<a<<' ';}
    

    166 Zeichen.
    Mups Code um einen Bereichscheck erweitert dürfte immer noch kürzer sein. Vielleicht hat ja jemand eine Idee, wie nman den square-Test verkürzen könnte.



  • @camper
    I lol'd 😃

    @Topic
    Gute Idee. Blöde Aufgabe.



  • Meine angepasste Lösung:

    #include<iostream>
    int a,b=1,x,y;int main(){std::cin>>x>>y;for(;a<y;b+=a,a=b-a){if(a>x)std::cout<<a<<" ";}}
    

    18+1+88 Zeichen == 107 Zeichen

    Allerdings werden hier wirklich nur die Zahlen *zwischen* den Grenzen (exklusive der Grenzen) ausgegeben. Wenn man die Zahlen inklusive Grenzen ausgeben möchte, werden es noch zwei Zeichen mehr.



  • Ich habe auch mal etwas runtergetippt, ohne bei den anderen vorher zu spicken. Es kann etwas mehr als gefordert war...




  • Mod

    @Mups: Du kannst dir noch zwei Klammern sparen.

    Und coole Nullinitialisierung 👍 😋

    Ich hatte gerade einen ganz ähnlichen Ansatz gebastelt, dank expliziter Initialisierung aber länger. Hat sich nun wohl erledigt, kürzer als deines (minus die Klammern), bekomme ich es vorerst nicht mehr 😞



  • SeppJ schrieb:

    Aber die neue Aufgabe ist, alle Fib-Zahlen zwischen zwei benutzergegebenen Zahlen auszugeben

    Ich habe in der Tat angefangen damit. Bin jetzt bei 122 Zeilen und das Prog schweigt sich einfach aus und zeigt mal gar nichts an. Wiedermal sowas, wo man den Debugger anmachen möchte. Aber nein, ohne ist es viel spannender und schärft den Blick. 🙂



  • Ich schlage einen neuen Ansatz vor: Die ausdrucksstärkste Implementierung.

    Vorschläge?

    MfG SideWinder



  • SideWinder schrieb:

    Ich schlage einen neuen Ansatz vor: Die ausdrucksstärkste Implementierung.
    Vorschläge?
    MfG SideWinder

    Ausdrucksstärke ist Effekt pro Token? Das wird doch gerade parallel gemacht.



  • Nein, ich denke da eher an ausdrucksstärke des Codes = Lesbarkeit.

    MfG SideWinder



  • SeppJ schrieb:

    @Mups: Du kannst dir noch zwei Klammern sparen.

    Und coole Nullinitialisierung 👍 😋

    Ich hatte gerade einen ganz ähnlichen Ansatz gebastelt, dank expliziter Initialisierung aber länger. Hat sich nun wohl erledigt, kürzer als deines (minus die Klammern), bekomme ich es vorerst nicht mehr 😞

    Stimmt, das mit den Klammern ist mir erst zu spät auf dem Nachhauseweg im Bus eingefallen 🤡

    #include<iostream>
    int a,b=1,x,y;int main(){std::cin>>x>>y;for(;a<y;b+=a,a=b-a)if(a>x)std::cout<<a<<" ";}
    

    18+1+86 Zeichen == 105 Zeichen

    Doof gefragt: Wie zähle ich die Tokens?

    int a,b=1,x,y;

    Sind das "int" "a" "," "b" "=" "1" "," "x" "," "y" ";" also 11 Token?



  • µ schrieb:

    http://upload.wikimedia.org/math/1/6/e/16ea0dee516003a472c75c4e0b8b4154.png

    Der zweite Term wird mit hohem n immer kleiner, und auch bei kleinen kommt man mit einer Rundung davon. Zwei Methoden in einem (zu Vergleichszwecken):

    #include <iostream>
    #include <cmath>
    
    int main() {
      int fib[] = { 0, 1 };
    
      for(int i = 0; i < 20; ++i) {
        std::cout << fib[i % 2] << ' ';
        fib[i % 2] = fib[0] + fib[1];
      }
      std::cout << '\n';
    
      for(int i = 0; i < 20; ++i) {
        std::cout << static_cast<int>(1 / std::sqrt(5) * std::pow((1 + std::sqrt(5)) / 2, i) + .5) << ' ';
      }
      std::cout << '\n';
    }
    


  • Meine Lösung:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        unsigned int first = 0;
        unsigned int second = 1;
        unsigned int quantity = 18;
    
        cout << first << endl;
        cout << second << endl;
        for( int i = 0; i < quantity; ++i )
        {
            cout << first + second << endl;
            int temp = first + second;
            first = second;
            second = temp;
        }
    }
    

    Allerdings würde ich vorschlagen, dass man die Datei irgendwo hochladen sollte, wo nur der "Chef" Zugriff hat, dieser läd dann nach der Deadline alle Codes hier hoch, bzw jeder darf dann drauf zugreifen. Dies würde vermeiden, dass jemand Code kopiert und dann eventuelle Streitereien enstehen. Man weiß ja nie 😉
    Nur so ein Vorschlag:-P

    Lg freeG


Anmelden zum Antworten