स्नूकर स्कोरिंग


16

मैं विश्व स्नूकर चैम्पियनशिप देख रहा था और इसने मुझे आश्चर्यचकित कर दिया।

स्नूकर स्कोरिंग

स्नूकर के खेल में कुछ नियम हैं जिनका आपको भी पालन करना होगा:

  • जब टेबल पर लाल गेंदें होती हैं, तो अपनी बारी के दौरान आपको पहले लाल गेंद करनी चाहिए
  • प्रत्येक लाल गेंद को पोटिंग करने के बाद, आपको एक रंगीन (लाल नहीं) गेंद को पॉट करना चाहिए (पॉटेड रंगीन गेंद को तब टेबल पर बदल दिया जाता है)
  • सभी लाल गेंदों के उठने के बाद (वहाँ 15 हैं) आप पहले एक रंगीन गेंद का चयन कर सकते हैं और फिर आप सबसे कम स्कोरिंग गेंद से शुरुआत करते हैं और उच्चतम स्कोरिंग गेंद तक अपना काम करते हैं (ये प्रतिस्थापित नहीं हैं)
  • किसी भी बिंदु पर पोटिंग नहीं करने से आपकी बारी खत्म हो जाती है।
  • प्रति गेंद पर अंक
    • लाल गेंद: 1 अंक
    • पीली गेंद: 2 अंक
    • हरी गेंद: 3 अंक
    • ब्राउन बॉल: 4 अंक
    • ब्लू बॉल: 5 अंक
    • गुलाबी गेंद: 6 अंक
    • काली गेंद: 7 अंक

प्रश्न

आप इस पर अभी भी सभी गेंदों के साथ एक मेज के साथ शुरू - 15 लाल और एक अन्य रंगीन गेंदों के प्रत्येक के लिए - और अपनी पहली बारी के बाद स्नूकर में एक खिलाड़ी के स्कोर दिया जाता है, तरीके वे यह लक्ष्य प्राप्त किया जा सकता था कि क्या कर रहे हैं स्कोर?

इनपुट 1 से 147 तक का स्कोर होगा। आप चुन सकते हैं कि यह पूर्णांक या स्ट्रिंग है। आउटपुट आपके द्वारा प्रत्येक गेंद को देखे जाने की संख्या के विभिन्न संयोजनों का होना चाहिए।

परीक्षण के मामलों:

Input: 4
Output: 
1r 1g
2r 1y
Input: 25
Output:
4r 3b
5r 2b 1br 1y
5r 2b 2g
...
9r 8y

नियम:

  • आप चुन सकते हैं कि क्या आप एक नई लाइन या किसी प्रकार के विभाजक (/,; | \) या यहां तक ​​कि दूसरों के द्वारा विभाजित संभावनाओं को आउटपुट करते हैं,

यह कोडगोल्फ है, इसलिए सबसे छोटा कोड जीतता है।


क्या मैं सरणियों की सूची के रूप में आउटपुट कर सकता हूं?
लीक नून

1
एक सरणी आउटपुट के बारे में: स्कोर द्वारा आदेशित गेंदों की संख्या असंदिग्ध है, इसलिए हो "5r 3b 2g"सकता है कि आउटपुट [5,0,2,0,3,0,0](जब तक यह सुसंगत हो) आउटपुट हो सकता है ?
जोनाथन एलन

2
आप bभूरे और blनीले रंग के लिए उपयोग करते हैं ; bkकाले के लिए तो ? हम इस्तेमाल कर सकते हैं n, eऔर kइन तीन के लिए (पिछले पत्र)? कैसे dlerunaसभी आठ रंगों (प्रत्येक के तीसरे अक्षर) की पहचान करें?
जोनाथन एलन

1
@ शागिर्द, अगर आप डलरुना या किसी अन्य जैसे रंग के संकेत का उपयोग करते हैं, तो नहीं। यदि आप केवल [५ ० ४ ४ १ ० ०] जैसे किसी सरणी का उपयोग करते हैं, तो उन्हें निम्न से उच्च में क्रमबद्ध किया जाना चाहिए।
मिकथान

1
सिर्फ उदाहरण के लिए, यहां रॉनी "द रॉकेट" ओ 'सुलिवान द्वारा 147 ब्रेक का एक (अद्भुत) उदाहरण है
अरनौलड

