feat: Implement "How many rats fit in a cage"

This commit is contained in:
moanos [he/him] 2025-04-13 22:17:57 +02:00
parent 16d7c8f3dc
commit 5142bb66ca

View File

@ -55,7 +55,7 @@ function bindLocaleSwitcher(initialValue) {
i18next
.changeLanguage(e.target.value)
.then(translatePageElements)
.then(update);
.then(updateCageCheck);
};
}
@ -63,7 +63,7 @@ function bindLocaleSwitcher(initialValue) {
await initI18next();
translatePageElements();
bindLocaleSwitcher(i18next.resolvedLanguage);
update();
updateCageCheck();
})();
//////////
@ -148,7 +148,20 @@ class Validator {
if (numOfRats < 3 || numOfRats > 15) {
throw new Error("This formula works only from 3 to 15 rats");
}
return MINIMUM_AREA_THREE_RATS + (numOfRats - 3) * AREA_PER_ADDITIONAL_RAT;
return MINIMUM_AREA_THREE_RATS + (numOfRats - 3.0) * AREA_PER_ADDITIONAL_RAT;
}
allowedNumberOfRats(overallArea) {
/*
Calculates the number of rats that are allowed for a certain overall area.
*/
let result = 3.0 + (overallArea-MINIMUM_AREA_THREE_RATS) / AREA_PER_ADDITIONAL_RAT;
console.log(`Area left: ${overallArea-MINIMUM_AREA_THREE_RATS}`);
console.log(`Result: ${result}`);
if (result < 3) {
throw new Error("Cages must be for three rats or more");
}
return result;
}
failCageNumberIndependent(dimensions, numFullFloors) {
@ -181,6 +194,11 @@ class Validator {
return failedCriteria;
}
getOverallArea(dimensions, numFullFloors) {
const baseArea = dimensions.depth * dimensions.width;
return baseArea * numFullFloors
}
cageCheck(dimensions, numRats, numFullFloors) {
/*
Function that checks a cage based on overall criteria and the number of rats.
@ -191,9 +209,9 @@ class Validator {
failedCriteria[FAILED_NUM_RATS] = this.FAIL_CRITERIA[FAILED_NUM_RATS];
}
const areaNeeded = this.overallAreaNeeded(numRats);
const baseArea = dimensions.depth * dimensions.width;
if (baseArea * numFullFloors < areaNeeded) {
const overallArea = this.getOverallArea(dimensions, numFullFloors);
const overallAreaNeeded = this.overallAreaNeeded(numRats);
if (overallArea < overallAreaNeeded) {
failedCriteria[FAILED_OVERALL_AREA] = this.FAIL_CRITERIA[FAILED_OVERALL_AREA];
}
@ -225,13 +243,30 @@ class Dimensions {
// DOCUMENT INTERACTION //
//////////////////////////
const inputWidth = document.getElementById("width");
inputWidth.onchange = updateViaManualMeasurements;
const inputDepth = document.getElementById("depth");
inputDepth.onchange = updateViaManualMeasurements;
const inputHeight = document.getElementById("height");
inputHeight.onchange = updateViaManualMeasurements;
const numRatsCalculatorInputWidth = document.getElementById("num-rats-width");
numRatsCalculatorInputWidth.onchange = updateNumRatsCalculator;
const numRatsCalculatorInputDepth = document.getElementById("num-rats-depth");
numRatsCalculatorInputDepth.onchange = updateNumRatsCalculator;
const numRatsCalculatorInputHeight = document.getElementById("num-rats-height");
numRatsCalculatorInputHeight.onchange = updateNumRatsCalculator;
let numRatsNumFullFloors = document.getElementById("num-rats-numFullFloors");
numRatsNumFullFloors.oninput = function () {
updateNumRatsCalculator();
}
const inputWidth = document.getElementById("width");
inputWidth.onchange = updateCageCheck;
const inputDepth = document.getElementById("depth");
inputDepth.onchange = updateCageCheck;
const inputHeight = document.getElementById("height");
inputHeight.onchange = updateCageCheck;
let fullFloorNum = document.getElementById("numFullFloors");
fullFloorNum.oninput = function () {
updateCageCheck();
}
let labelNumRats = document.getElementById("labelNumRats");
@ -239,14 +274,9 @@ let labelNumRats = document.getElementById("labelNumRats");
let ratSlider = document.getElementById("numRats");
ratSlider.oninput = function () {
update();
updateCageCheck();
}
// Full floor functions
let fullFloorNum = document.getElementById("numFullFloors");
fullFloorNum.oninput = function () {
update();
}
function getResultFromChecks(checks) {
if (Object.keys(checks).length > 0) {
@ -265,11 +295,7 @@ function getResultFromChecks(checks) {
}
function updateViaManualMeasurements() {
update();
}
function update() {
function updateCageCheck() {
labelNumRats.innerHTML = i18next.t("cage-for-x-rats", {"num_rats": ratSlider.value});
const width = inputWidth.value
@ -285,3 +311,38 @@ function update() {
resultsDiv.innerHTML = "";
resultsDiv.appendChild(result);
}
function updateNumRatsCalculator() {
const width = numRatsCalculatorInputWidth.value
const depth = numRatsCalculatorInputDepth.value
const height = numRatsCalculatorInputHeight.value
const dimensions = new Dimensions(width / 100, depth / 100, height / 100);
const validator = new Validator();
const failed_checks = validator.failCageNumberIndependent(dimensions, fullFloorNum.value);
let overallArea = validator.getOverallArea(dimensions, numRatsNumFullFloors.value);
let allowedNumRats;
try {
allowedNumRats = validator.allowedNumberOfRats(overallArea);
} catch (e) {
console.log(e);
failed_checks[FAILED_BASE_AREA] = validator.FAIL_CRITERIA[FAILED_OVERALL_AREA];
allowedNumRats = 0;
}
console.log(`Allowed number: ${allowedNumRats}`);
let resultsDiv = document.getElementById("num-rats-resultsDiv");
const result = getResultFromChecks(failed_checks);
resultsDiv.innerHTML = "";
const p = document.createElement('p');
p.textContent = i18next.t("cage-for-x-rats", {"num_rats": allowedNumRats});
resultsDiv.appendChild(p);
resultsDiv.appendChild(result);
}
const validator = new Validator();