JavaScript (ES6), 88 байт
a=>a.map(o=n=>[x=o[n]=-~o[n],6,,,21,9,8^o[1]][a=x<a?a:x])[5]|[,1,4,5,o[1]&2|8,2,4][o[4]]
Спробуйте в Інтернеті!
або Перевірте всі можливі рулони!
Виводить ціле число відповідно до наступного відображення:
Rank | Output Rank | Output
------+-------- ------+--------
0 | 31 7 | 7
1 | 12 8 | 5
2 | 14 9 | 21
3 | 8 10 | 4
4 | 11 11 | 1
5 | 9 12 | 0
6 | 29
Як?
Метод
Вихід обчислюється шляхом виконання побітових АБО між:
- бітмаска на основі : кількість 4-хF
- бітмаска на основі : максимальна кількість зустрічань одних і тих же кістокM
Винятки:
- Коли : ми використовуємо спеціальну біт-маску коли дві інші кістки дорівнює 1, або біт-маску за замовчуванням .F=44b4a
- Коли : ми використовуємо спеціальну біт-маску коли у нас є шість-в-роді 1, або в іншому випадку бітова маска .M=66b6a
Таблиця
Дійсні комбінації і виділені жирним та синім кольором у наступній таблиці.FM
M123456a6bFOR6002198140060021981411711219915246442113121435755211313154a814882998144b101410103111101452622231110146464421131214
Усі інші комбінації (сірого кольору) неможливо. Наприклад, якщо у нас є три 4, ми повинні мати . Але оскільки в такому рулоні є лише три інших кістки, ми також маємо . Отже, існує лише одне можливе значення для .M≥3M≤3MF=3
Приклад
Якщо у нас пряма, кожна кістка з’являється рівно один раз. Отже маємо і . Використовуючи біт-маски, описані у вищевказаній таблиці, це призводить до:M=1F=1
6 OR 1=7
У таблиці є ще , але вона недійсна. Тому пряма однозначно ідентифікується .77
Прокоментував
a => // a[] = input array, reused as an integer to keep track of the
a.map( // maximum number of occurrences of the same dice (M)
o = // o = object used to count the number of occurrences of each dice
n => // for each dice n in a[]:
[ // this is the lookup array for M-bitmasks:
x = // x = o[n] = number of occurrences of the current dice
o[n] = -~o[n], // increment o[n] (we can't have M = 0, so this slot is not used)
6, // M = 1 -> bitmask = 6
, // M = 2 -> bitmask = 0
, // M = 3 -> bitmask = 0
21, // M = 4 -> bitmask = 21
9, // M = 5 -> bitmask = 9
8 ^ o[1] // M = 6 -> bitmask = 14 for six 1's, or 8 otherwise
][a = // take the entry corresponding to M (stored in a)
x < a ? a : x] // update a to max(a, x)
)[5] // end of map(); keep the last value
| // do a bitwise OR with the second bitmask
[ // this is the lookup array for F-bitmasks:
, // F = 0 -> bitmask = 0
1, // F = 1 -> bitmask = 1
4, // F = 2 -> bitmask = 4
5, // F = 3 -> bitmask = 5
o[1] & 2 | 8, // F = 4 -> bitmask = 10 if we also have two 1's, 8 otherwise
2, // F = 5 -> bitmask = 2
4 // F = 6 -> bitmask = 4
][o[4]] // take the entry corresponding to F (the number of 4's)