একটি 5 কার্ড পোকার হাত উপস্থাপন করুন


11

কার্ডের একটি ডেকে 52. একটি হাত 52 টি থেকে 5 কার্ড (ডুপ্লিকেট থাকতে পারে না)।

5 টি কার্ডের হাতের প্রতিনিধিত্ব করতে বিটসের সর্বনিম্ন পরিমাণ কীভাবে এবং কীভাবে?
একটি হাত নির্ভর আদেশ নয় (কে কিউ = কিউ)) 64329 = 96432

হ্যাঁ, 52 বিট ব্যবহার করতে পারেন। যে কোনও কার্ডের একটি হাত উপস্থাপন করতে পারে।

একটি হাত দেওয়া হ'ল ৫ টি কার্ডের পক্ষে এটির পক্ষে 52 টিরও কম বিট উপস্থাপন করার উপায় রয়েছে।

একটি একক কার্ড 6 বিট = 64 দিয়ে প্রতিনিধিত্ব করা যেতে পারে। সুতরাং 6 বিট * 5 কার্ড = 30 বিট ব্যবহার করতে পারে। তবে সেটি অর্ডার নির্ভর। আমি ঠিক বাছাই করতে পারি এবং এটি কাজ করা উচিত। যদি এটি কাজ না করে তবে আমাকে জানান let

32 বিট বা এর নিচে কীটি পাওয়ার কোনও উপায় আছে এবং 5 টি কার্ড টিপলকে বাছাই করতে হবে না।

এটি জুজু সিমুলেশনের জন্য এবং বাছাই করা কেবলমাত্র হাত তৈরির তুলনায় অনেক বেশি ওভারহেড হবে। যদি আমার প্রতিটি হাতের আপেক্ষিক মানের সাথে অভিধান থাকে তবে এটি দুটি সহজ চেহারা এবং দুটি হাতের মানের তুলনা করার জন্য একটি তুলনা। আমি যদি প্রথমে হাতগুলি বাছাই করতে পারি তবে এটি দুটি লকআপ এবং তুলনার তুলনায় বড়। একটি সিমুলেশন মিলিয়ন তুলনা করা হবে। সিমুলেশন থেকে আমি বাছাই করা হাত পাব না। সাজানো 52 51 50 49 47 এর আগে 52 51 50 49 48 এর মতো সহজ নয় You আপনার সরাসরি ফ্লাশ কোয়াড থাকতে পারে ....

2598960 সম্ভাব্য 5 কার্ড হাত রয়েছে। এটি সারি সংখ্যা। কীটি হ'ল 5 টি কার্ড। আমি 32 টি বিট বা যেখানে কার্ডগুলি প্রথমে বাছাই করার প্রয়োজন নেই তার নীচে একটি চাবি পেতে চাই।

যত হাত বেঁধে দেওয়া হয়েছে কেবল তালিকার অর্ডার করতে পারি না। স্যুট হ'ল কোদাল, ক্লাব, হীরা এবং হৃদয়। 7 সি 8 সি 2 ডি 3 ডি 4 এস = 7 এস 8 এস 2 সি 3 সি 4 ঘন্টা। এখানে প্রচুর সংযোগ রয়েছে।

পরবর্তী পদক্ষেপটি b৪ বিট এবং কীটির আকারের দ্বিগুণ হওয়ার পরিবর্তে বাছাইয়ের হিট নেবে।

আমি SortedSet<int> quickSort = new SortedSet<int>() { i, j, k, m, n };অপারেশনের সময় পরীক্ষা করেছি এবং দ্বিগুণ করেছি তবে আমি এখনও এটি করতে পারি।

এটি আরও জটিল হয়। আমার পাঁচটা (22255) এরও বেশি হিসাবে একটি নৌকার প্রতিনিধিত্ব করতে সক্ষম হওয়া দরকার। সুতরাং তাদের বাছাই যে বিরতি। আমি জানি আপনি বলতে যাচ্ছেন তবে তা দ্রুত। হ্যাঁ এটি দ্রুত এবং তুচ্ছ কিন্তু আমার যত দ্রুত সম্ভব প্রয়োজন।

গৃহীত উত্তরের জন্য সি #

private int[] DeckXOR = new int[] {0x00000001,0x00000002,0x00000004,0x00000008,0x00000010,0x00000020,0x00000040,
                                    0x00000080,0x00000100,0x00000200,0x00000400,0x00000800,0x00001000,0x00002000,
                                    0x00004000,0x00008000,0x00010000,0x00020000,0x00040000,0x00080000,0x00100000,
                                    0x00200000,0x00400000,0x00800000,0x01000000,0x02000000,0x04000000,0x07fe0000,
                                    0x07c1f000,0x0639cc00,0x01b5aa00,0x056b5600,0x04ed6900,0x039ad500,0x0717c280,
                                    0x049b9240,0x00dd0cc0,0x06c823c0,0x07a3ef20,0x002a72e0,0x01191f10,0x02c55870,
                                    0x007bbe88,0x05f1b668,0x07a23418,0x0569d998,0x032ade38,0x03cde534,0x060c076a,
                                    0x04878b06,0x069b3c05,0x054089a3};