जवाबों:


6

जेली , 66 बाइट्स

L⁼30µÐfµ7Ḋ;\¤;€Ṣ€µ€;/
ċ1<⁴µÐfµ;Ç
7Ḋœċ⁴Ḷ¤;/L€;$€;@þ2B¤;/ḟ€0ÇS⁼¥Ðf⁸G

खैर, यह अब TIO के लिए बहुत धीमी है!
... तो यहां 2636 तरीकों का एक पेस्ट है जो बिल्कुल 100 का उत्पादन ऑफ़लाइन करने के लिए करता है।
... और यहां एक संस्करण है जो वहां सिक्स रेड्स के साथ चलेगा (अधिकतम ब्रेक = 75)

प्रत्येक पंक्ति की एक ग्रिड को प्रिंट करता है, जो गेंद के मूल्यों की एक अलग-अलग सूची होती है (उदाहरण के लिए तीन लाल और दो हरे रंग की एक लाइन रीडिंग 1 1 1 3 3)।


एक मूल्य-समूहित संस्करण के लिए, जो 102 बाइट्स में, गेंदों के पूरे नामों के साथ-साथ काउंट की पंक्तियों को प्रिंट करता है:

ŒrÑ€
Ṫ;ị“¡^³ṗ⁼¬wḌ⁼ø÷OẏK¦ẆP»Ḳ¤$K
L⁼30µÐfµ7Ḋ;\¤;€Ṣ€µ€;/
ċ1<⁴µÐfµ;Ç
7Ḋœċ⁴Ḷ¤;/L€;$€;@þ2B¤;/ḟ€0ÇS⁼¥Ðf⁸Ñ€K€Y

कैसे?

L⁼30µÐfµ7Ḋ;\¤;€Ṣ€µ€;/ - Link 1, create post-red-ball games: list of all pre-yellow-ball-games
    µÐf               - filter keep if:
L⁼30                  -   length equals 30 (games that get on to the yellow)
       µ         µ€   - for €ach sequence leading to the yellow:
            ¤         -   nilad followed by link(s) as a nilad:
        7Ḋ            -     7 dequeued  = [2,3,4,5,6,7]
          ;\          -     ;\ cumulative reduce with concatenation  = [[2],[2,3],[2,3,4],...]
             ;€       - concatenate the sequence with €ach of those
               Ṣ€     - sort each one
                   ;/ - reduce with concatenation (flatten by one)

ċ1<⁴µÐfµ;Ç - Link 2, filter bogus entries created and append post-yellow-ball games: list of pre-yellow-ball games (along with the bogus ones with 16 reds potted)
    µÐf    - filter keep if:
ċ1         -   count ones
   ⁴       -   literal 16
  <        -   less than?
       µ   - monadic chain separation
         Ç - call the last link (1) as a monad
        ;  - concatenate

7Ḋœċ⁴Ḷ¤;/L€;$€;@þ2B¤;/ḟ€0ÇS⁼¥Ðf⁸G - Main link: score
7Ḋ                                - 7 dequeued = [2,3,4,5,6,7]
      ¤                           - nilad followed by link(s) as a nilad:
     ⁴                            -   literal 16
    Ḷ                             -   lowered range = [0,1,2,...,15]
  œċ                              - combinations with replacement (every possible colour-ball selection that goes with the red pots)
       ;/                         - reduce with concatenation (flatten by one)
            $€                    - last two links as a monad for €ach:
         L€                       -   length of €ach (number of coloured balls potted)
           ;                      -   concatenate
                   ¤              - nilad followed by link(s) as a nilad:
                 2B               -   2 in binary = [1,0]
                þ                 - outer product with:
              ;@                  -   concatenation with reversed @rguments
                    ;/            - reduce with concatenation (flatten by one)
                      ḟ€0         - filter discard zeros from €ach
                         Ç        - call the last link (2) as a monad
                             Ðf   - filter keep:
                            ¥  ⁸  -   last two links as a dyad, with score on the right
                          S⁼      -     sum(ball values) is equal to score?
                                G - format as a grid
                                  - implicit print

मेरे द्वारा आजमाए गए सभी मामलों के लिए यह अच्छी तरह से काम करता है। केवल कुछ मामलों में अंतिम कोड अग्रणी शून्य देता है।
मिकथान

