একটি স্ক্যাট-হ্যান্ড মূল্যায়ন করুন


18

ভূমিকা

স্ক্যাট 3 জন খেলোয়াড়ের জন্য একটি traditional তিহ্যবাহী জার্মান কার্ড গেম। ডেকটিতে 32 টি কার্ড রয়েছে: এস, কিং, কুইন, জ্যাক, 10, 9, 8, 7 সমস্ত 4 স্যুটে (ক্লাব, স্পেডস, হার্টস, হীরা)।

প্রতি রাউন্ডে একজন খেলোয়াড় একক খেলেন এবং অন্য দুটি তার বিরুদ্ধে খেলেন। একটি রাউন্ডের শুরুতে প্রতিটি খেলোয়াড়কে 10 টি কার্ডের জন্য ডিল করা হয়, বাকি 2 টি কার্ডকে স্কট বলে এবং মাঝখানে মুখোমুখি করা হয়। একক প্লেয়ার একটি বিডিং পর্ব দ্বারা নির্ধারিত হয়। এটি এই গেমের অংশ যা আপনাকে এই চ্যালেঞ্জের সাথে মোকাবেলা করতে হবে, নীচে এটিতে আরও বিশদ।

বিডিং পর্বে যে খেলোয়াড় জয়লাভ করে সে একক খেলোয়াড় হয়। তিনি স্কটটি তুলে নিয়ে তার পরে দুটি কার্ড ফেলে (যা একইরকম হতে পারে, অন্য দলটি জানে না), ট্রাম্প স্যুটটি নিয়ে যায় এবং রাউন্ড শুরু হয়।

এক রাউন্ডে দশটি কৌশল রয়েছে। যে খেলোয়াড় ট্রিক জিতবে তার সমস্ত কার্ড না খেলার আগ পর্যন্ত নেতৃত্ব দেয়। আমি এখানে নিয়মগুলি ব্যাখ্যা করব না, তবে আপনার জানা উচিত যে প্রচুর ট্রাম্প কার্ড থাকা ভাল। আপনি যদি নিয়মগুলি সম্পর্কে জানতে চান তবে এই পোস্টের শুরুতে আমি উইকিপিডিয়া নিবন্ধটি যা লিঙ্ক করেছি তা পরীক্ষা করে দেখুন, তবে এই চ্যালেঞ্জের জন্য এটির প্রয়োজন হয় না।

চ্যালেঞ্জ

আপনি আপনার দুই ছেলেকে কীভাবে স্ক্যাট খেলতে শেখাতে চান। বিধিগুলি এত কঠিন নয়, তাই তারা দ্রুত এটিতে প্রবেশ করে into তাদের কঠিন সময় দেওয়ার একমাত্র জিনিস হ'ল বিডিং, বিশেষত তাদের হাতের গেমের মান গণনা করা। সুতরাং আপনি একটি ছোট প্রোগ্রাম লেখার সিদ্ধান্ত নিয়েছেন যা তাদের বর্তমান হাতে দেওয়া সর্বাধিক গেমের মানকে তারা বিড করতে পারে out

গেমের মান গণনা করা হচ্ছে

প্রত্যেক হাতের একটি নির্দিষ্ট গেমের মান থাকে। এটি আপনার যে ক্রমযুক্ত জ্যাকস এবং আপনি ট্রাম্প হিসাবে বেছে নিতে চান স্যুটটি পরিমাণ দ্বারা নির্ধারিত হয়। প্রথম ফ্যাক্টর দিয়ে শুরু করা যাক, জ্যাকস!

জ্যাক ফ্যাক্টর

জ্যাকগুলি সর্বদা ট্রাম্প কার্ড হয় এবং তারা অন্য প্রতিটি ট্রাম্প কার্ডকে পরাজিত করে। চারটি জ্যাকের মধ্যে শক্তির ক্রমটি হ'ল:

  1. ক্লাব জ্যাক (সর্বোচ্চ)
  2. স্প্যাকস জ্যাক
  3. হৃদয় জ্যাক
  4. হীরা জ্যাক (সর্বনিম্ন)

