JavaScript (ES6), 88 Byte
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]]
Probieren Sie es online aus!
oder Testen Sie alle möglichen Rollen!
Gibt eine Ganzzahl gemäß der folgenden Zuordnung aus:
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
Wie?
Methode
Die Ausgabe wird berechnet, indem ein bitweises ODER zwischen:
- eine Bitmaske basierend auf : die Anzahl der 4erF.
- eine Bitmaske basierend auf : die maximale Anzahl von Vorkommen derselben WürfelM.
Ausnahmen:
- Wenn : Wir verwenden eine spezielle Bitmaske wenn die beiden anderen Würfel Einsen sind, oder eine Standard-Bitmaske wenn dies nicht der Fall ist .F.= 44 b4 a
- Wenn : Wir verwenden eine spezielle Bitmaske wenn wir eine Sechs-von-einer-Art von Einsen haben, oder eine andere Standard-Bitmaske .M.= 66 b6 a
Tabelle
Gültige Kombinationen von und sind in der folgenden Tabelle fett und blau hervorgehoben.F.M.
M123456a6bFOR6002198140060021981411711219915246442113121435755211313154a814882998144b101410103111101452622231110146464421131214
Alle anderen Kombinationen (in grau) können unmöglich vorkommen. Wenn wir zum Beispiel drei 4er haben, müssen wir . Aber weil es in einem solchen Wurf nur noch 3 andere Würfel gibt, haben wir auch . Es gibt also nur einen möglichen Wert von für .M≥3M≤3MF=3
Beispiel
Wenn wir eine Straße haben, erscheint jeder Würfel genau einmal. Wir haben also und . Bei Verwendung der in der obigen Tabelle beschriebenen Bitmasken führt dies zu:M=1F=1
6 OR 1=7
Es gibt weitere in der Tabelle, aber es ist ungültig. Daher wird eine Gerade durch eindeutig identifiziert .77
Kommentiert
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)