आह हाँ, उन्हें फ़िल्टर किया जाना चाहिए था ... फिक्स्ड।
जोनाथन एलन

53 के लिए आपका आउटपुट अस्पष्ट है जैसा कि मैंने पहले कहा था, लेकिन मैं अभी भी संदेह कर रहा हूं अगर यह हर किसी के लिए पठनीय है ..
मिचथान

यह ग्रिड तरीके से काफी बेहतर है। यदि अगले कुछ दिनों में कोई छोटा जवाब नहीं मिलता है, तो मैं आपका जवाब स्वीकार करने जा रहा हूं!
मिकथान

हम्म। मुझे 2636 सदी के ब्रेक कॉम्बिनेशन मिलते हैं। इसलिए या तो आप या मैं गलत हैं ...
अरनौल

4

जावास्क्रिप्ट (ईएस 7), 188 180 178 बाइट्स

एक सरणी का रिटर्न देता है (लाल से काले रंग की तरह)।

n=>[...Array(17**6)].map((_,x)=>[2,3,4,5,6,p=7].map(v=>(k=a[++j]=x%17|0,x/=17,t+=k,p+=!!(y=y&&k),s-=k*v),y=s=n,a=[j=t=0])&&(s==15|s>=t)&s<16&s<t+2&t<9+p&&(a[0]=s,a)).filter(a=>a)

टिप्पणी की गई

नोट : इस संस्करण में अंतिम अनुकूलन p(अब 7 पर आरंभीकृत) शामिल नहीं है जो तर्क को समझने में कठिन बनाता है।

n =>                              // given a target score n:
  [...Array(17**6)].map((_, x) => // for each x in [0 .. 17^6 - 1]:
    [2, 3, 4, 5, 6, 7].map(v =>   //   for each v in [2 .. 7] (yellow to black):
      ( k = a[++j] = x % 17 | 0,  //     k = a[j] = number of colored balls of value v
        x /= 17,                  //     update x to extract the next value
        t += k,                   //     update t = total number of colored balls
        p += !!(                  //     update p = number of consecutive colors that were
          y = y && k              //     potted at least once, using y = flag that is zeroed
        ),                        //     as soon as a color is not potted at all
        s -= k * v ),             //     subtract k * v from the current score s
      y = s = n,                  //     initialize y and s
      a = [j = t = p = 0]         //     initialize a, j (pointer in a), t and p
    )                             //   at this point, s is the alleged number of red balls
    &&                            //   this combination is valid if we have:
      (s == 15 | s >= t) &        //     - 15 red balls or more red balls than colored ones
      s < 16 &                    //     - no more than 15 red balls
      s < t + 2 &                 //     - at most one more red ball than colored ones
      t < 16 + p                  //     - no more than 15 + p colored balls
    &&                            //   if valid:
      (a[0] = s, a)               //     update the combination with red balls and return it
  ).filter(a => a)                // end of outer map(): filter out invalid entries

उदाहरण आउटपुट

नीचे n = 140 के लिए आउटपुट है:

//  R   Y  G  Br Bl P  Bk 
[ [ 15, 1, 1, 1, 1, 8, 9  ],
  [ 15, 1, 1, 1, 2, 6, 10 ],
  [ 15, 1, 1, 1, 3, 4, 11 ],
  [ 15, 1, 1, 2, 1, 5, 11 ],
  [ 15, 1, 1, 1, 4, 2, 12 ],
  [ 15, 1, 1, 2, 2, 3, 12 ],
  [ 15, 1, 2, 1, 1, 4, 12 ],
  [ 15, 1, 1, 2, 3, 1, 13 ],
  [ 15, 1, 1, 3, 1, 2, 13 ],
  [ 15, 1, 2, 1, 2, 2, 13 ],
  [ 15, 2, 1, 1, 1, 3, 13 ],
  [ 15, 1, 2, 2, 1, 1, 14 ],
  [ 15, 2, 1, 1, 2, 1, 14 ],
  [ 15, 1, 1, 1, 1, 1, 15 ] ]

डेमो

यह एक स्निपेट के लिए बहुत धीमा है। आप इसके बजाय यहाँ कोशिश कर सकते हैं । (आपको एक या दो गैर-स्क्रिप्ट स्क्रिप्ट अलर्ट मिल सकते हैं , लेकिन यह अंततः पूरा होना चाहिए।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.