আরও ব্যাখ্যায় আমি তাদের এখানে নিযুক্ত নম্বরগুলির সাথে উল্লেখ করব।

আপনি মনে রাখবেন যে জ্যাক্স থেকে আপনার হাতে থাকা কোনও ধরণের ফ্যাক্টর রয়েছে যা গেমের মূল্যের অংশ? গ্রেট! আপনি এটি কিভাবে পাবেন তা এখানে:

এই জ্যাক ফ্যাক্টরটি যথাক্রমে শীর্ষ জ্যাকের সংখ্যা (উপরে ক্রমটি দেখুন) এবং আরও 1 রয়েছে So সুতরাং আপনার যদি সমস্ত 4 টি জ্যাক থাকে তবে এটি 4 + 1 = 5 you 3।

বিকল্পভাবে, জিনিসগুলিকে কিছুটা জটিল করার জন্য, জ্যাক ফ্যাক্টরটি অনুপস্থিত যে ক্রম অনুসারে শীর্ষ জ্যাকের সংখ্যাও হতে পারে , এবং আরও 1। সুতরাং আপনি যদি প্রথমটি অনুপস্থিত থাকেন তবে এটি 1 + 1 = ২ হয় যদি আপনি তিনি প্রথম 3 অনুপস্থিত, এটি 3 + 1 = 4 above উপরের নম্বরটি ব্যবহার করে এখানে কয়েকটি উদাহরণ রয়েছে:

[1, 4] -> 1 + 1 = 2
[1, 2, 4] -> 2 + 1 = 3
[2, 3, 4] -> 1 + 1 = 2
[1, 2, 3, 4] -> 4 + 1 = 5
[] -> 4 + 1 = 5

এটিই ছিল প্রথম ফ্যাক্টর। আপনি কীভাবে দ্বিতীয়বার পাবেন:

ট্রাম্প স্যুট ফ্যাক্টর

এই এক অনেক সহজ। দ্বিতীয় ফ্যাক্টরটি ট্রাম্প স্যুট দ্বারা নির্ধারিত হয় যা একক খেলোয়াড় নিম্নলিখিত ম্যাপিং ব্যবহার করে চয়ন করে:

Clubs    -> 12
Spades   -> 11
Hearts   -> 10
Diamonds ->  9

এটা সহজ ছিল, তাই না?

গেমের মান

গেমের মান দুটি কারণের পণ্য। খুব সহজে আপনি ভাবেন? ভুল! জ্যাক-ফ্যাক্টরটি স্থির হওয়ার পরেও স্যুট-ফ্যাক্টরটি নয়। ট্রাম্প হিসাবে আপনি যে মামলাটি শেষ করেছেন তা আপনার হাতে ট্রাম্পের পরিমাণ এবং আপনার নন-ট্রাম্প কার্ডের মানের উপর নির্ভর করে। ভাল হাত কেমন দেখাচ্ছে তা বোঝাতে এটি খুব জটিল হয়ে উঠবে, সুতরাং আপনি নীচের অ্যালগরিদমটি ব্যবহার করবেন:

দ্য ট্রাম্প-ডু-আই-পিক অ্যালগরিদম

আপনাকে বিডিতে অংশ নিতে হবে না। আপনি যদি সিদ্ধান্ত নেন যে আপনার হাতটি একক খেলতে খুব খারাপ, আপনি কেবল পাস করতে পারেন। খেলতে সক্ষম হওয়ার জন্য আপনার হাতটি অবশ্যই নিম্নলিখিত মানদণ্ডের সাথে মেলে:

  • কমপক্ষে 6 টি ট্রাম্প কার্ড (ট্রাম্পের স্যুটগুলির কার্ডগুলি আপনি + জ্যাকের সংখ্যাটি বেছে নিন) রাখুন। যদি এটি একাধিক মামলাগুলির পক্ষে সম্ভব হয় তবে এটি বেছে নিন যার ফলে আরও ট্রাম্প কার্ড তৈরি হবে। যদি এখনও কোনও টাই থাকে, তবে উপরে বর্ণিত সর্বাধিক রেটিং সহ স্যুটটি চয়ন করুন।

  • নন-ট্রাম্প কার্ডগুলির মধ্যে কমপক্ষে 1 টি এস।

