হোল্ড'ম না ফোল্ড'ম?


17

আপনার বন্ধু আপনাকে শেষ মুহুর্তে একটি উচ্চ-পিক্সের জুজু গেমটিতে আমন্ত্রণ জানিয়েছে এবং কম্পিউটার বিজ্ঞানী হিসাবে, আপনি গেমটির প্রান্ত অর্জনের জন্য আপনার দক্ষতা ব্যবহার করার সিদ্ধান্ত নিয়েছেন। আপনার কাজটি দেওয়া হবে 2 cards(আপনার হাত) এবং 0, 3, 4 or 5 cards(ডিল কার্ড), আপনাকে অবশ্যই সিদ্ধান্ত নিতে হবে যে আপনি কী সেরা হাত পেতে পারেন। সমস্ত 7 টি কার্ড যদি আর্গুমেন্ট হিসাবে দেওয়া হয় তবে উত্তরটি বেশ পরিষ্কার। কম দিলে সমস্যা আরও জটিল হয়। তবে, আপনি যে প্রান্তটি সন্ধান করছেন তা দেওয়ার পক্ষে এটি যথেষ্ট নয়, আপনার বিরোধীদেরও কী থাকতে পারে তা বোঝার জন্য আপনাকে অবশ্যই বাকী কার্ডগুলি থেকে সেরা সম্ভাব্য হাত গণনা করতে হবে।


হোল্ড'ম রিফ্রেশার

যদি আপনি হোল্ড'ইম সম্পর্কে না জানেন তবে গেমের প্রতিটি খেলোয়াড় তাদের 'হাত' হিসাবে 2 টি কার্ড দিয়ে শুরু করে। 3 টি 'টার্ন' চলাকালীন অতিরিক্ত কার্ডগুলি সমস্ত খেলোয়াড়ের মধ্যে ভাগ করে নেওয়ার বিষয়টি প্রকাশিত হয়। প্রথম পালা, 3 টি কার্ড প্রকাশিত হয়। দ্বিতীয়, আরও 1 জন এবং তৃতীয়বারের মতো একটি চূড়ান্ত কার্ড প্রকাশিত হবে। দুটি প্রদত্ত দুটি কার্ড প্রথমে আপনার হাতের প্রতিনিধিত্ব করে, যখন উত্তরোত্তর 0, 3, 4, বা 5 টি উত্তর কার্ডগুলি প্রতিনিধিত্ব করে success


সম্ভাব্য সংখ্যা:

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

সম্ভাব্য মামলা:

[S,C,H,D]

পূর্ণ ডেক:

[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.

হাতের র‌্যাঙ্কিং:

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).

দু'একটি উদাহরণ ধরুন এবং সেগুলির মধ্য দিয়ে চলুন:

সহজ উদাহরণ:

[AS, AC],[AH,AD,9S,9C,9H]-> 3(এক প্রকারের 3চারটি ), (চার ধরণের)

এই সেটআপটিতে আপনার পক্ষে সবচেয়ে ভাল হাতটি হ'ল এক দয়াবান হাতের চারটি। আপনার প্রতিপক্ষরা যে সম্ভাব্য সেরা হাত পেতে পারে তা হ'ল 4-অফ-এ-কিন্ডও, কারণ আপনার 2-কার্ড হাতে আপনার কোনও কিউকিজে 10 থাকতে পারে না।


[5C,2C],[6C,4C,JH,JD]-> 2(সোজা ফ্লাশ), 3(চার ধরণের)

আপনি সরাসরি ফ্লাশের ঝুঁকিতে রয়েছেন, তবে আপনার হাতে 2/5 সি থাকায় অন্য দুটি মিডল কার্ড রাখার কারণে আর কেউ নেই। 2 টি পকেট জ্যাক থাকা এবং ফ্ল্যাপটিতে একটি জ্যাক পাওয়া সর্বোত্তম তারা আশা করতে পারে।


[JS,JC],[]-> 1(রয়্যাল ফ্লাশ), 1(রয়েল ফ্লাশ)

তাদের বিরুদ্ধে আপনি ব্যবহার করতে পারেন এমন কোনও তথ্য দেওয়া হয়নি, আপনি এই মুহুর্তে কেবলমাত্র এটিই বলতে পারেন যে তারা কেবল হীরা / হৃদয়ে একটি রাজকীয় ফ্লাশ রাখতে পারেন, তবে তারা যেমন করেন তেমনি আপনি রয়েল ফ্লাশ পাবেন। প্রকৃতপক্ষে, যে সমস্ত ইনপুটগুলি ফ্লপটি এখনও ঘটেনি তার ফলাফল 1-1 জবাব হিসাবে নেওয়া উচিত।


[2C,4S],[3C,7S,9D,AH,JD]-> 10(উচ্চ কার্ড), 7(3-অফ-এ-ਕਿਸਮ)

এটি যেখানে আপনি একেবারে খারাপ হয়ে গেছেন তার একটি উদাহরণ, এবং নদী দেওয়া কোনও সরল বা ফ্লাশ হওয়ার কোনও সম্ভাবনা নেই। অর্থ এখানে সেরা হাতটি হ'ল পকেট টেক্কা যার ফলস্বরূপ 3-অফ-এ-কাইন্ড হয়।


