Kleiner Zeitvertreib



  • Wer sowas lustig findet, moechte sich ja vielleicht auch mal Gedanken darueber machen, nach welcher Formel wohl folgende Zahlenreihe gebildet wurde, und wie sie fortgesetzt wird:
    0, 10, 35, 85, 170, 300, ?

    Ich weiss es nicht - ich wusel mich gerade in den Code, der diese Reihe erzeugt. Wenn ich's gefunden habe, kann endgueltig verifiziert werden. 😃



  • 495 :p

    0  10  35  85  170 300 495
    +10 +25 +50 +85 +130 +195
       +15 +25 +30 +55 +65
         +10 +5  +15 +10
           -5 +10 -5
    

    Vermutlich falsch, aber von der Logik her nicht unmöglich 😉





  • árn[y]ék schrieb:

    495 :p

    0  10  35  85  170 300 495
    +10 +25 +50 +85 +130 +195
       +15 +25 +30 +55 +65
         +10 +5  +15 +10
           -5 +10 -5
    

    Vermutlich falsch, aber von der Logik her nicht unmöglich 😉

    ich komm auf 505 😉

    ebenfalls vermutlich falsch



  • blöder zeitvertreib, jetzt bin ich zu spät zum lunch..



  • zwutz schrieb:

    árn[y]ék schrieb:

    495 :p

    0  10  35  85  170 300 495
    +10 +25 +50 +85 +130 +195
       +15 +25 +30 +55 +65
         +10 +5  +15 +10
           -5 +10 -5
    

    Vermutlich falsch, aber von der Logik her nicht unmöglich 😉

    ich komm auf 505 😉

    ebenfalls vermutlich falsch

    Jep, aber árn[y]ék liegt naeher dran: Das naechste waere 485. :p
    Leider habe ich den ver*%& Algo immer noch nicht gefunden - 128kiloByte Programmcode koennen ganz schoen unuebersichtlich sein. 🙄



  • hm... vll täusch ich mich ja

    0   10    35    85    170    300    485
     +10   +25   +50   +85   +130   +185
        +15   +25   +35   +45    +55
           +10   +10   +10   +10
    

    árn[y]ék hat richtig angefangen, allerdings hat er im dritten Schritt für 130-85 55 als Ergebnis, richtig ist aber 45



  • Wenn man sukzessive Differenzen bildet fuehrt das letztendlich zum selben Ergebnis wie eine Polynom-Interpolation. Hier braucht man anscheinend 3 Iterationen um auf konstant +10 zu kommen. Das heisst, ein Polynom 3. Grades genuegt um die y-Werte 0, 10, 35, 85, 170, 300, 485 zu interpolieren, mit den x-Werten 0,1,2,3,4,5,6.

    In dem Fall waere es zum Beispiel 53x3+52x2+356x\frac53 x^3 + \frac52 x^2 + \frac{35}{6} x. Das Prinzip funktioniert aber allgemein; damit kann man solche Folgen extrapolieren ohne das "beste" interpolierende Polynom explizit hinschreiben zu muessen.



  • Christoph schrieb:

    Wenn man sukzessive Differenzen bildet fuehrt das letztendlich zum selben Ergebnis wie eine Polynom-Interpolation. Hier braucht man anscheinend 3 Iterationen um auf konstant +10 zu kommen. Das heisst, ein Polynom 3. Grades genuegt um die y-Werte 0, 10, 35, 85, 170, 300, 485 zu interpolieren, mit den x-Werten 0,1,2,3,4,5,6.

    In dem Fall waere es zum Beispiel 53x3+52x2+356x\frac53 x^3 + \frac52 x^2 + \frac{35}{6} x. Das Prinzip funktioniert aber allgemein; damit kann man solche Folgen extrapolieren ohne das "beste" interpolierende Polynom explizit hinschreiben zu muessen.

    ich musste deinen Beitrag zwar ungefähr 5mal durchlesen, aber ich glaub, ich habs verstanden ^^

    Danke für die Erklärung... kannst du mir auch noch verraten, wie du auf die Formel gekommen bist?



  • Hm, klingt so weit sehr gut, und haut fuer die ersten Level offenbar auch hin.
    Ich habe aber noch ein paar hoehere Werte:
    145 (oder 144, wenn 0-basiert) muesste zB.14.069.736 (mehr verlaessliche Werte habe ich erstmal aber wirklich nicht :D)...
    Wie gesagt: Keine Ahnung, ob bei hoeheren Werten ploetzlich die Formel gewechselt wird oder was sonst fuer Spaesse - ich denke doch aber mal unwahrscheinlich. Zudem sollte ich vielleicht noch anmerken, dass der Algo hoechst wahrscheinlich nur mit ints rechnet. 😉

    Edit: Ha, SkillZ! 😃 Endlich habe ich das olle Gefrickel. 🕶

    In Java uebersetzt sieht es in etwa so aus:

    static int so_level2exp(int level)
    	{
    		if (level >=255) return (1000000000);
    		if (level <= 1) return (0);
    		int exp = 0;
    		for (int lv_cnt = 1; lv_cnt<level; lv_cnt++)
    		{
    			if (lv_cnt < 100)
    			{
    				exp+=(lv_cnt*lv_cnt+1)*
    					( (int)((((long)lv_cnt-1)*0x66666667)>>34) -
    							((lv_cnt-1)>>0x1f) +5 );
    			}
    			else
    			{
    				exp+=((lv_cnt*lv_cnt+1)<<4)-(lv_cnt*lv_cnt+1);
    			}
    		}
    		return (exp);
    	}
    

    Also doch eine Fallunterscheidung fuer >=100... Naja, fuer alle kleinere Werte tut's Christophs Formel aber. 👍


Anmelden zum Antworten