Pyth, 73 bayt
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc
Bu oldukça korkunç. Kartları ayrıştırmak, değerleri sıralamak, ... Her şey çok fazla karakter alıyor. Ancak yaklaşım ilginç.
Çevrimiçi deneyin: Gösteri veya Test Paketi
Açıklama:
52 kartın tümünü üretiyorum, girişin dört kartını çıkartıyorum, her kart için bir puan üretiyorum (elin puanı) ve kartı maksimum puanla basıyorum.
Skor biraz garip. Tamamen farklı iki elin skorunu karşılaştırırsam, yanlış galibi seçebilir. Örneğin, bir düz 4 as atardı. Ancak, ilk 4 kart her iki elinde de aynıysa çalışır. Ve hesaplanan puanım aslında bir değer değil, bir değerler listesidir:
- G: Öncelikle 5 kartı rütbelere göre gruplandırıyorum ve uzunluklarını aldım:
5h 5d 6c 5s Jd
->
[3, 1, 1]
- F: Sonra bu listeye 4 eksi farklı süit ekledim.
Flush
->
3
eklenir, not flush
->
2/1/0
eklenir.
- S: Başka bir numara ekle.
0
düz 4
değilse, düzse A2345
veya 5
daha yüksek bir düzse.
Bu 4-7 sayılar listesi azalan düzende sıralanır ve azami değere sahip liste seçilir.
Bu neden işe yarıyor? Burada her tür için olası yapılandırmaları görüyorsunuz. Sayıların yanındaki harf, size bu sayının hangi kuralla üretildiğini söyler.
- Düz floş:
[5S, 3F, 1G, 1G, 1G, 1G, 1G]
veya[4S, 3F, 1G, 1G, 1G, 1G, 1G]
- Bir tür dört:
[4G, 1G, 0F, 0S]
- Tam ev:
[3G, 2G, 1F, 0S]
veya[3G, 2G, 0F, 0S]
- Flush:
[3F, 1G, 1G, 1G, 1G, 1G, 0S]
- Düz:
[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]
- Üçlü:
[3G, 1G, 1G, 1F, 0S]
,[3G, 1G, 1G, 0F, 0S]
- İki çift:
[2G, 2G, 2F, 1G, 0S]
, [2G, 2G, 1F, 1G, 0S]
,[2G, 2G, 1G, 0F, 0S]
- Bir çift:
[2G, 2F, 1G, 1G, 1G, 0S]
, [2G, 1G, 1G, 1G, 1F, 0S]
,[2G, 1G, 1G, 1G, 0F, 0S]
- Yüksek kart:
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
, [1F, 1G, 1G, 1G, 1G, 1G, 0S]
,[1G, 1G, 1G, 1G, 1G, 0S, 0F]
Pyth, element-wise listelerini karşılaştırır. Bu nedenle, Düz bir sifonun her zaman bir tür Dört'ü yeneceği açıktır. Tipik poker kurallarının çoğu bu listelerde açıktır. Bazıları çelişkili görünüyor.
- Dümdüz bir dördü veya bir Dolu evin karşısında bir Kazanç kazanır: Sorun değil. Dördüncü bir tür / Full evin nehir kartına sahip olma şansına sahipseniz, aynı anda dümdüz bir şekilde gidemezsiniz (zaten elinizde 2 veya 3 farklı süitiniz olduğundan).
- Düz bir floşa karşı kazanır. Nehir kartıyla aynı hizada ve dümdüz bir ulaşabiliyorsanız, aynı zamanda dümdüz bir floş yapabilirsiniz. Düz floş hem düz hem de floştan daha iyi bir skora sahiptir.
- Bir çift
[2G, 2F, 1G, 1G, 1G, 0S]
, iki çift eline karşı kazanır. Ayrıca sorun yok. Nehir kartıyla iki çift alırsanız, nehirden en az bir çift aldığınızdan. Ancak bu, üç türden daha iyi olabileceğiniz anlamına gelir. Yani iki çift aslında cevap asla olmayacak.
- Yüksek kart
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
bazı çift ellere karşı kazanır. Eğer elde edebileceğiniz en iyi puan bu ise, nehirden önce bir takım 3 kart ve bir takım farklı bir kartınız olacak. Ancak o zaman bu iki süitten birine ve daha önce görünen bir değere sahip olan kartı seçebilirsiniz [2F, 2G, ...]
.
Yani bu, doğru çözüm türünü seçer. Ama en iyi çifti nasıl bulabilirim (4 olasılıktan), en iyisini nasıl seçerim? Çünkü iki farklı bir çift çözüm aynı puana sahip olabilir.
Bu kolay. Pyth, sabit sıralama yapılmasını garanti eder (en fazla çekerken). Bu yüzden basit sırayla kartları oluşturmak 2h 2s 2c 2d 3h 3s ... Ad
. Böylece en yüksek değerli kart otomatik olarak maksimum olur.
Uygulama ayrıntıları
=Zc
Giriş dizesini böler ve kartların listesini içinde saklar Z
.
=T+`M}2Tc4"JQKA"
rütbe listesini oluşturur ['2', ..., '10', 'J', 'Q', 'K', 'A']
ve bunları saklar T
. -sM*T..."hscd"Z
rütbenin her birleşimini süitler ile oluşturur ve kartlarını kaldırır Z
.
o...
kalan kartları şu lM.gPkJ
şekilde sıralar : sıra gruplarının uzunluğu, +-4l{eMJlM
4 uzunluk ekler (süitler), +*-5l@\AN}SPMJ+NZSM.:+\AT5
süite bağlı olarak 0/4/5 ekler ("A" + T uzunluğunun her alt dizesini oluşturur, elin olup olmadığını kontrol et bunlardan biri (elin sıralanması ve tüm alt grupların sıralanması gerekir), karttaki 5 - "A" sayısı ile çarpın), _S
liste azalmasını sıralar.
e
maksimumu seçin ve yazdırın.