public void PokerProB()
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    HashSet<int> cardsXOR = new HashSet<int>();
    int cardXOR;
    int counter = 0;
    for (int i = 51; i >= 4; i--)
    {
        for (int j = i - 1; j >= 3; j--)
        {
            for (int k = j - 1; k >= 2; k--)
            {
                for (int m = k - 1; m >= 1; m--)
                {
                    for (int n = m - 1; n >= 0; n--)
                    {
                        counter++;
                        cardXOR = DeckXOR[i] ^ DeckXOR[j] ^ DeckXOR[k] ^ DeckXOR[m] ^ DeckXOR[n];
                        if (!cardsXOR.Add(cardXOR))
                            Debug.WriteLine("problem");
                    }
                }
            }
        }
    }
    sw.Stop();
    Debug.WriteLine("Count {0} millisec {1} ", counter.ToString("N0"), sw.ElapsedMilliseconds.ToString("N0"));
    Debug.WriteLine("");
}

4
একটি হ্যান্ড-কোডেড বাছাই করা অ্যালগরিদম ব্যবহার করুন যা দৈর্ঘ্যের 5 তালিকা বাছাইয়ের জন্য কাজ করে আপনি বর্তমানে যে লাইব্রেরি ফাংশনটি ব্যবহার করছেন তার চেয়ে এটি সম্ভবত দ্রুত।
যুবাল ফিল্মাস

1
আপনি কেন "বাছাই করা সহজ নয়" তা আমি বুঝতে পারি না । বাছাই করা সহজ - প্রতিটি কার্ডকে 1 থেকে 52 এ সংখ্যায় রূপান্তর করুন, যাতে কার্ডটি কার্ডের একটি দৈর্ঘ্যের (5 দৈর্ঘ্যের) দ্বারা উপস্থাপিত হয়। তালিকাটি বাছাই করুন। ইউভাল যেমন উল্লেখ করেছেন তেমন 5 টি পূর্ণসংখ্যার একটি তালিকা বাছাইয়ের সমস্যাটি যা খুব দ্রুত করা যায়। আমি প্রস্তাব দিচ্ছি যে এটি খুব ধীর গতিতে ধরে নেওয়ার আগে আপনি পরিমাপ করবেন তবে আমার ধারণা এই যে তালিকাটি বাছাই করা খুব দ্রুত হবে এবং ক্যাশে আঘাত হানে না এমন এলোমেলো অ্যাক্সেস মেমরির চেয়েও দ্রুত হতে পারে।
DW

@ ডিডাব্লু হ্যাঁ বাছাই করা সহজ তবে আমি যা করছি (কয়েক মিলিয়ন বার) সহজ is আমি পরীক্ষা করেছি এবং একটি সাজানোর সময় দ্বিগুণ হয়।
পাপারাজ্জো

1
@ পাপারাজ্জি না, ইউভাল আপনাকে নিজের নিজস্ব বাছাই করার রুটিন লিখতে বলছেন যা বিশেষত ১ থেকে ৫২ এর মধ্যে পাঁচটি সংখ্যা বাছাই করার জন্য সুরযুক্ত। Quicksort সংক্ষিপ্ত তালিকাগুলি এটিকে খুব অকার্যকর করে তোলে।
ডেভিড রিচার্বি

অনুশীলনে, বেশিরভাগ আইটেমগুলি <= 16 বিট নাও 32 বিট হতে পারে। সুতরাং যেহেতু আপনার কমপক্ষে 23 বিট দরকার, কোনও এনকোডিং যা <= 32 বিট ব্যবহার করে তা সম্ভবত ব্যবহার্য। তুচ্ছ 6 টি বিট কার্ড প্রতি * 5 কার্ড এনকোডিং যথেষ্ট ভাল কাজ করে। একটি সতর্কতা রয়েছে: একটি 32 বিট অ্যারে সূচক তুলনায় একটি 23 বিট অ্যারে সূচক better
এমসাল্টারস

উত্তর:


10

C[52,25,11]C27×521152A1,,A52Ai271100a,b,c,d,eAaAbAcAdAeH1,H2102|H1H2|10

বব জেনকিনস তার সাইটে এই জাতীয় কোড বর্ণনা করে এবং সে থেকে আমরা অ্যারেটি বের করতে পারি

