জুজু হাতে সর্বশেষ কার্ডটি চয়ন করুন


31

পোকার হাতগুলি নিম্ন থেকে খারাপের দিকে নিম্নরূপে স্থান পেয়েছে:

  1. সোজা ফ্লাশ - ক্রমিক ক্রমের পাঁচটি কার্ড, সমস্ত একই মামলা same
  2. চার ধরণের - একই র‌্যাঙ্কের চারটি কার্ড এবং অন্য র‌্যাঙ্কের একটি কার্ড
  3. পূর্ণ বাড়ি - এক র‌্যাঙ্কের তিনটি কার্ড এবং অন্য র‌্যাঙ্কের দুটি কার্ড
  4. ফ্লাশ - একই কার্ডের পাঁচটি কার্ড
  5. সোজা - ক্রমান্বয়ে র‌্যাঙ্কের পাঁচটি কার্ড
  6. তিন ধরণের - একই র‌্যাঙ্কের তিনটি কার্ড এবং অন্য দুটি র‌্যাঙ্কের দুটি কার্ড
  7. দুটি জোড়া - একই র‌্যাঙ্কের দুটি কার্ড, অন্য র‌্যাঙ্কের দুটি কার্ড এবং তৃতীয় র‌্যাঙ্কের একটি কার্ড
  8. একটি জোড়া - একই র‌্যাঙ্কের দুটি কার্ড এবং অন্য তিনটি র‌্যাঙ্কের তিনটি কার্ড
  9. উচ্চ কার্ড - পাঁচটি কার্ড ক্রমানুসারে র‌্যাঙ্কের বা একই স্যুটের নয় এবং এর মধ্যে একটিও একই পদমর্যাদার নয়

  • র‌্যাঙ্ক = কার্ডে নম্বর (এ, কে, কিউ, জে, 10, 9, 8, 7, 6, 5, 4, 3, 2)। আপনি 10 এর পরিবর্তে টি ব্যবহার করতে বেছে নিতে পারেন।
  • স্যুট = হার্টস (জ), স্পেড (গুলি), ক্লাব (সি) এবং হীরা (ডি)

নোট করুন যে, এস, Aউভয়ই সর্বোচ্চ এবং সর্বনিম্ন সংখ্যা (1 বা 14) হতে পারে।

একটি কার্ড দুটি অক্ষর দ্বারা চিহ্নিত করা যেতে পারে As(স্পিডস এর এস), Jc(ক্লাবগুলির জ্যাক), 7h(অন্তরের 7) এবং আরও অনেক কিছু।


চ্যালেঞ্জ:

আপনি ডিলারের কাছ থেকে চারটি কার্ড পাবেন (চারটি ইনপুট স্ট্রিং)। আপনি যে সর্বোত্তম সম্ভব শেষ কার্ডটি খুঁজে পেতে পারেন এবং আউটপুট পান।

যদি এমন কার্ড থাকে যা সমানভাবে ভাল হয় তবে আপনি কোনটি বেছে নিতে পারেন তা বেছে নিতে পারেন।

ইনপুট এবং আউটপুট ফর্ম্যাটগুলি alচ্ছিক, তবে পৃথক কার্ডগুলি অবশ্যই উপরে বর্ণিত Jcএবং হিসাবে চিহ্নিত করা উচিত 2h


পরীক্ষার কেস:

Ah Kh Jh 10h
Qh

7d 8h 10c Jd
9d (or 9h, 9c, 9s)

Js 6c 10s 8h
Jc (or Jh, Jd)

Ac 4c 5d 3d
2h (or 2d, 2c, 2s)

5s 9s Js As
Ks

2h 3h 4h 5h
6h

Js Jc Ac Ah
As (or Ad)  <- Note that AAAJJ is better than AAJJJ because A is higher than J

10d 9d 5h 9c
9h (or 9s)

Ah Ac Ad As
Ks (or Kd, Kh, Kc)

4d 5h 8c Jd
Jc (or Js, Jh)

এটি কোড গল্ফ, তাই বাইটের মধ্যে সংক্ষিপ্ততম জমা submission

উত্তর:


13

পাইথ, 73 বাইট

eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc

এটা বেশ ভয়ানক। কার্ডগুলি পার্সিং, মানগুলি বাছাই করা, ... সবকিছুতে এতগুলি অক্ষর লাগে। তবে পদ্ধতিটি আকর্ষণীয়।

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার স্যুট