I / O প্রয়োজনীয়তা

  • আপনার হাতে যা আছে এবং জনসাধারণের জ্ঞানের মধ্যে ইনপুট অবশ্যই আলাদা করতে হবে; বাস্তবায়ন নির্বিশেষে এটি সম্ভবত আরও সহজ হবে।
    • কার্ডগুলি আপনার উপর নির্ভর করে টিপলস বা স্ট্রিং হতে পারে।
    • হাত এবং প্লেয়িং ফিল্ড অ্যারে বা সীমাবদ্ধ স্ট্রিং হতে পারে।
  • আমি যে হাত সরবরাহ করেছি তার তালিকা থেকে আউটপুট অবশ্যই দুটি সূচক হতে হবে (EG [2,1])।
    • এটি কোনও ফাংশনের অংশ হিসাবে ফিরে আসতে পারে, উপযুক্ত উপায়ে কনসোল বা আউটপুট প্রিন্ট করা।
    • দুটি পৃথক মান থাকতে হবে, একটি আপনার সেরা হাতের জন্য, অন্যটি সর্বোত্তম সম্ভাবনার জন্য।
  • 10 কোনও Tবা হিসাবে হিসাবে উপস্থাপিত হতে পারে 10, আপনার জন্য যেটি বোঝায়।
  • স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।

বিজয়ী মানদণ্ড

  • এটি , পোস্ট তারিখের টাই-ব্রেকার সহ সর্বনিম্ন বাইট-কাউন্ট।

2
সেখানে কেবল একটি Aএবং হওয়া উচিত নয়1 সম্ভব অনুমতি কার্ড? এছাড়াও আমি মনে করি না যে সংখ্যার মানগুলির মতো মুখের সংক্ষিপ্তসারগুলির প্রয়োজনের জন্য একটি বাধ্যতামূলক কারণ আছে 11
FryAmTheEggman


9
আমি কখনই একটি Aএবং এর সাথে একটি ডেক দেখিনি 1। অন্য সব কিছুই দুর্দান্ত দেখাচ্ছে।
isaacg

1
আমাদের জন্য নন-পোকার-খেলোয়াড়দের, দয়া করে এই প্রশ্নে ব্যাখ্যা করুন যে কার্ডের দ্বিতীয় গ্রুপটি আপনার এবং আপনার প্রতিপক্ষের মধ্যে ভাগ করা আছে, যেখানে তাদের নিজস্ব দুটি কার্ড রয়েছে যা আপনি দেখতে পাচ্ছেন না। পকেট , ফ্লপ এবং নদীর শর্তাবলী সংজ্ঞায়িত করার জন্য একটি দ্রুত গ্লাসারি সহায়ক হবে।
DLosc

1
এছাড়াও সহায়ক: একটি রাউন্ডের পুরো ক্রমটি ব্যাখ্যা করে। (প্রতিটি খেলোয়াড় কেবল তাদের পরিচিত দুটি কার্ড দিয়ে শুরু করে, তারপরে তিনটি কার্ড মুখোমুখি হবে, তারপরে চতুর্থ, তারপরে পঞ্চম হবে, যার পর্যায়ে প্রতিটি খেলোয়াড় তাদের কাছে দৃশ্যমান সাতটির মধ্যে যে কোনও পাঁচটি কার্ড থেকে "হাত" গঠন করবে) ।) সাতটি কার্ড কেন তা কারও কাছে স্পষ্ট নাও হতে পারে তবে একটি হাতে পাঁচটি থাকে।
DLosc

উত্তর:


3

হাস্কেল , 433 430 425 বাইট

@ লাইকনি ধন্যবাদ -5 বাইট

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)

এটি অনলাইন চেষ্টা করুন!

অবহেলিত (একই ধারণা, কিছুটা আলাদা কাঠামো):

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)

খুব ধীর, যেহেতু কোনও বিশেষ কেসিং নেই (যেমন কোনও কার্ড দেখানো না থাকলে একটি রাজকীয় ফ্লাশ সবসময় সম্ভব) is আমার বেশিরভাগ গল্ফিংয়ের প্রচেষ্টা চলে গেছে rank_hand ফাংশনে ;#মানচিত্র এবং এ জাতীয় সমন্বয় করে আরও অনেক কিছু চালানো যেতে পারে।

hand#tableআপনার এবং আপনার প্রতিপক্ষের জন্য অনুকূল স্কোর গণনা করে। কোনও ত্রুটি যাচাই করে না।


আমি মনে করি আপনি s/elem/e/gসংজ্ঞা দেওয়ার পরে ভুলে গেছেন e=elem, যাতে আপনার 9 টি বাইট সংরক্ষণ করা উচিত। আমি মনে করি আপনি কিছু স্থানও মুছে ফেলতে পারবেন, বিশেষত যেখানে শনাক্তকারীরা সরাসরি নম্বরগুলি অনুসরণ করেন
জুলিয়ান ওল্ফ

@ জুলিয়ানওল্ফ আমি এখনও হাস্কেলের কাছে নতুন, তবে কোনও কারণে এটি e=elemঅনুমিত টাইপের মতো দেখে মনে হচ্ছে-> বুল তাই এটি সংকলন করা হয়নি যখন আমি ই-ইন্টিজার নয় এমন এলিম কলের জন্য ই ব্যবহার করতাম। আমি কী ছিল তা জানার চেষ্টা করছি। ফাঁকা জায়গায় টিপ দেওয়ার জন্য ধন্যবাদ!
ভোরফোনডেল

আহ, আপনি ঠিক বলেছেন। হাস্কেলের মাঝে মাঝে বহুবর্ষচরণের ধরণের অনুমান করতে সমস্যা হয়
জুলিয়ান ওল্ফ

1
h#t=let[...]in[...]সংক্ষিপ্ত করা যেতে পারে h#t|let[...]=[...]। এছাড়াও head nহয় n!!0। একটি প্রহরী &&সহজভাবে হতে পারে ,
লাইকনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.