#javascript
#javascript
Вопрос:
У меня есть игры с названием Columns, в которых вы можете делать ставки на то, в каком из 10 вертикальных столбцов матрицы из 80 чисел соберется наибольшее количество из 20 выпавших чисел. Ничья не состоится. в случае розыгрыша столбцов выигрышными столбцами являются те, чьи номера были нарисованы первыми.
мне нужен алгоритм для вычисления того, какие столбцы выигрывают на основе нарисованных чисел
Пример
80 Matrix
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 Col10
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
First Extract number = [22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,21]
the winner is Col2
Second Extract number = [1,12,23,31,15,42,16,27,18,39,43,71,25,56,35,55,57,58,65,17]
The Winner is Col5
я использовал приведенный ниже код
number = [22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,21]
Matrix3 = [ {"Col":0,"selNum":0,"weight":0},
{"Col":1,"selNum":0,"weight":0},
{"Col":2,"selNum":0,"weight":0},
{"Col":3,"selNum":0,"weight":0},
{"Col":4,"selNum":0,"weight":0},
{"Col":5,"selNum":0,"weight":0},
{"Col":6,"selNum":0,"weight":0},
{"Col":7,"selNum":0,"weight":0},
{"Col":8,"selNum":0,"weight":0},
{"Col":9,"selNum":0,"weight":0}
];
for (i=0;i<20;i )
{
Matrix3[((number[i]).toString()).slice(-1)].selNum = Matrix3[((number[i]).toString()).slice(-1)].selNum 1;
Matrix3[((number[i]).toString()).slice(-1)].weight = Matrix3[((number[i]).toString()).slice(-1)].weight i;
}
console.log(Matrix3);
Теперь из Matrix3 мне нужно проверить :
-
если в selNum нет дубликатов, верните столбец с максимальным значением
-
если есть дубликаты с одинаковым максимальным значением, верните столбец из дубликата с меньшим весом
Комментарии:
1. Вы должны добавить к своему вопросу то, что вы пробовали до сих пор.
2. Добавлен по моему запросу код, который я пытаюсь
Ответ №1:
Это решает проблему, отслеживая победителя по мере того, как записи столбца подсчитываются по порядку (подробности см. в комментариях к коду):
const nums = [22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,21];
const cols = nums.map( (num) => [num % 10]); // takes the last digit
let counts = {}, max = 0, winner = 0;
for (let col of cols){
counts[col] = counts[col] ? counts[col] 1 : 1; // adds 1 to the count for this column
if(counts[col] > max){ // we have found a new maximum
max = counts[col];
winner = col > 0 ? col : 10; // updates winner (uses 10 if last digit is 0)
}
}
console.log(winner);
Комментарии:
1. Спасибо, это было именно то, что мне было нужно
Ответ №2:
Если ваша матрица имеет структуру чисел, подобную 1, 2, 3, 4, ...
, вы можете использовать оператор остатка, чтобы узнать, в каком столбце представлено значение. Смотрите код ниже. Надеюсь, это поможет.
const COLUMNS_AMOUNT = 10
const getWinnerCol = (numbers) => {
const columnsHits = new Array(COLUMNS_AMOUNT).fill(0)
for (const number of numbers) {
const columnHit = (number % COLUMNS_AMOUNT) || COLUMNS_AMOUNT
columnsHits[columnHit - 1] = 1
}
console.log('columnsHits', columnsHits)
return columnsHits.indexOf(Math.max(...columnsHits))
}
const firstNumbers = [22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,21],
secondNumbers = [1,12,23,31,15,42,16,27,18,39,43,71,25,56,35,55,57,58,65,17]
console.log('Winner column index:', getWinnerCol(firstNumbers))
console.log('Winner column index:', getWinnerCol(secondNumbers))
Комментарии:
1. извините, но для первых чисел я использую 2
2. извините, но для первых чисел я использую 2, но я беру 0, потому что они дублируются. в случае розыгрыша столбцов выигрышными столбцами являются те, чьи номера были нарисованы первыми.
3. @MarcoRossi Это потому, что каждое число в
firstNumbers
появляется в каждом столбце два раза.getWinnerCol
функция просто возвращает первый столбец в качестве победителя.4. вы правы, первый столбец, в котором выбраны два числа, — это col2. решение работает, только если нет дубликатов