Hold'em veya Fold'em?


17

Arkadaşınız sizi son dakikada yüksek bahisli bir poker oyununa davet etti ve bir bilgisayar bilimcisi olarak, oyunda avantaj elde etmek için yeteneklerinizi kullanmaya karar verdiniz. Göreviniz verilecektir 2 cards(eliniz) ve 0, 3, 4 or 5 cards(dağıtılmış kartlar), mümkün olan en iyi elin ne olacağına karar vermelisiniz. Eğer 7 kartın hepsi argüman olarak verilirse, cevap oldukça açıktır. Daha az verilirse, sorun daha karmaşık hale gelir. Ancak, bu size aradığınız kenarı vermek için yeterli değildir, rakiplerinizin de neler yapabileceğini anlamak için kalan kartlardan mümkün olan en iyi eli de hesaplamanız gerekir.


Hold'em Tazeleme

Hold'em'i bilmiyorsanız, oyundaki her oyuncu 'el' olarak 2 kartla başlar. 3 'tur' boyunca, tüm oyuncuların paylaşacağı ek kartlar ortaya çıkar. İlk turda 3 kart çıkar. İkincisi, 1 tane daha ve üçüncü kez bir final kartı ortaya çıkar. Önce verilen iki kart elinizi temsil ederken, ikincisi art arda dönüşlerle verilen 0, 3, 4 veya 5 kartı temsil eder.


Olası Numaralar:

[2,3,4,5,6,7,8,9,T(10),J,Q,K,A]

Olası Suits:

[S,C,H,D]

Full Deck:

[2S,3S,4S,5S,6S,7S,8S,9S,TS,JS,QS,KS,AS, # Spades.
 2C,3C,4C,5C,6C,7C,8C,9C,TC,JC,QC,KC,AC, # Clubs.
 2H,3H,4H,5H,6H,7H,8H,9H,TH,JH,QH,KH,AH, # Hearts.
 2D,3D,4D,5D,6D,7D,8D,9D,TD,JD,QD,KD,AD] # Diamonds.

El Sıralaması:

1:Royal Flush    (A-K-Q-J-10, all from the same suit).
2:Straight Flush (Sequential cards, all from the same suit).
3:Four-of-a-Kind (Self explanatory).
4:Full House     (3-of-a-kind and a 2-of-a-kind).
5:Flush          (All cards are from the same suit).
6:Straight       (Sequential Cards, any suits).
7:3-of-a-Kind    (Self explanatory).
8:2-Pair         (Double 2-of-a-Kind).
9:Pair           (2-of-a-Kind).
10:High Card     (You have absolutely nothing except a single card).

Bir veya iki örnek alalım ve bunlardan geçelim:

Basit örnek:

[AS, AC],[AH,AD,9S,9C,9H]-> 3(Ayni 3Dörtlü ), ( Ayni Dörtlü)

Bu kurulumda sahip olabileceğiniz en iyi el, dört eldir. Rakiplerinizin sahip olabileceği en iyi el aynı zamanda bir 4'lüdür, çünkü 2 kartlı elinde bir KQJ10 olamaz.


[5C,2C],[6C,4C,JH,JD]-> 2(Straight Flush), 3(Ayni 4)

Düz bir floş riski altındasınız, ancak elinizde 2 / 5C bulunduğundan, başka hiç kimse her iki orta kartı tutmanızdan kaynaklanmıyor. Onlar için en iyi umut 2 cep Jacks ve flop üzerinde bir Jack elde etmektir.


[JS,JC],[]-> 1(Floş Royal), 1(Floş Royal)

Onlara karşı kullanabileceğiniz hiçbir bilgi verilmemiştir, şu anda söyleyebileceğiniz tek şey, elmas / kalplerde sadece bir floş royal olabilir, ancak mümkün olduğunca kraliyet floşunu elde etmeniz mümkündür. Aslında, flopun henüz gerçekleşmediği tüm girdiler 1-1 yanıtla sonuçlanmalıdır.


[2C,4S],[3C,7S,9D,AH,JD]-> 10(Yüksek Kart), 7(Türünün Üçü)

Bu kesinlikle vidalandığınıza bir örnektir ve nehir göz önüne alındığında düz veya floş olasılığı yoktur. Buradaki en iyi el, bir tür 3'lü sonuç veren cep aslarıdır.


G / Ç Gereksinimleri

  • Girdi, elinizdeki ve halkın bilgisi olan şey arasında ayrılmalıdır; uygulamadan bağımsız olarak bu şekilde daha kolay olacaktır.
    • Kartlar size bağlı olarak tuples veya dize olabilir.
    • El ve Oyun Alanı diziler veya sınırlandırılmış dizeler olabilir.
  • Çıktı, sağladığım eller listesinden iki dizin olmalıdır (EG [2,1]).
    • Bir işlevin bir parçası olarak iade edilebilir, konsola yazdırılabilir veya uygun bir şekilde çıkarılabilir.
    • Biri en iyi eliniz için, diğeri mümkün olan en iyi için iki farklı değer olmalıdır.
  • 10 sizin için anlamlı olan bir Tveya olarak temsil edilebilir 10.
  • Standart boşluklara izin verilmez.

