Упрощённая формула расчёта призов
This commit is contained in:
parent
8627dc510c
commit
c5673bc4fb
188
js/calculator.js
188
js/calculator.js
|
@ -6,148 +6,64 @@
|
|||
* @return integer;
|
||||
*/
|
||||
function roundup(value){
|
||||
var retval = Math.round( value / 100) * 100;
|
||||
if (retval <= 0) { // если игр МНОГО, а в фонде нет денег
|
||||
if (value <= 0) {
|
||||
return 0;
|
||||
}
|
||||
var retval = Math.round( value / 100) * 100;
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Функция расчёта приза.
|
||||
*
|
||||
* @param {float} value
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
function prizefn(value) {
|
||||
return 1.0 * value * value - 2.0 * value + 1.0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Вычисление призов для номинации.
|
||||
*
|
||||
* @param {integer} maxPrize максимальный приз номинации
|
||||
* @param {integer} minPrize минимальный приз номинации
|
||||
* @param {integer} count количество игр в номинации
|
||||
* @param {integer} prizeCount количество призовых мест
|
||||
* @param {integer} prizes количество призов в номинации
|
||||
* @param {integer} fund призовой фонд номинации
|
||||
* @param {string} table ID таблицы для вывода
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function recalNom(maxPrize, minPrize, count, prizeCount, fund, table) {
|
||||
function recalNom(prizes, fund, table) {
|
||||
jQuery(table).empty();
|
||||
if (prizeCount === 1) {
|
||||
jQuery(table).append("<tr><th scope='row'>"+1+"</th><td>"+fund+" руб.</td></tr>");
|
||||
return;
|
||||
var prizeTable = {}; // таблица призов в %
|
||||
if (prizes === 3) {
|
||||
prizeTable = {
|
||||
1: 40,
|
||||
2: 35,
|
||||
3: 25
|
||||
};
|
||||
} else if (prizes == 2) {
|
||||
prizeTable = {
|
||||
1: 60,
|
||||
2: 40
|
||||
};
|
||||
}
|
||||
for (var i = 1; i <= prizeCount; i++) {
|
||||
if (fund === 0) { // а тут копилка и кончилась
|
||||
break;
|
||||
}
|
||||
var prize = roundup(maxPrize * prizefn(i/count) + minPrize);
|
||||
if (prize <= fund) {
|
||||
fund = fund - prize;
|
||||
} else {
|
||||
prize = fund;
|
||||
fund = 0;
|
||||
}
|
||||
for (var i = 1; i <= prizes; i++) {
|
||||
var prize = roundup(fund * (prizeTable[i] / 100));
|
||||
jQuery(table).append("<tr><th scope='row'>"+i+"</th><td>"+prize+" руб.</td></tr>");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Вычисление максимального приза в номинации.
|
||||
*
|
||||
* @param {integer} fund фонд конкурса
|
||||
* @param {integer} minPrize текущий минимальный приз
|
||||
* @param {integer} count текущее количество призовых мест
|
||||
* @param {integer} a коэффициент приза
|
||||
*
|
||||
* @return object максимальный приз, количество призовых, минимальный приз
|
||||
*/
|
||||
function calcMaxPrize(fund, minPrize, count, a) {
|
||||
if (count === 1) {
|
||||
return {
|
||||
prize: fund,
|
||||
count: count,
|
||||
minPrize: minPrize
|
||||
};
|
||||
}
|
||||
if (minPrize === 0) {
|
||||
return {
|
||||
prize: 0,
|
||||
count: count,
|
||||
minPrize: minPrize
|
||||
};
|
||||
}
|
||||
if (fund >= a * (minPrize * count)) {
|
||||
return {
|
||||
prize: roundup(a * (fund - (minPrize * count)) / count),
|
||||
count: count,
|
||||
minPrize: minPrize
|
||||
};
|
||||
} else { // много игр и мало денег
|
||||
if (count > 1) {
|
||||
return calcMaxPrize(fund, minPrize, count - 1, a);
|
||||
} else { // да за что ж вы так с авторами
|
||||
if (a > 1) {
|
||||
return calcMaxPrize(fund, minPrize, count - 1, a - 1);
|
||||
} else {
|
||||
return calcMaxPrize(fund, minPrize - 100, count, a);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Параметры: общий фонд, размеры номинаций
|
||||
function recalculate(fund, games, translations) {
|
||||
/**
|
||||
* Обновление калькулятора.
|
||||
* Вызывается при загрузке страницы или смене параметра.
|
||||
*
|
||||
* @param {integer} fund размер общего призового фонда
|
||||
*/
|
||||
function recalculate(fund) {
|
||||
// фонды номинаций
|
||||
var gameFund = roundup( fund * 0.74 );
|
||||
var translateFund = roundup( fund * 0.25 );
|
||||
if (translations === undefined) {
|
||||
return;
|
||||
}
|
||||
// если переводов нет, то фонд уходит играм
|
||||
if (translations === 0) {
|
||||
gameFund = roundup(fund * 0.99);
|
||||
translateFund = 0;
|
||||
}
|
||||
// если игр нет, то фонд уходит переводам
|
||||
// (но UI калькулятора этого не позволит)
|
||||
if (games === 0) {
|
||||
gameFund = 0;
|
||||
translateFund = roundup(fund * 0.99);
|
||||
}
|
||||
// кол-во призовых мест
|
||||
var prizeGames = Math.ceil(games * 0.2);
|
||||
var prizeTranslations = Math.ceil(translations * 0.3);
|
||||
if (prizeTranslations > translations) {
|
||||
prizeTranslations = translations;
|
||||
}
|
||||
if (prizeGames > games) {
|
||||
prizeGames = games;
|
||||
}
|
||||
// минимальный приз
|
||||
var minPrize = 1000;
|
||||
var a = 3;
|
||||
var maxPrizeGames = calcMaxPrize(gameFund, minPrize, prizeGames, a);
|
||||
var maxPrizeTranslations = calcMaxPrize(translateFund, minPrize, prizeTranslations, a);
|
||||
var prizeGames = 3; // 3 призовых места в основной номинации
|
||||
var prizeTranslations = 2; // 2 призовых места в переводах
|
||||
|
||||
recalNom(
|
||||
maxPrizeGames.prize,
|
||||
maxPrizeGames.minPrize,
|
||||
games,
|
||||
maxPrizeGames.count,
|
||||
prizeGames,
|
||||
gameFund,
|
||||
"#gameTable"
|
||||
);
|
||||
recalNom(
|
||||
maxPrizeTranslations.prize,
|
||||
maxPrizeTranslations.minPrize,
|
||||
translations,
|
||||
maxPrizeTranslations.count,
|
||||
prizeTranslations,
|
||||
translateFund,
|
||||
"#translateTable"
|
||||
);
|
||||
|
@ -161,53 +77,11 @@ jQuery(document).ready(function($){
|
|||
step: 1000,
|
||||
slide: function( event, ui) {
|
||||
jQuery("#fundValue").text(ui.value + " руб.");
|
||||
recalculate(
|
||||
ui.value,
|
||||
$("#gameRange").slider("value"),
|
||||
$("#translateRange").slider("value")
|
||||
);
|
||||
}
|
||||
});
|
||||
jQuery("#gameRange").slider({
|
||||
range: "min",
|
||||
value: 30,
|
||||
min: 1,
|
||||
max: 100,
|
||||
slide: function( event, ui) {
|
||||
jQuery("#gameValue").text(ui.value + " игр");
|
||||
recalculate(
|
||||
$("#fundRange").slider("value"),
|
||||
ui.value,
|
||||
$("#translateRange").slider("value")
|
||||
);
|
||||
}
|
||||
});
|
||||
jQuery("#translateRange").slider({
|
||||
range: "min",
|
||||
value: 5,
|
||||
min: 0,
|
||||
max: 50,
|
||||
slide: function( event, ui) {
|
||||
jQuery("#translateValue").text(ui.value + " игр");
|
||||
recalculate(
|
||||
$("#fundRange").slider("value"),
|
||||
$("#gameRange").slider("value"),
|
||||
ui.value
|
||||
);
|
||||
recalculate(ui.value);
|
||||
}
|
||||
});
|
||||
jQuery("#fundValue").text(
|
||||
$("#fundRange").slider("value") + " руб."
|
||||
);
|
||||
jQuery("#gameValue").text(
|
||||
$("#gameRange").slider("value") + " игр"
|
||||
);
|
||||
jQuery("#translateValue").text(
|
||||
$("#translateRange").slider("value") + " игр"
|
||||
);
|
||||
recalculate(
|
||||
$("#fundRange").slider("value"),
|
||||
$("#gameRange").slider("value"),
|
||||
$("#translateRange").slider("value")
|
||||
);
|
||||
recalculate($("#fundRange").slider("value"));
|
||||
});
|
||||
|
|
|
@ -42,20 +42,6 @@ $container = get_theme_mod( 'understrap_container_type' );
|
|||
</label>
|
||||
<div id="fundRange"></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="formControlRange">
|
||||
Размер основной номинации:
|
||||
<b><span id="gameValue"></span></b>
|
||||
</label>
|
||||
<div id="gameRange"></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="formControlRange">
|
||||
Размер номинации переводов:
|
||||
<b><span id="translateValue"></span></b>
|
||||
</label>
|
||||
<div id="translateRange"></div>
|
||||
</div>
|
||||
</form>
|
||||
<h3>Основная номинация</h3>
|
||||
<table class="table">
|
||||
|
|
Loading…
Reference in New Issue