ব্যাখ্যা:

আমি সমস্ত 52 টি কার্ড তৈরি করি, ইনপুটটির চারটি কার্ড সরিয়ে ফেলি, প্রতিটি কার্ডের জন্য একটি স্কোর তৈরি করি (হাতের স্কোর) এবং সর্বোচ্চ স্কোর দিয়ে কার্ডটি মুদ্রণ করি।

স্কোরটি কিছুটা বিজোড়। আমি যদি দুটি সম্পূর্ণ ভিন্ন হাতের স্কোরটি তুলনা করি তবে এটি ভুল বিজয়ীকে বেছে নিতে পারে। যেমন একটি স্ট্রেইট 4 টেক্কা মারবে। তবে এটি কাজ করে, যদি প্রথম 4 টি কার্ড দুটি হাতে একই থাকে। এবং আমার গণিত স্কোর আসলে কোনও মান নয়, তবে মানগুলির তালিকা:

  • জি: প্রথম আমি র‌্যাংক অনুসারে 5 টি কার্ডকে গ্রুপ করব এবং দৈর্ঘ্য গ্রহণ করব: 5h 5d 6c 5s Jd -> [3, 1, 1]
  • এফ: তারপরে আমি এই তালিকায় 4 টি বিয়োগের বিবিধ সংখ্যক স্যুট সংযোজন করব। Flush -> 3সংযুক্ত হয়ে যায়, not flush -> 2/1/0সংযুক্ত হয়ে যায়।
  • এস: অন্য নম্বর যুক্ত করুন। 0যদি এটি একটি সোজা নয়, 4যদি তা সোজা হয় A2345, অথবা 5যদি এটি একটি উচ্চতর সোজা হয়।

4-7 সংখ্যার এই তালিকাটি ক্রমহ্রাসমান ক্রমে সাজানো হয় এবং সর্বাধিক মানযুক্ত তালিকাটি বাছাই করা হয়।

কেন এই কাজ করে? এখানে আপনি সব ধরণের জন্য সম্ভাব্য কনফিগারেশন দেখতে পাবেন। সংখ্যার পাশের চিঠিটি আপনাকে বলবে যে এই নিয়মটি কোন নিয়মের সাহায্যে উত্পন্ন হয়েছিল।

  • সোজা ফ্লাশ: [5S, 3F, 1G, 1G, 1G, 1G, 1G]বা[4S, 3F, 1G, 1G, 1G, 1G, 1G]
  • একরকম চারটে: [4G, 1G, 0F, 0S]
  • পুরো বাড়ি: [3G, 2G, 1F, 0S]বা[3G, 2G, 0F, 0S]
  • ফ্লাশ: [3F, 1G, 1G, 1G, 1G, 1G, 0S]
  • স্ট্রেইট: [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]
  • তিন প্রকারে: [3G, 1G, 1G, 1F, 0S],[3G, 1G, 1G, 0F, 0S]
  • দুই যুগল: [2G, 2G, 2F, 1G, 0S], [2G, 2G, 1F, 1G, 0S],[2G, 2G, 1G, 0F, 0S]
  • এক জোড়া: [2G, 2F, 1G, 1G, 1G, 0S], [2G, 1G, 1G, 1G, 1F, 0S],[2G, 1G, 1G, 1G, 0F, 0S]
  • উচ্চ কার্ড: [2F, 1G, 1G, 1G, 1G, 1G, 0S], [1F, 1G, 1G, 1G, 1G, 1G, 0S],[1G, 1G, 1G, 1G, 1G, 0S, 0F]