যদি আপনার হাত এই দুটি মানদণ্ডের সাথে মেলে না, আপনি পাস করবেন। যদি এটি হয়, আপনি গণনা করা গেমের মান এবং নির্বাচিত ট্রাম্প স্যুট আউটপুট পাবেন।

সংক্ষিপ্ত দ্রষ্টব্য: অবশ্যই এটি একটি খুব সরলিকৃত অ্যালগরিদম। আমরা কখনই এর মতো চ্যালেঞ্জের মুখোমুখি হতে পারি না সেহেতু হাত বিচার করার ক্ষেত্রে অনেক কৌশল এবং অভিজ্ঞতা রয়েছে।

ইনপুট

প্রতিটি কার্ডের একটি অনন্য শনাক্তকারী থাকে। প্রথম অংশটি হ'ল স্যুট ( সি লাবস, এস প্যাডস, এইচ আর্টস, ডি আইমন্ডস), দ্বিতীয় অংশটি মানটি যা এই ম্যাপিংয়ের দ্বারা দেওয়া হয়েছে:

Ace -> A
King -> K
Queen -> Q
Jack -> J
10 -> 0
9 -> 9
8 -> 8
7 -> 7

উভয় অংশ মিলিত একটি কার্ড। মানটি প্রথমে আসে, তারপরে স্যুট আসে। আপনি যে কোনও বিন্যাসে কার্ডগুলি নিতে চান তা নিতে পারেন।

আউটপুট

যদি হাতটি খেলতে সক্ষম হয় তবে গেমের মান এবং বাছাই করা ট্রাম্প স্যুট আউটপুট করুন (অর্ডার কোনও ব্যাপার নয়)। যদি এটি না হয় তবে আউটপুট "পাস" করুন।

বিধি

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

Testcases

পরীক্ষার ক্ষেত্রে ইনপুটটি 2-চর স্ট্রিংগুলির একটি তালিকা হবে।

1. ["JC", "JS", "JD", "AC", "KC", "9C", "AS", "7H", "QD", "8D"] -> 36 Clubs
2. ["JD", "AS", "0S", "KS", "QS", "9S", "8S", "AD", "8C", "9C"] -> 44 Spades
3. ["JH", "JD", "0S", "KS", "9C", "8C", "QH", "KH", "AD", "9D"] -> pass
4. ["JD", "AS", "KS", "QS", "0S", "9S", "8D", "7D", "0C", "QH"] -> pass

ব্যাখ্যা:

  1. ট্রাম্প হিসাবে ক্লাবগুলির সাথে পরপর দুটি জ্যাক। সুতরাং গেমটির মান 3 x 12 = 36
  2. ট্রাম্প হিসাবে স্পেডসের সাথে একের পর এক তিন জ্যাক নিখোঁজ। সুতরাং গেমটির মান 4 x 11 = 44
  3. ট্রাম্প কার্ডের সর্বাধিক 4 টি সম্ভব, সুতরাং আপনি পাস করবেন।
  4. স্পেডস সহ ছয়টি ট্রাম্প কার্ড কিন্তু কোনও ট্রাম্প নন-ট্রাম, তাই আপনি পাস করবেন।

কিছু নিয়ম যদি অস্পষ্ট থাকে তবে এগিয়ে যান এবং মন্তব্য করুন। আমি এই গেমটি নিয়ে বড় হয়েছি, তাই আমি যদি সমস্ত কিছু বিশদভাবে বর্ণনা করি তবে বিচার করা আমার পক্ষে কঠিন hard

এবং এখন ... শুভ কোডিং!

