Pyth, 73 byte
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc
Questo è piuttosto terribile. Analizzare le carte, ordinare i valori, ... Tutto richiede così tanti caratteri. Ma l'approccio è interessante.
Provalo online: Dimostrazione o Test Suite
Spiegazione:
Genero tutte le 52 carte, rimuovo le quattro carte dell'input, generi un punteggio per ogni carta (punteggio della mano) e stampo la carta con il punteggio massimo.
Il punteggio è un po 'strano. Se metto a confronto il punteggio di due mani completamente diverse, potrebbe scegliere il vincitore sbagliato. Ad esempio una scala avrebbe battuto 4 assi. Ma funziona, se le prime 4 carte sono uguali in entrambe le mani. E il mio punteggio calcolato non è in realtà un valore, ma un elenco di valori:
- G: Per prima cosa raggruppo le 5 carte per valore e prendo le lunghezze:
5h 5d 6c 5s Jd
->
[3, 1, 1]
- F: Quindi aggiungo 4 meno il numero di diverse suite a questo elenco.
Flush
->
3
viene aggiunto, not flush
->
2/1/0
viene aggiunto.
- S: Aggiungi un altro numero.
0
se non è una scala, 4
se è la scala A2345
o 5
se è una scala più alta.
Questi elenchi di 4-7 numeri vengono ordinati in ordine decrescente e viene selezionato l'elenco con il valore massimo.
Perché funziona? Qui puoi vedere le possibili configurazioni per tutti i tipi. La lettera accanto ai numeri ti dice con quale regola è stato generato questo numero.
- Scala reale:
[5S, 3F, 1G, 1G, 1G, 1G, 1G]
o[4S, 3F, 1G, 1G, 1G, 1G, 1G]
- Quattro nel suo genere:
[4G, 1G, 0F, 0S]
- Full:
[3G, 2G, 1F, 0S]
o[3G, 2G, 0F, 0S]
- Flush:
[3F, 1G, 1G, 1G, 1G, 1G, 0S]
- Scala:
[5S, 2F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1G, 1G, 1G, 1G, 1G, 0F]
, [4S, 2F, 1G, 1G, 1G, 1G, 1G]
, [4S, 1F, 1G, 1G, 1G, 1G, 1G]
,[4S, 1G, 1G, 1G, 1G, 1G, 0F]
- Tris:
[3G, 1G, 1G, 1F, 0S]
,[3G, 1G, 1G, 0F, 0S]
- Doppia coppia:
[2G, 2G, 2F, 1G, 0S]
, [2G, 2G, 1F, 1G, 0S]
,[2G, 2G, 1G, 0F, 0S]
- Una coppia:
[2G, 2F, 1G, 1G, 1G, 0S]
, [2G, 1G, 1G, 1G, 1F, 0S]
,[2G, 1G, 1G, 1G, 0F, 0S]
- Alta carta:
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
, [1F, 1G, 1G, 1G, 1G, 1G, 0S]
,[1G, 1G, 1G, 1G, 1G, 0S, 0F]
Pyth confronta gli elenchi in termini di elementi. Quindi è ovvio che una scala reale sconfigge sempre Four of a kind. La maggior parte delle regole tipiche del poker sono ovvie con queste liste. Alcuni sembrano contrastanti.
- Una scala vincerà contro il quattro di un tipo o un full: nessun problema. Se hai la possibilità di ottenere Four of a kind / Full con la carta river, allora non puoi raggiungere una scala allo stesso tempo (dato che hai già 2 o 3 suite diverse in mano).
- Una scala vincerà contro una scala. Se riesci a raggiungere una scala e una scala con la carta river, allora puoi anche raggiungere una scala reale. E la scala reale ha un punteggio migliore sia della scala che della scala.
- Una coppia
[2G, 2F, 1G, 1G, 1G, 0S]
vincerà contro alcune mani di due coppie. Inoltre nessun problema. Se ottieni una doppia coppia con la carta river, allora hai avuto almeno una coppia prima del river. Ma questo significa che puoi migliorare a tre nel suo genere, il che è meglio. Quindi una doppia coppia non sarà mai la risposta.
- La carta alta
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
vincerà contro alcune mani di una coppia. Se questo è il miglior punteggio che puoi raggiungere, prima del river avrai 3 carte di una suite e una di un'altra suite. Ma poi puoi scegliere la carta con una di queste due suite e con un valore che appare già, e finirai con il punteggio [2F, 2G, ...]
, che è anche migliore.
Quindi questo sceglie il tipo corretto di soluzione. Ma come posso ottenere la migliore coppia (su 4 possibilità), come posso scegliere la scala migliore, ...? Perché due diverse soluzioni a una coppia possono avere lo stesso punteggio.
Questo è facile. Pyth garantisce un ordinamento stabile (quando si prende il massimo). Quindi ho semplicemente generato le carte nell'ordine 2h 2s 2c 2d 3h 3s ... Ad
. Quindi la carta con il valore più alto sarà automaticamente il massimo.
Dettagli di implementazione
=Zc
divide la stringa di input e memorizza l'elenco delle carte Z
.
=T+`M}2Tc4"JQKA"
genera l'elenco dei ranghi ['2', ..., '10', 'J', 'Q', 'K', 'A']
e li memorizza in T
. -sM*T..."hscd"Z
genera ogni combinazione di rango con le suite e rimuove le carte di Z
.
o...
ordina queste carte rimanenti per: lM.gPkJ
la lunghezza dei gruppi dei ranghi, +-4l{eMJlM
aggiunge 4 - lunghezza (suite), +*-5l@\AN}SPMJ+NZSM.:+\AT5
aggiunge 0/4/5 a seconda della suite (genera ogni sottostringa di lunghezza 5 di "A" + T, controlla se la mano uno di questi (richiede l'ordinamento della mano e l'ordinamento di tutti i sottoinsiemi), moltiplicato per 5 - numero di "A" nella carta), _S
ordina l'elenco in ordine decrescente.
e
scegli il massimo e stampa.