পাইথ উপাদান অনুসারে তালিকার তুলনা করে। সুতরাং এটি স্পষ্টতই যে স্ট্রেট ফ্লাশ সবসময় একধরনের চারটিকে পরাজিত করবে। বেশিরভাগ সাধারণ পোকার নিয়মগুলি এই তালিকাগুলির সাথে সুস্পষ্ট। কারও কারও মনে পরস্পর বিরোধী মনে হয়।

  • একটি স্ট্রেইট চার ধরণের বা পুরো বাড়ির বিরুদ্ধে জিতবে: কোনও সমস্যা নয়। আপনার যদি নদী কার্ড সহ চার ধরণের / পূর্ণ বাড়ির সুযোগ পাওয়ার সুযোগ থাকে তবে আপনি একইসাথে সরাসরি পৌঁছাতে পারবেন না (যেহেতু আপনার হাতে ইতিমধ্যে 2 বা 3 টি আলাদা স্যুট রয়েছে)।
  • একটি স্ট্রেস ফ্লাশের বিরুদ্ধে জিতবে। আপনি যদি নদী কার্ডের সাহায্যে কোনও ফ্লাশ এবং কোনও সোজা পৌঁছে দিতে পারেন তবে আপনিও একটি সরাসরি ফ্লাশে পৌঁছাতে পারেন। স্ট্রেইট ফ্লাশের স্ট্রেইট এবং ফ্লাশ উভয়ের চেয়ে ভাল স্কোর রয়েছে।
  • একজোড়া [2G, 2F, 1G, 1G, 1G, 0S]জিতবে কিছু দুজনের হাতের বিপরীতে। এছাড়াও কোন সমস্যা নেই। নদীর কার্ডের সাথে যদি আপনি দুটি জোড়া পান তবে নদীর আগে আপনার কমপক্ষে একটি জোড়া ছিল। তবে এর অর্থ, আপনি তিন ধরণের উন্নতি করতে পারেন, এটি আরও ভাল। সুতরাং একটি দুটি জুড়ি আসলে উত্তর হবে না।
  • উচ্চ কার্ডটি [2F, 1G, 1G, 1G, 1G, 1G, 0S]এক জোড়া হাতের বিপক্ষে জিতবে। এটি যদি আপনি পৌঁছানোর সেরা স্কোর হয় তবে নদীর আগে আপনার কাছে একটি স্যুটের 3 টি কার্ড এবং আলাদা স্যুটের একটি কার্ড থাকবে। তবে তারপরে আপনি এই দুটি স্যুটটির একটির সাথে এবং ইতিমধ্যে উপস্থিত একটি মান সহ কার্ডটি চয়ন করতে পারেন এবং আপনি স্কোরটি শেষ করবেন [2F, 2G, ...], এটি আরও ভাল।

সুতরাং এটি সমাধানের সঠিক ধরণের পছন্দ করে। তবে আমি কীভাবে সেরা একজোড়া (৪ টি সম্ভাবনার মধ্যে) পাব, আমি কীভাবে সেরা সোজা চয়ন করব, ...? কারণ দুটি পৃথক এক-জুড়ি সমাধানে একই স্কোর থাকতে পারে।

এটা সহজ. পাইথ স্থিতিশীল বাছাইয়ের গ্যারান্টি দেয় (সর্বোচ্চ গ্রহণের সময়)। সুতরাং আমি ক্রমে কার্ডগুলি উত্পন্ন করি 2h 2s 2c 2d 3h 3s ... Ad। সুতরাং সর্বোচ্চ মান সহ কার্ডটি স্বয়ংক্রিয়ভাবে সর্বোচ্চ।

বাস্তবায়ন বিশদ

