سؤال

هل هناك regex لحساب يد البوكر المستقيمة؟

أنا أستخدم سلاسل لتمثيل البطاقات المرتبة ، مثل:

AAAAK#sssss = 4 aces and a king, all of spades.
A2345#ddddd = straight flush, all of diamonds.

في Java ، أنا أستخدم هذه regexes:

regexPair = Pattern.compile(".*(\\w)\\1.*#.*");
regexTwoPair = Pattern.compile(".*(\\w)\\1.*(\\w)\\2.*#.*");
regexThree = Pattern.compile(".*(\\w)\\1\\1.*#.*");
regexFour = Pattern.compile(".*(\\w)\\1{3}.*#.*");
regexFullHouse = Pattern.compile("((\\w)\\2\\2(\\w)\\3|(\\w)\\4(\\w)\\5\\5)#.*");
regexFlush = Pattern.compile(".*#(\\w)\\1{4}");

كيفية حساب القيم المستقيمة (التسلسل) مع regex؟

تعديل

أفتح سؤالًا آخر لحل نفس المشكلة ، ولكن باستخدام قيمة ASCII لـ char ، لإعادة أن تكون قصيرة. تفاصيل هنا.

شكرًا!

هل كانت مفيدة؟

المحلول

يجب أن أعترف أن التعبيرات العادية ليست الأداة الأولى التي كنت أفكر فيها للقيام بذلك. يمكنني أن أضمن إلى حد كبير أن يكون أي إعادة قادرة على القيام بذلك بيد غير مصنفة سيكون أكثر بشعة وأقل قابلية للقراءة من الرمز المعادل.

على افتراض أن البطاقات يتم فرزها بالقيمة الاسمية (ويبدو أنها خلاف ذلك ، فإن regexes المدرجة لن تعمل أيضًا) ، وأنت يجب استخدم regex ، أنت استطاع استخدم بناء مثل

2345A|23456|34567|...|9TJQK|TJQKA

للكشف عن جزء القيمة الاسمية من اليد.

في الواقع ، مما أجمعه هنا من اليدين "القياسي" ، يجب فحص ما يلي بترتيب انخفاض الأولوية:

Royal/straight flush: "(2345A|23456|34567|...|9TJQK|TJQKA)#(\\w)\\1{4}"
Four of a kind:       ".*(\\w)\\1{3}.*#.*"
Full house:           "((\\w)\\2\\2(\\w)\\3|(\\w)\\4(\\w)\\5\\5)#.*"
Flush:                ".*#(\\w)\\1{4}"
Straight:             "(2345A|23456|34567|...|9TJQK|TJQKA)#.*"
Three of a kind:      ".*(\\w)\\1\\1.*#.*"
Two pair:             ".*(\\w)\\1.*(\\w)\\2.*#.*"
One pair:             ".*(\\w)\\1.*#.*"
High card:            (none)

في الأساس ، هذه هي نفسها مثل لك باستثناء أنني أضفت Flush Royal/Straight و Trate. شريطة عليك التحقق منها بالترتيب ، يجب أن تحصل على أفضل درجة من اليد. لا يوجد regex للبطاقة العالية لأنه ، في هذه المرحلة ، هي النتيجة الوحيدة التي يمكنك الحصول عليها.

كما قمت بتغيير عجلة الصلب (التفاف) من المستقيم من A2345 إلى 2345A لأنه سيتم فرزها بهذه الطريقة.

نصائح أخرى

أعيد كتابة regex لهذا لأنني وجدت أنه محبط ومربك. المجموعات أكثر منطقية لهذا النوع من المنطق. يتم الفرز باستخدام طريقة فرز الصفيف القياسي في JavaScript ومن ثم الترتيب الغريب للبطاقات ، فهي بترتيب أبجدي. فعلت لي في JavaScript ولكن يمكن تطبيق regex على جافا.

hands = [
    { regex: /(2345A|23456|34567|45678|56789|6789T|789JT|89JQT|9JKQT|AJKQT)#(.)\2{4}.*/g , name: 'Straight flush' },
    { regex: /(.)\1{3}.*#.*/g , name: 'Four of a kind' },
    { regex: /((.)\2{2}(.)\3{1}#.*|(.)\4{1}(.)\5{2}#.*)/g , name: 'Full house' },
    { regex: /.*#(.)\1{4}.*/g , name: 'Flush' },
    { regex: /(2345A|23456|34567|45678|56789|6789T|789JT|89JQT|9JKQT|AJKQT)#.*/g , name: 'Straight' },
    { regex: /(.)\1{2}.*#.*/g , name: 'Three of a kind' },
    { regex: /(.)\1{1}.*(.)\2{1}.*#.*/g , name: 'Two pair' },
    { regex: /(.)\1{1}.*#.*/g , name: 'One pair' },
  ];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top