সম্পাদনা করুন: মন্তব্যগুলিতে আমাকে যেমন উল্লেখ করা হয়েছে (আইস্যাকের ধন্যবাদ), সেখানে একটি নিয়ম রয়েছে যা 4 জ্যাকের পরে নীচের শীর্ষস্থানীয় ট্রাম্পগুলিকে "জ্যাক-ফ্যাক্টর" এর মধ্যে গণনা করে যাতে এটি 11 পর্যন্ত যেতে পারে this এবং লোককে বিভ্রান্ত না করার জন্য, আমি যে নিয়মগুলি প্রস্তাব করেছি মূলত সেগুলি যেমন থাকবে তেমন থাকবে। সুতরাং সর্বোচ্চ ফ্যাক্টরটি 5 এ থাকে।


6
প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম - প্রথম প্রথম চ্যালেঞ্জ! :)
ডুরকনব

1
স্ট্রেট জ্যাক / নিখোঁজ জ্যাকের সংখ্যাটিতেও শীর্ষ স্যুট ট্রাম্পগুলি ক্রমানুসারে অন্তর্ভুক্ত করা উচিত? উইকিপিডিয়া এখানে
21

@ আইসাকজি আমাকে স্বীকার করতে হবে যে আমি এখন পর্যন্ত এই বিধি সম্পর্কে জানতাম না। যে ইশারা জন্য ধন্যবাদ। আমি কিছু গবেষণা করেছি এবং তুমি সত্যই বলেছিলে। আমার পরিবারে আমরা এই নিয়মটি নিয়ে খেলি না এবং যারা এটির সাথে খেলেছে আমি তার সাথেও দেখা করি নি। এটির উচ্চ প্রাসঙ্গিকতা নেই, কারণ আপনার যখন এমন হাত থাকে, আপনি বেশিরভাগ সময় গ্র্যান্ড খেলবেন যা যাইহোক আলাদা গণনা করা হয়। সুতরাং এই চ্যালেঞ্জের জন্য আমরা কেবল আমার প্রস্তাবিত বিধিগুলি নিয়েই থাকব। আমি আমার পোস্টটি সম্পাদনা করব তাই এটি সবার কাছে পরিষ্কার।
ডেনকার

1
@ ডেনারএফে, আমি বহু বছর ধরে জার্মানির একটি ক্লাবে স্কট খেলি, এবং আমার উপর বিশ্বাস রাখি, এই নিয়মটি গুরুত্বপূর্ণ, এবং এমন ঘটনাও রয়েছে যেখানে এটি অত্যন্ত প্রাসঙ্গিক (এবং হ্যাঁ, বেশিরভাগ অ-গুরুতর খেলোয়াড়ের মধ্যে এটি অজানা)। বিশেষত অনুপস্থিত পক্ষের সাথে - কল্পনা করুন যে আপনার কাছে ট্রাম্প কে, ডি, 9, 8, 7 এবং তিনটি এবং অন্য 10 টি অন্যান্য রঙ রয়েছে। আপনার গ্র্যান্ড নিশ্চিত হয়ে মারা যায়, তবে আপনি 'ওহনে 6' খেলতে পারেন (কিছু বিপরীতে সংগ্রহ করুন) এবং বিট থেকে বি কীভাবে বসে আছেন তা আপনার ধারণা আছে তা ধরে নিয়ে তাদের মারধর করতে পারেন। এবং সেই কার্ডটি দিয়ে সূর্য না আসা পর্যন্ত আপনি বিড করতে পারেন।
আগানজু

@ আগানজু আমি ইতিমধ্যে ধরে নিয়েছি যে এই নিয়মটি বেশিরভাগ শখের খেলোয়াড়দের জানা নেই। নিশ্চিত করার জন্য ধন্যবাদ. আমি সন্দেহ করি না যে এটি গুরুত্বপূর্ণ, তবে আমার অভিজ্ঞতা থেকে এই হাতগুলি খুব বিরল, তাই নিয়মটি প্রায়শই কার্যকর হয় না।
ডেনকার

উত্তর:


1

পাইথন 2, উদাহরণস্বরূপ বাস্তবায়ন