=Zcইনপুট স্ট্রিংকে বিভক্ত করে এবং কার্ডের তালিকা সংরক্ষণ করে Z=T+`M}2Tc4"JQKA"র‌্যাঙ্কগুলির তালিকা তৈরি করে ['2', ..., '10', 'J', 'Q', 'K', 'A']এবং এগুলিকে সংরক্ষণ করে T-sM*T..."hscd"Zস্যুটগুলির সাথে র‌্যাঙ্কের প্রতিটি সংমিশ্রণ উত্পন্ন করে এবং এর কার্ডগুলি সরিয়ে দেয় Z

o...এই বাকী কার্ডগুলি এর দ্বারা অর্ডার করুন: lM.gPkJর‌্যাঙ্কগুলির গোষ্ঠীর +-4l{eMJlMদৈর্ঘ্য , 4 - দৈর্ঘ্য (স্যুট) +*-5l@\AN}SPMJ+NZSM.:+\AT5সংযোজন করে, স্যুটের উপর নির্ভর করে 0/4/5 সংযোজন করে ("এ" + টি এর দৈর্ঘ্যের 5 টি প্রতিটি স্তর তৈরি করে, হাতটি পরীক্ষা করুন কিনা এর মধ্যে একটি (হাতের বাছাই এবং সমস্ত উপসর্গ বাছাই করা প্রয়োজন), কার্ডে "এ" এর সংখ্যা - 5 দিয়ে গুণ করুন), _Sতালিকাটি ক্রমশ হ্রাস করে orts

e সর্বাধিক বাছুন এবং মুদ্রণ।


2
খুব সৃজনশীল, এবং দুর্দান্ত ব্যাখ্যা!
গ্রেগ মার্টিন

4

জাভাস্ক্রিপ্ট (ES6), 329 324 317 312 309 বাইট

H=>[..."cdhs"].map(Y=>[...L="AKQJT98765432"].map(X=>~H.indexOf(X+=Y)||([...H,X].map(([R,S])=>a|=eval(S+'|=1<<L.search(R)',F|=S!=H[0][1]),F=a=c=d=h=s=0),x=c|d,y=h|s,c&=d,h&=s,p=c|x&y|h,t=c&y|h&x,(S=a-7681?((j=a/31)&-j)-j?F?c&h?2e4+a:t?t^p?3e4+t:7e4:p?8e4+p:M:4e4+a:F?5e4+a:a:F?6e4:1e4)<M&&(R=X,M=S))),M=1/0)&&R

কিভাবে এটা কাজ করে

ডেকের প্রতিটি অবশিষ্ট কার্ডের জন্য, আমরা একটি হাতের স্কোর গণনা করি S। যত কম স্কোর, তত ভাল হাত।

চলকগুলি স্কোর গণনা করতে ব্যবহৃত হত

  • F: হাতটি ফ্লাশ হলে মিথ্যা
  • c: ক্লাবগুলির বিটমাস্ক
  • d: হীরা বিটমাস্ক
  • h: বিটমাস্ক অফ হার্টস
  • s: স্পাইডসের বিটমাস্ক
  • x = c | d: ক্লাবগুলির বিটমাস্ক বা হীরা
  • y = h | s: হৃদয় বা স্পেডসের বিটমাস্ক ades
  • a: সমস্ত সম্মিলিত স্যুট বিটমাস্ক
  • p = c & d | x & y | h & s: জোড়া বিটমাস্ক (1)
  • t = c & d & y | h & s & x: তিন ধরণের বিটমাস্ক (1)

(1) আমি কয়েক বছর আগে এই সূত্রগুলি লিখেছিলাম এবং সেগুলি বেশ কয়েকটি পোকার ইঞ্জিনে ব্যবহার করেছি। তারা কাজ করে। :-)

অন্যান্য সূত্র

  • c & d & h & s: চার ধরনের বিটমাস্ক
  • a == 7681: বিশেষ সোজা "এ, 2, 3, 4, 5" (0b111100000000001) এর জন্য পরীক্ষা
  • ((j = a / 31) & -j) == j: অন্যান্য সমস্ত রাস্তার জন্য পরীক্ষা

স্কোর চার্ট

Value    | Hand
---------+--------------------------------------------
0   + a  | Standard Straight Flush
1e4      | Special Straight Flush "A, 2, 3, 4, 5"
2e4 + a  | Four of a Kind
3e4 + t  | Full House
4e4 + a  | Flush
5e4 + a  | Standard Straight
6e4      | Special Straight "A, 2, 3, 4, 5"
7e4      | Three of a Kind
8e4 + p  | Pair
Max.     | Everything else

এনবি: আমাদের দ্বি-জুড়ি সম্পর্কে যত্ন নেওয়ার দরকার নেই যা সম্ভবত আমাদের সেরা বিকল্প হতে পারে না। (আমাদের যদি ইতিমধ্যে একটি জুড়ি থাকে তবে আমরা এটিকে এক ধরণের তিনটে রূপান্তর করতে পারি And

পরীক্ষার মামলা


3

জাভাস্ক্রিপ্ট (ES6), 307 349

এটি বেশ বিশাল এবং আমি নিশ্চিত না যে এটি সর্বোত্তম পন্থা। এখনও সম্ভবত কিছু গল্ফযোগ্য।

h=>(r='_23456789TJQKAT',R=x=>r.search(x[0]),M=i=>[...'hcds'].some(s=>h.indexOf(j=h[i][0]+s)<0)&&j,[u,v,w,y]=h.sort((a,b)=>R(a)-R(b)).map(x=>R(x)),[,,d,e,f,g,k]=[...new Set(h+h)].sort(),q=10-u-v-w,s=(z=y>12)&q>0?q:y-u<5&&u*5+q-y,d>r?z?'Kh':'Ah':f>r?M((e>r?v<w:u<v)+1):s?r[s]+g:k?M(3):r[13-z-(w>11)-(v>10)]+g)

কম গল্ফড

h=>(
  // card rank, 1 to 13, 0 unused
  // fake rank 14 is T, to complete a straight JQKA?
  // as I always try to complete a straight going up
  r = '_23456789TJQKAT', 

  // R: rank a card
  R = x => r.search(x[0]),  

  // M: find a missing card (to complete a same-rank set like a poker)
  // look for a card with the same rank of the card at position i
  // but with a suit not present in the hand
  M = i => [...'hcds'].some(s => h.indexOf(j=h[i][0]+s) < 0) && j,
  h.sort((a, b) => R(a)-R(b) ), // sort hand by rank
  [u,v,w,y] = h.map(x=>R(x)),   // rank of cards 0..3 in u,v,w,y

  // Purpose: look for duplicate rank and/or duplicate suits
  // Put values and suits in d,e,f,g,k, with no duplicates and sorted
  // suits are lowercase and will be at right end
  [,,d,e,f,g,k] = [...new Set(h+h)].sort(),

  // Only if all ranks are different: find the missing value to get a straight
  // or 0 if a straight cannot be obtained
  // The first part manages the A before a 2
  q = 10-u-v-w, s = y>12&q>0 ? q : y - u < 5 && u * 5 + q - y,

  d > r // d is lowercase -> all cards have the same rank
    ? u < 13 ? 'Ah' : 'Kh' // add a K to a poker of A, else add an A
    : e > r // e is lowercase -> 2 distinct ranks
      ? M(v<w ? 2 : 1) // go for a poker or a full house
      : f > r // f is lowercase -> 3 distinct ranks, we have a pair
        ? M(u<v ? 2 : 1) // find the pair and go for 3 of a kind
        : s // all different ranks, could it become a straight?
          ? r[s] + g // if there is only a suit, it will be a flush straight too
          : k // if there are 2 or more different suits
            ? M(3) // go for a pair with the max rank
            : r[13-(y>12)-(w>11)-(v>10)]+g // flush, find the max missing card
)

পরীক্ষা

F=
h=>(r='_23456789TJQKAT',R=x=>r.search(x[0]),M=i=>[...'hcds'].some(s=>h.indexOf(j=h[i][0]+s)<0)&&j,[u,v,w,y]=h.sort((a,b)=>R(a)-R(b)).map(x=>R(x)),[,,d,e,f,g,k]=[...new Set(h+h)].sort(),q=10-u-v-w,s=(z=y>12)&q>0?q:y-u<5&&u*5+q-y,d>r?z?'Kh':'Ah':f>r?M((e>r?v<w:u<v)+1):s?r[s]+g:k?M(3):r[13-z-(w>11)-(v>10)]+g)

output=x=>O.textContent+=x+'\n'

;`Ah Kh Jh Th -> Qh
7d 8h Tc Jd -> 9d 9h 9c 9s
Js 6c Ts 8h -> Jc Jh Jd
Ac 4c 5d 3d -> 2h 2d 2c 2s
5s 9s Js As -> Ks
2h 3h 4h 5h -> 6h
Js Jc Ac Ah -> As Ad
Td 9d 5h 9c -> 9h 9s
Ah Ac Ad As -> Ks Kd Kh Kc
4d 5h 8c Jd -> Jc Js Jh`
.split('\n')
.forEach(s=>{
  var o = s.match(/\w+/g) // input and output
  var h = o.splice(0,4) // input in h, output in o
  var hs = h+''
  var r = F(h)
  var ok = o.some(x => x==r)
  
  output((ok?'OK ':'KO ')+ hs + ' -> ' + r)
})
<pre id=O></pre>


মজাদার যে আমাদের উভয় পদ্ধতির খুব একই আকারের দিকে রূপান্তরিত বলে মনে হচ্ছে। :-) পারফরম্যান্স বুদ্ধিমান, আপনি অবশ্যই দ্রুত, যদিও।
আর্নল্ড

@ আরনল্ড আমি আরও 4 টি বাইট শেভ করতে পেরেছি। আপনার পালা
edc65
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.