कार्ड का एक डेक 52 है। 52 में से एक हाथ 5 कार्ड है (एक डुप्लिकेट नहीं हो सकता है)।
5 कार्ड हाथ का प्रतिनिधित्व करने के लिए बिट्स की सबसे कम राशि क्या है और कैसे?
एक हाथ आदेश पर निर्भर नहीं है (KQ = QK)। 64329 = 96432
हाँ, 52 बिट्स का उपयोग कर सकते हैं। यह किसी भी संख्या में कार्ड का एक हाथ का प्रतिनिधित्व कर सकता है।
एक हाथ दिया 5 कार्ड बिल्कुल 52 बिट्स से कम का प्रतिनिधित्व करने का एक तरीका है।
एक एकल कार्ड को 6 बिट्स = 64 के साथ दर्शाया जा सकता है। इसलिए केवल 6 बिट्स * 5 कार्ड्स = 30 बिट्स का उपयोग किया जा सकता है। लेकिन यह आदेश पर निर्भर होगा। मैं बस छांट सकता था और यह काम करना चाहिए। अगर वह काम नहीं करेगा तो कृपया मुझे बताएं।
क्या 32 बिट्स या उससे कम की कुंजी प्राप्त करने का कोई तरीका है और 5 कार्ड ट्यूपल को क्रमबद्ध नहीं करना है।
यह पोकर सिमुलेशन के लिए है और छँटाई केवल हाथ पैदा करने की तुलना में बहुत अधिक ओवरहेड होगी। यदि मेरे पास प्रत्येक हाथ के सापेक्ष मूल्य के साथ एक शब्दकोश है तो यह दो सरल लुकअप है और दो हाथों के मूल्य की तुलना करना है। अगर मुझे पहले हाथ को छाँटना है जो दो लुक और तुलना की तुलना में बड़ा है। एक सिमुलेशन में लाखों की तुलना करेंगे। मैं अनुकार से हाथ नहीं मिलाऊंगा। ५२ ५० ५० ४ ९ ४ You से पहले ५२ ५१ ५० ४ ९ ४ before की तरह यह सरल नहीं है। आपके पास सीधे फ्लश क्वाड हो सकते हैं ...।
2598960 संभावित 5 कार्ड हाथ हैं। वह पंक्तियों की संख्या है। कुंजी 5 कार्ड है। मैं एक कुंजी प्राप्त करना चाहता हूं जो कि 32 बिट्स है या जहां कार्ड को पहले सॉर्ट करने की आवश्यकता नहीं है।
सूची को केवल कई हाथों से बाँधने का आदेश नहीं दे सकते। सूट कुदाल, क्लब, हीरा और दिल हैं। 7 सी 8 सी 2 डी 3 डी 4 एस = 7 एस 8 एस 2 सी 3 सी 4 एच। बड़ी संख्या में संबंध हैं।
अगला चरण 64 बिट्स है और कुंजी के आकार को दोगुना करने के बजाय सॉर्ट का हिट लेगा।
मैंने SortedSet<int> quickSort = new SortedSet<int>() { i, j, k, m, n };
ऑपरेशन के समय का परीक्षण किया और युगल किया लेकिन मैं अभी भी कर सकता हूं।
यह अधिक जटिल हो जाता है। मुझे पत्नियों (22255) से अधिक के रूप में एक नाव का प्रतिनिधित्व करने में सक्षम होना चाहिए। इसलिए उन्हें छांटने से वह टूट जाता है। मुझे पता है कि आप कहने जा रहे हैं, लेकिन यह तेज है। हां यह तेज और तुच्छ है लेकिन मुझे जितनी जल्दी हो सके उतनी तेजी से जरूरत है।
स्वीकृत उत्तर के लिए C #:
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("");
}