যেহেতু এখনও কোনও জমা নেই, তাই পাইথনে আমি একটি উদাহরণ প্রয়োগ লিখেছিলাম। ইনপুট ফর্ম্যাট চ্যালেঞ্জের টেস্টকেসের মতো same

সম্ভবত এটি আপনাকে লোকদের যেতে যেতে অনুপ্রাণিত করে, এটি এতটা কঠিন নয় :)

def gameValue(hand):
    jacks = ""
    suits = {"C" : 0, "S" : 0, "H" : 0, "D" : 0}
    # Loop through the hand, find all jacks and count the cards of each suit
    for card in hand:
        jacks += card[1] if "J" in card else ""
        suits[card[1]] += 1 if card[0] != "J" else 0

    # Map the Jacks to numbers while 1 is the highest (Clubs) then sort them ascending
    jacks =  sorted(map(lambda j: {"C" : 1, "S" : 2, "H" : 3, "D" : 4}[j], list(jacks)))

    # Sort the suits by amount. Highest amount and value is first after that
    suits = sorted(suits.items(), key = lambda suit: suit[1], reverse = True)
    trumpSuit = suits[0][0];
    # Amount of trumps is jack-count plus trumpsuit-count
    trumpCount = len(jacks) + suits[0][1];

    # Check for at least one ace that is no trump
    hasAce  = len(filter(lambda c: c[0] == "A" and c[1] != trumpSuit, hand)) >= 1

    # If the hand  is playable, calculate jack-factor and output the result, otherwise pass
    if trumpCount >= 6 and hasAce:
        # If there no jacks the factor is 5. If there are, find the first gap
        if len(jacks) > 0:
            lastJack = 0
            for jack in jacks:
                if jack - lastJack >= 2:
                    break
                lastJack = jack

            jackFactor = jacks[0] if lastJack == 0 else lastJack + 1
        else:
            jackFactor = 5

        trumpFactor = {"C" : 12, "S" : 11, "H" : 10, "D" : 9}[suits[0][0]]
        print str(trumpFactor * jackFactor) + " " + {12 : "Clubs", 11 : "Spades", 10 : "Hearts", 9 : "Diamonds"}[trumpFactor]
    else:
        print "pass"

0

জাভা, 256 বাইট

h->{int i,j=1,m=0,t,n=0,a[]=new int[8];for(var c:h){t=c[1]-48;if(c[0]==74){j+=1<<t;n++;}else{m+=i=c[0]==65?1:0;a[--t+4]+=i;a[t]++;}}for(i=t=0;i<4;i++)t=a[i]<a[t]?t:i;return a[t]+n<6|m-a[t+4]<1?"p":(t+++9)*(5-(int)(Math.log(j>7?~j&7:j)/Math.log(2)))+" "+t;}

বিন্যাসে চরিত্র বিন্যাসের একটি অ্যারে হিসাবে ইনপুট লাগে A4, যেখানে 4হয় ক্লাব , 3হয় ইস্কাপন , 2হয় হার্টস এবং 1হয় শাড়ি । আউটপুট হয় 36 4তুরুপের মামলা দিয়ে 36 এর একটি বিড জন্য ক্লাব , pপাসিং জন্য।

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

অবরুদ্ধ সংস্করণ:

h -> { // lambda taking a char[][] as argument and returning a String
    int i,                // used as a loop variable and as a temporary variable
        j = 1,            // variable storing the jacks present in the hand in its four last-to-least significant bits
        m = 0,            // number of aces in the hand
        t,                // used as a temporary variable at first, later stores the trump suit
        n = 0,            // number of jacks in the hand
        a[] = new int[8]; // in the lower 4 indices, stores the number of non-jack cards present in the hand for each suit; in the higher 4 indices, stores the number of aces present in the hand for each suit (0 or 1)

    for(var c : h) {   // loop over all the cards in the hand
        t = c[1] - 48; // determine the suit of the current card; 48 is the ASCII code for '0'
        if(c[0] == 74) { // if it's a jack; 74 is the ASCII code for 'J'
            j += 1 << t; // set the corresponding bit
            n++;         // and increment the total number of jacks
        } else {                             // if it's not a jack
            m += (i = (c[0] == 65 ? 1 : 0)); // increment the total number of aces if it's an ace (65 is the ASCII code for 'A')
            a[ --t + 4] += i;                // increment the number of aces for this suit if it's an ace
            a[t]++;                          // increment the number of non-jack cards for this suit
        }
    }

    for(i = t = 0; i < 4; i++)     // loop over the suits ...
        t = (a[i] < a[t]) ? t : i; // ... and find the one with the most cards, giving priority to higher-valued suits in case of a tie

    return (a[t] + n < 6) |                                             // if there are less than 6 trump cards
           (m - a[t + 4] < 1) ?                                         // or less than 1 non-trump ace
           "p"                                                          // return "p" to pass on the hand
           :                                                            // else return
           ((t++ + 9) *                                                 // the value of the trump suit (and increment the trump suit for output later)
           (5 - (int) (Math.log((j > 7) ? (~j & 7) : j) / Math.log(2))) // times the jack factor
           + " " + t);                                                  // followed by the trump suit
}

0

সি, 235 বাইট

f(char*h){int i,j=1,m=0,t,n=0,a[8]={0};for(;*h;h+=2){t=h[1]-48;if(*h-74){m+=i=*h==65;a[--t+4]+=i;a[t]++;}else{j+=1<<t;n++;}}for(i=t=0;i<4;i++)t=a[i]<a[t]?t:i;printf(a[t]+n<6|m-a[t+4]<1?"p":"%d %d",(t+9)*(5-(int)log2(j>7?~j&7:j)),t+1);}

আমার জাভা উত্তর পোর্ট ।

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

বিন্যাসে অক্ষরের একটি অ্যারে হিসাবে ইনপুট লাগে A4, যেখানে 4হয় ক্লাব , 3হয় ইস্কাপন , 2হয় হার্টস এবং 1হয় শাড়ি । আউটপুট হয় 36 4তুরুপের মামলা দিয়ে 36 এর একটি বিড জন্য ক্লাব , pপাসিং জন্য।

অবরুদ্ধ সংস্করণ:

f(char* h) { // function taking an array of characters as argument (and implicitly returning an unused int)
    int i,          // used as a loop variable and as a temporary variable
        j = 1,      // variable storing the jacks present in the hand in its four last-to-least significant bits
        m = 0,      // number of aces in the hand
        t,          // used as a temporary variable at first, later stores the trump suit
        n = 0,      // number of jacks in the hand
        a[8] = {0}; // in the lower 4 indices, stores the number of non-jack cards present in the hand for each suit; in the higher 4 indices, stores the number of aces present in the hand for each suit (0 or 1); partially initialized to zero, the compiler will do the rest

    for(; *h; h += 2) { // loop over all the cards in the hand
        t = h[1] - 48;  // determine the suit of the current card; 48 is the ASCII code for '0'
        if(*h - 74) {              // if it's not a jack; 74 is the ASCII code for 'J'
            m += (i = (*h == 65)); // increment the total number of aces if it's an ace (65 is the ASCII code for 'A')
            a[ --t + 4] += i;      // increment the number of aces for this suit if it's an ace
            a[t]++;                // increment the number of non-jack cards for this suit
        } else {         // if it's a jack
            j += 1 << t; // set the corresponding bit
            n++;         // and increment the total number of jacks
        }
    }

    for(i = t = 0; i < 4; i++)   // loop over the suits ...
        t = a[i] < a[t] ? t : i; // ... and find the one with the most cards, giving priority to higher-valued suits in case of a tie

    printf( (a[t] + n) < 6 |                             // if there are less than 6 trump cards
            (m - a[t + 4] < 1) ?                         // or less than 1 non-trump ace
            "p" : "%d %d",                               // print "p" to pass on the hand, else print two numbers
            (t + 9) *                                    // first the value of the trump suit ...
            (5 - (int) log2((j > 7) ? (~j & 7) : j)),    // ... times the jack factor,
            t + 1                                     ); // followed by the trump suit
}

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