more sophistication for invalid distriubtions

This commit is contained in:
David Westgate 2025-02-23 23:20:36 -08:00
parent 1a027e1feb
commit dd75f58519

View File

@ -75,28 +75,33 @@ const ChipDistributionSummary = ({
[totalChipsCount, playerCount] [totalChipsCount, playerCount]
); );
function denominate(min: number, max: number, count: number = 4): number[] { const redenominate = (
if (max - min + 1 < count) { invalidDenomination: validDenomination[],
throw new Error( shuffleIndex: number
"Range is too small to generate the required number of unique values." ): validDenomination[] => {
); console.log("Old Denominations ", invalidDenomination);
const newDenomination: validDenomination[] = [];
for (let i = invalidDenomination.length - 1; i >= 0; i--) {
if (i > shuffleIndex) {
newDenomination.push(invalidDenomination[i]);
} else if (i == shuffleIndex) {
newDenomination.push(invalidDenomination[i]);
} else {
const nextLowestDenominationIndex = Math.max(
validDenominations.indexOf(invalidDenomination[i]) - 1,
0
);
newDenomination.push(validDenominations[nextLowestDenominationIndex]);
}
} }
newDenomination.reverse();
const numbers = new Set<number>(); console.log("New Denominations ", newDenomination);
return newDenomination;
while (numbers.size < count) { };
const randomNum = Math.floor(Math.random() * (max - min + 1)) + min;
numbers.add(randomNum);
}
// const denominations
return Array.from(numbers);
}
useEffect(() => { useEffect(() => {
// const testDistribution: Map<ColorValue, number> = new Map(); // const testDistribution: Map<ColorValue, number> = new Map();
const testDenomination: validDenomination[] = []; let testDenomination: validDenomination[] = [];
const numColors = chipMap.size; const numColors = chipMap.size;
const testDistribution: number[] = []; const testDistribution: number[] = [];
@ -118,44 +123,66 @@ const ChipDistributionSummary = ({
} }
testDenomination.reverse(); testDenomination.reverse();
console.log("BUY IN: ", buyInAmount); // console.log("BUY IN: ", buyInAmount);
console.log("PLAYER COUNT ", playerCount); // console.log("PLAYER COUNT ", playerCount);
// DISTRIBUTE // DISTRIBUTE
let remainingValue = buyInAmount; let remainingValue = buyInAmount;
const remainingChips = [...maxPossibleDistribution]; const remainingChips = [...maxPossibleDistribution];
console.log("\ntest Denomination", testDenomination); // console.log("\ntest Denomination", testDenomination);
console.log("test distribution ", testDistribution); // console.log("test distribution ", testDistribution);
console.log("remainingChips", remainingChips); // console.log("remainingChips", remainingChips);
console.log("remaining value ", remainingValue); // console.log("remaining value ", remainingValue);
//First distribute one of each chip to each player //First distribute one of each chip to each player
for (let i = numColors - 1; i >= 0; i--) { // for (let i = numColors - 1; i >= 0; i--) {
testDistribution[i] = testDistribution[i] + 1; // testDistribution[i] = testDistribution[i] + 1;
remainingChips[i] = remainingChips[i] - 1; // remainingChips[i] = remainingChips[i] - 1;
remainingValue = remainingValue - testDenomination[i]; // remainingValue = remainingValue - testDenomination[i];
} // }
console.log("\ntest Denomination", testDenomination); // console.log("\ntest Denomination", testDenomination);
console.log("test distribution ", testDistribution); // console.log("test distribution ", testDistribution);
console.log("remainingChips", remainingChips); // console.log("remainingChips", remainingChips);
console.log("remaining value ", remainingValue); // console.log("remaining value ", remainingValue);
//Then, greedy approach to distribute remaining chips //Then, greedy approach to distribute remaining chips
// while (remainingValue > 0) { let fail = true;
// for (let i = numColors - 1; i >= 0; i--) { let failCount = 0;
// if (remainingChips[i] > 0 && remainingValue > testDenomination[i]) { while (fail && failCount < 10) {
// testDistribution[i] = testDistribution[i] + 1; let stop = false;
// remainingChips[i] = remainingChips[i] - 1; while (remainingValue > 0 && !stop) {
// remainingValue = remainingValue - testDenomination[i]; let distributed = false;
// } for (let i = numColors - 1; i >= 0; i--) {
// remainingValue = 0; if (remainingChips[i] > 0 && remainingValue > testDenomination[i]) {
// } // console.log("distributing ", testDenomination[i]);
// } testDistribution[i] = testDistribution[i] + 1;
console.log("\ntest Denomination", testDenomination); remainingChips[i] = remainingChips[i] - 1;
console.log("test distribution ", testDistribution); remainingValue = remainingValue - testDenomination[i];
console.log("remainingChips", remainingChips); distributed = true;
console.log("remaining value ", remainingValue); }
}
if (distributed == false) {
stop = true;
}
}
if (remainingValue !== 0) {
console.log(`\n Failed: ${remainingValue} !== 0 Redenominating `);
const redenominateIndex = numColors - (failCount % numColors);
console.log("Redenominating index ", redenominateIndex);
testDenomination = redenominate(testDenomination, redenominateIndex);
failCount += 1;
fail = true;
} else {
fail = false;
}
}
// console.log("\ntest Denomination", testDenomination);
// console.log("test distribution ", testDistribution);
// console.log("remainingChips", remainingChips);
// console.log("remaining value ", remainingValue);
setDenominations(testDenomination); setDenominations(testDenomination);
setDistributions(testDistribution); setDistributions(testDistribution);
}, [chipMap, maxDenomination, buyInAmount, playerCount]); }, [chipMap, maxDenomination, buyInAmount, playerCount]);
@ -165,12 +192,17 @@ const ChipDistributionSummary = ({
<Text style={styles.title}>Chip Distribution Summary:</Text> <Text style={styles.title}>Chip Distribution Summary:</Text>
{colors.map((color, index) => ( {colors.map((color, index) => (
<View style={styles.chipContainer} key={index}> <View style={styles.chipContainer} key={index}>
<Text style={styles.chipText}> <Text style={{ ...styles.chipText, color: color }}>
{String(color).charAt(0).toUpperCase() + String(color).slice(1)}{" "} {String(color).charAt(0).toUpperCase() + String(color).slice(1)}{" "}
chips: {distributions[index]} ( ${denominations[index]} each) chips: {distributions[index]} ( ${denominations[index]} each)
</Text> </Text>
</View> </View>
))} ))}
<Text style={styles.chipText}>
Total Value:{" "}
{distributions?.length > 0 &&
distributions.reduce((p, c, i) => p + c * denominations[i])}
</Text>
</View> </View>
); );
}; };
@ -189,10 +221,12 @@ const styles = StyleSheet.create({
}, },
chipContainer: { chipContainer: {
marginTop: 10, marginTop: 10,
backgroundColor: "#888",
}, },
chipText: { chipText: {
fontSize: 16, fontSize: 20,
marginVertical: 2, marginVertical: 2,
fontWeight: "bold",
}, },
noDataText: { noDataText: {
fontSize: 16, fontSize: 16,