Упрощённая формула расчёта призов

This commit is contained in:
Alexander Yakovlev 2018-09-08 19:25:47 +07:00
parent 8627dc510c
commit c5673bc4fb
2 changed files with 31 additions and 171 deletions

View File

@ -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"));
});

View File

@ -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">