Kazanma Kriterleri

  • Bu , posta tarihinin bir kravat kırıcı ile en düşük bayt sayımı.

2
İzin verilen kartlardan yalnızca biri Ave 1içinde olmamalı mı ? Ayrıca, yüz değerleri gibi sayısal değerlere gerek duymak için gerçekten zorlayıcı bir neden olduğunu düşünmüyorum 11.
FryAmTheEggman


9
A Ave a ile bir güverte görmedim 1. Diğer her şey iyi görünüyor.
isaacg

1
Poker oyuncusu olmayan bizler için lütfen ikinci kart grubunun sizin ve rakibiniz arasında paylaşıldığını, oysa göremediğiniz iki kartın olduğunu açıklayın. Cep , flop ve nehir terimlerini tanımlayan hızlı bir sözlük yararlı olacaktır.
DLosc

1
Ayrıca yararlı: bir turun tüm sırasını açıklamak. (Her oyuncu sadece kendileri tarafından bilinen iki kartla başlar, üç kart açık olarak dağıtılır, sonra dördüncü, sonra beşinci dağıtılır, bu noktada her oyuncu kendileri tarafından görülebilir yedi karttan herhangi bir beş karttan bir "el" oluşturur .) Birisine neden yedi kart olduğu açık olmayabilir ama el beşten oluşur.
DLosc

Yanıtlar:


3

Haskell , 433530425 bayt

@Laikoni sayesinde -5 bayt

import Data.List
q="23456789TJQKA"
e=elem
l=length
b=map
r p|z,elem 'A'u,elem 'K'u=1|z=2|e 4t=3|v<3=4|w=5|y=6|e 3t=7|v<4=8|v<5=9|1>0=10where u=[n!!0|n<-p];v=l$nub u;t=b(\n->l[x |x<-u,x==n])q;w=all(==(last$p!!0))[last s|s<-p];y=elem""[u\\s|s<-b(take 5.flip drop('A':q))[0..10]];z=y&&w
0%_=[[]]
n%(x:y)=b(x:)((n-1)%y)++n%y
_%_=[]
h#t|let p=h++t;c i=minimum$b r$concat$b(5%)$b(++i)((7-l i)%([n:[s]|n<-q,s<-"SCHD"]\\p))=(c p,c t)

Çevrimiçi deneyin!

Ungolfed (aynı fikir, biraz farklı yapı):

import Data.List -- for (\\)
numbers = "23456789TJQKA"

e=elem

rank_hand hand
    |royal_flush=1
    |straight_flush=2
    |four_of_a_kind=3
    |full_house=4
    |flush=5
    |straight=6
    |three_kind=7
    |two_pair=8
    |pair=9
    |1>0=10
    where nums = [head n | n<-hand]
          unique = length $ nub nums
          counts = map (\n->length [x | x<-nums, x==n]) numbers
          pair = unique < 5
          two_pair = unique < 4 -- could also be 3 of a kind, but that's ok
          three_kind = e 3 counts
          flush = all (==(last$hand!!0)) [last s|s<-hand]
          straight = elem "" [nums\\s | s <- map (take 5.flip drop ('A':numbers))[0..10]]
          full_house = unique < 3
          four_of_a_kind = e 4 counts
          straight_flush = straight && flush
          royal_flush = straight_flush && elem 'A' nums && elem 'K' nums

-- taken from /codegolf//a/34496/66460
-- k%l finds combinations of size k from a list l
0%_=[[]]
n%(x:y)=map(x:)((n-1)%y)++n%y
_%_=[]

-- find every combination available to each player, and rank each one. 
-- could be golfed a lot more.
h#t=let p=h++t
        a=[n:[s]|n<-numbers,s<-"SCHD"]\\p
        c i=minimum $ map rank_hand $ concat $ map (5%) $ map (++i) ((7-length i)%a)
    in(c p,c t)

Çok yavaş, hiç özel bir kasa olmadığı için (örneğin kart gösterilmediyse, floş royal her zaman mümkündür.) Golf çabamın çoğu rank_hand ; #haritaları ve benzerlerini birleştirerek çok daha fazla golf yapılabilir.

hand#tableSiz ve rakibiniz için en uygun skorları hesaplar. Hata kontrolü yapmaz.


Sanırım s/elem/e/gtanımladıktan sonra unuttun e=elem, bu yüzden 9 bayt tasarruf etmelisin. Özellikle tanımlayıcıların sayıları doğrudan takip ettiği yerlerde bazı boşlukları da kaldırabileceğinizi düşünüyorum
Julian Wolf

@JulianWolf Hala Haskell'de yeniyim, ancak bir nedenden dolayı e=elemint-> Bool türünde bir tür görünüyor, bu yüzden tamsayı olmayan elem çağrıları için e kullandığımda derlenmiyordu. Neden olduğunu anlamaya çalışıyorum. Alanlardaki bahşiş için teşekkürler!
vroomfondel

Ah, haklısın. Haskell bazen polimorfik türleri çıkarmada sorun yaşıyor
Julian Wolf

1
h#t=let[...]in[...]kısaltılabilir h#t|let[...]=[...]. Ayrıca head nolduğunu n!!0. Bir nöbetçi &&basitçe olabilir ,.
Laikoni
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.