Javascript извлекает победителя из вертикальных столбцов

#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. решение работает, только если нет дубликатов