Bir kart destesi 52'dir. Bir el 52 karttan 5 karttır (kopya olamaz).
5 kartlı bir eli temsil edecek en az bit sayısı nedir ve nasıl?
Bir el siparişe bağlı DEĞİLDİR (KQ = QK). 64329 = 96432
Evet, 52 bit kullanabilir. Bu, herhangi bir sayıda kartın elini temsil edebilir.
Bir elin tam olarak 5 kart olduğu göz önüne alındığında, 52 bit'ten az ile onu temsil etmenin bir yolu vardır.
Tek bir kart 6 bit = 64 ile temsil edilebilir. Bu yüzden sadece 6 bit * 5 kart = 30 bit kullanabilirsiniz. Ancak bu düzene bağlı olacaktır. Sadece sıralayabilirim ve bu işe yaramalı. Bu işe yaramazsa lütfen bana bildirin.
32 bit veya daha düşük bir anahtar almak için bir yol var mı ve 5 kart demet sıralamak zorunda değilsiniz.
Bu poker simülasyonları içindir ve sıralama sadece eli üretmeye kıyasla çok fazla yük olurdu. Her elin göreceli değeri olan bir sözlüğüm varsa, iki basit arama ve iki elin değerini karşılaştırmak için bir karşılaştırma. Önce iki sıralamaya ve bir karşılaştırmaya kıyasla büyük olan elleri sıralamam gerekiyorsa. Bir simülasyonda milyonları karşılaştıracağız. Simülasyondan el ele geçirilmeyeceğim. Sıralama 52 51 50 49 48 gibi 52 51 50 49 48 gibi basit değil. Düz floş dörtlü olabilir ....
2598960 olası 5 kart eli vardır. Sıra sayısı budur. Anahtar 5 karttır. 32 bit veya kartların önce sıralanmasına gerek olmayan bir anahtar almak istiyorum.
Sadece el kravat olarak listeyi sipariş edemezsiniz. Takım elbise maça, kulüp, elmas ve kalp. 7c 8c 2d 3d 4s = 7s 8s 2c 3c 4h. Çok sayıda bağ var.
Bir sonraki adım 64 bittir ve anahtarın boyutunu iki kat yerine sıralamanın ismini alacaktır.
SortedSet<int> quickSort = new SortedSet<int>() { i, j, k, m, n };
İşlem süresini test ettim ve iki katına çıkardım ama yine de yapabilirim.
Daha karmaşık hale geliyor. Bir tekneyi beş üzerinden iki kez temsil edebilmem gerekiyor (22255). Yani onları ayırmak onu kırar. Söyleyeceğini biliyorum ama bu hızlı. Evet hızlı ve önemsiz ama olabildiğince hızlı ihtiyacım var.
Kabul edilen cevap için 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("");
}