0x00000001,0x00000002,0x00000004,0x00000008,0x00000010,0x00000020,0x00000040,
0x00000080,0x00000100,0x00000200,0x00000400,0x00000800,0x00001000,0x00002000,
0x00004000,0x00008000,0x00010000,0x00020000,0x00040000,0x00080000,0x00100000,
0x00200000,0x00400000,0x00800000,0x01000000,0x02000000,0x04000000,0x07fe0000,
0x07c1f000,0x0639cc00,0x01b5aa00,0x056b5600,0x04ed6900,0x039ad500,0x0717c280,
0x049b9240,0x00dd0cc0,0x06c823c0,0x07a3ef20,0x002a72e0,0x01191f10,0x02c55870,
0x007bbe88,0x05f1b668,0x07a23418,0x0569d998,0x032ade38,0x03cde534,0x060c076a,
0x04878b06,0x069b3c05,0x054089a3

252271=2251


আমি ঠিক অনুসরণ করি না। একটি হাত জন্য এই কত বিট প্রয়োজন?
পাপারাজ্জো

এটি 27 বিট প্রয়োজন। আপনি যে কোনও বড় সংখ্যক বিট ব্যবহার করতে পারেন।
যুবাল ফিল্মাস

ধন্যবাদ। আমি পরীক্ষা করেছি এবং সংখ্যাগুলি অনন্য এবং <= 32 বিট। আমি নম্বর থেকে 5 টি কার্ড পেতে পারি? ঠিক না হলে শুধু জিজ্ঞাসা।
পাপারাজ্জো

হ্যাঁ, এটি সরল রৈখিক বীজগণিত। 52 টি দৈর্ঘ্যের ভেক্টর 5 টি দিয়ে ফিরে পেতে আপনি সঠিক ম্যাট্রিক্স ব্যবহার করতে পারেন। আমি আপনাকে এটি খুঁজে বের করতে দেব।
যুবাল ফিল্মাস

13

nlgnlg2598960=22

উপস্থাপনা কীভাবে কাজ করে? বিভিন্ন ট্রেড অফস সহ বিভিন্ন বিকল্প রয়েছে। আমি নীচে দুটি তালিকা।

হার্ড-কোডেড অভিধান dictionary

এই ক্ষেত্রে, সম্ভাব্য 5-কার্ড হাতের সংখ্যা যথেষ্ট ছোট যে আপনার কাছে কেবল একটি হার্ড কোডিং ডিকশনারি থাকতে পারে যা সমস্ত 2598960 হাতের তালিকা করে এবং আপনি অভিধানে এর সূচী দ্বারা একটি হাত উপস্থাপন করেন (বাইনারিতে উপস্থাপিত)।

অন্য কথায়, অভিধানটি হাতের বাছাই করা তালিকা হতে পারে। প্রতিটি হাতটি হ'ল কার্ডের 5-টি tuple সাজানো ক্রমে। আপনি বাইনারি অনুসন্ধান ব্যবহার করে অভিধানে একটি হাত সন্ধান করতে পারেন এবং এর সাথে সম্পর্কিত সূচকটি খুঁজে পেতে পারেন; এবং একটি সূচক দেওয়া, আপনি অনুরূপ হাত খুঁজে পেতে পারেন। অথবা, আপনি অভিধানটিকে হ্যাশম্যাপ হিসাবে সংরক্ষণ করতে পারেন যা হাত থেকে মানচিত্রের সূচকগুলিতে মানচিত্র করে। সূচকটি 0 এবং 2598959 এর মধ্যে একটি পূর্ণসংখ্যা, তাই এটি 23 বিট ব্যবহার করে উপস্থাপন করা যেতে পারে।

এই পদ্ধতির কাজ করা হবে এবং প্রোগ্রামের পক্ষে খুব সহজ হবে, তবে এটি স্থানের অপব্যয় (প্রোগ্রামের নির্বাহযোগ্য আকার)।

রাঙ্কিং / unranking

বিকল্পভাবে, যদি আপনি যত্ন নেন তবে আরও ভাল পদ্ধতি রয়েছে। উদাহরণস্বরূপ, নিম্নলিখিত যে কোনও রেফারেন্স দেখুন:

সাধারণ বিষয়টিকে "সম্মিলনের র‌্যাঙ্কিং (এবং আনারঙ্কিং)" হিসাবে পরিচিত। এগুলি প্রয়োগ ও বোঝার জন্য আরও কিছুটা জটিল, তবে প্রোগ্রামটিতে একটি হার্ড-কোডেড ডিকশনারি অন্তর্ভুক্ত করার প্রয়োজনীয়তা এড়ানো উচিত।


