forked from urfu-2016/qa-task-03
-
Notifications
You must be signed in to change notification settings - Fork 0
/
getPokerHand.js
69 lines (60 loc) · 2.39 KB
/
getPokerHand.js
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
/**
* Определение комбинации в броске
*
* @param {Array} dice пять костей, для которых нужно определить комбинацию
* @returns {String} название комбинации
*/
function getPokerHand(dice) {
if (arguments.length !== 1) {
throw new Error("Функция getPokerHand принимает ровно один элемент")
}
if (!Array.isArray(dice)) {
throw new Error("Аргумент getPokerHand должен быть массивом")
}
if (dice.length !== 5) {
throw new Error("Аргумент getPokerHand должен быть массивом ровно из пяти элементов")
}
let pointCounts = getPointCountsList(dice);
pointCounts.sort((a, b) => b - a);
return getCombination(pointCounts);
}
/**
* Получения массива для каждого очка
*
* @param {Array} dice пять костей, для которых нужно определить комбинацию
* @returns {Array} массив количества очков, где индекс элемента соотвествует очку, а значение - сколько встречается
*/
function getPointCountsList(dice) {
let pointCounts = [0, 0, 0, 0, 0, 0];
dice.forEach((point) => {
if (!Number.isInteger(point)) {
throw new Error("Элементы массива должны быть целыми числами")
}
if (point < 1 || point > 6) {
throw new Error("Элементы массива должны содержать числа от 1 до 6")
}
pointCounts[point - 1]++;
});
return pointCounts;
}
/**
* Получение названия комбинации
*
* @param {Array} pointCounts массив количества очков
* @returns {String} название комбинации
*/
function getCombination(pointCounts) {
switch (pointCounts[0]) {
case 5:
return "Покер";
case 4:
return "Каре";
case 3:
return pointCounts[1] === 2 ? "Фулл хаус" : "Тройка";
case 2:
return pointCounts[1] === 2 ? "Две пары" : "Пара";
case 1:
return "Наивысшее очко"
}
}
module.exports = getPokerHand;