За последние 24 часа нас посетили 17732 программиста и 1612 роботов. Сейчас ищут 1479 программистов ...

Математическая задачка

Тема в разделе "Прочие вопросы по PHP", создана пользователем ZeiN, 5 фев 2013.

  1. ZeiN

    ZeiN Активный пользователь

    С нами с:
    12 окт 2011
    Сообщения:
    12
    Симпатии:
    0
    Здравствуйте, господа программисты.
    Передо мной встала довольно банальная задача - подсчет рейтинга пользователей на сайте.
    Систему рейтинга я решил построить на основе баллов и уровней. 1й уровень 0-100 баллов, 2й уровень 100-225 баллов, 3й 225-381,25 баллов и тд. То есть каждый следующий уровень это 1.25 * разницу предыдущего.
    Казалось бы ничего сложного. Но я так и не придумал как зная количество баллов определить текущий уровень...
    То есть как из 390 баллов посчитать что это 4-й уровень?
    Составил нехутрую формулу для расчета баллов каждого уровня: 381,25 = 100*(1,25^0 + 1,25^1 + 1,25^2) , но никак не могу понять как получать границы уровня и как получать уровень, зная количество баллов.
    Буду благодарен за любые подсказки.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    сравнить в цикле с большего к меньшему =)
     
  3. ZeiN

    ZeiN Активный пользователь

    С нами с:
    12 окт 2011
    Сообщения:
    12
    Симпатии:
    0
    Оставлю тут для будущих поколений :)
    Первый уровень - 100 очков. Коэфициент 1.25
    Код (Text):
    1. public function getLevel(){
    2.         $level = log( 1 - (  ($this->points * (1-1.25)) / 100 ) , 1.25);
    3.         return floor($level);
    4.  
    5.     }
    6.  
    7.     public function getLevelEdges($level){
    8.         if($level != 0){
    9.             $edges['min'] = ( 100 * ( 1 - pow( 1.25, $level ) ) )/ (1-1.25);
    10.             $edges['max'] = ( 100 * ( 1 - pow( 1.25, $level+1 ) ) )/ (1-1.25);
    11.         } else {
    12.             $edges['min'] = 0;
    13.             $edges['max'] = 100;
    14.         }
    15.         $edges['delta'] = $edges['max'] - $edges['min'];
    16.         return $edges;
    17.     }
    18.     public function getLevelProgress(){
    19.         $points = $this->points;
    20.         $level = $this->getLevel();
    21.         $edges = $this->getLevelEdges($level);
    22.         $position = ( $points - $edges['min'] ) / $edges['delta'];
    23.         return floor($position * 100);
    24.     }