আমি প্রশ্ন আপডেট করব। হ্যাঁ 2598960 হাত রয়েছে। অভিধানটিতে অনেকগুলি সারি থাকবে। আমার সমস্যাটি মূল প্রজন্মের। 5 টি কার্ড থেকে অভিধান সন্ধানের জন্য একটি কী তৈরি করতে হবে।
পাপারাজ্জো

@Paparazzi, যদি আপনি পদ্ধতির অভিধান ব্যবহার, হাতে হয় কী। অন্য কথায়, কীটি হ'ল কার্ডগুলির 5-টিপল (সাজানো ক্রমে)। অভিধানটি কী হিসাবে ব্যবহার করে হ্যাশটেবল হিসাবে সংরক্ষণ করা যেতে পারে। আপনি যদি কোনও অভিধানের মেমরির ব্যয় পছন্দ না করেন তবে বিকল্প পদ্ধতিটি ব্যবহার করুন: র‌্যাঙ্কিং / আনরঙ্কিং।
DW

হ্যাঁ আমি জানি আমি বাছাই করলে 30 টি বিটের কী পেতে পারি। আমি ভাবছি যে 5 টি কার্ড টিউপল বাছাই না করে কী 32 বিট বা তার চেয়ে কম পাওয়ার কোনও উপায় আছে কিনা? আমি র‌্যাঙ্ক এবং র‌্যাঙ্কিংয়ে যাব।
পাপারাজ্জো

আমি র‌্যাঙ্কিং / আনরেঙ্কিং অনুসরণ করি না তবে ধন্যবাদ। আমি চেষ্টা করে দেখব বন্ধনের সম্ভাবনাও রয়েছে। প্রচুর বন্ধন আছে।
পাপারাজ্জো

1
এছাড়াও প্রাসঙ্গিক: cs.stackexchange.com/questions/67664/…
ছদ্মনাম

3

আপনি পাঁচটি আইটেম বাছাই করতে পারেন এবং একই সাথে কিছু প্রসেসরের তুলনা ছাড়াই নকলগুলি পরীক্ষা করতে পারেন: ধরে নিন যে কোনও প্রসেসরের একটি দ্রুত নির্দেশ রয়েছে যা সর্বোচ্চ বিট সেটটির অবস্থান নির্ধারণ করে এবং একটি দ্রুত নির্দেশ কেবলমাত্র এন-থ্রি বিট সেট সহ একটি সংখ্যা গণনা করে ।

বিট (এন) হ'ল এন-থ বিট সেট সহ একটি নম্বর হোক। সর্বোচ্চ_বিট (x) x = 0 তে একটি অনির্ধারিত মান সহ সর্বাধিক বিটের সংখ্যার যে সংখ্যাটি নির্ধারিত হয় সেটির সংখ্যা হতে দিন x ^ y কে এক্স-এক্স এর একচেটিয়া বা be

হাতের পাঁচটি কার্ডের প্রতিনিধিত্ব করে পাঁচ থেকে একটি, বি, সি, ডি এবং ই দেওয়া প্রতিটি নম্বর দেওয়া হয়েছে।

এক্স = বিট (ক) ^ বিট (বি) ^ বিট (সি) ^ বিট (ডি) ^ বিট (ই) দিন।

যাক এ = সর্বোচ্চ_বিট (এক্স), এক্সকে পরিবর্তন করুন x ^ বিট (এ)।

বি = সর্বোচ্চ_বিট (এক্স), এক্সকে x ^ বিট (বি) এ পরিবর্তন করুন।

সি = সর্বোচ্চ_বিট (এক্স), এক্সকে x ^ বিট (সি) এ পরিবর্তন করুন।

ডি = সর্বোচ্চ_বিট (এক্স), এক্সকে x ^ বিট (ডি) এ পরিবর্তন করুন।

E = সর্বোচ্চ_বিট (এক্স) দিন।

যদি x = 0 হয় তবে অ, বি, সি, ডি এবং ই সংখ্যাগুলিতে সদৃশ ছিল। অন্যথায়, হাতের এনকোডিং হিসাবে A * বিট (24) + বি * বিট (18) + সি * বিট (12) + ডি * বিট (6) + E ব্যবহার করুন, যেখানে A, B, C, D এবং E রয়েছে উপরে হিসাবে সংজ্ঞায়িত। খুব দক্ষ উপায়ে বাছাই করার সময় এটি একটি হাতকে 30-বিট স্ট্রিং হিসাবে এনকোড করে।


এটি 52 বিট ব্যবহার করে?
পাপারাজ্জো

@ পাপারাজ্জি, না। শেষ অনুচ্ছেদে আরও একবার দেখুন। আরও বৃহত্তর স্পষ্টতা দেওয়ার চেষ্টা করার জন্য আমি এটি সম্পাদনা করেছি।
DW

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