Snooker ghi bàn


16

Tôi đã xem giải vô địch bi-a thế giới và nó làm tôi tự hỏi ..

Snooker ghi bàn

Trong trò chơi bi da có một số quy tắc nhất định mà bạn cũng phải tuân thủ:

  • Khi có những quả bóng màu đỏ trên bàn, trong lượt của bạn, trước tiên bạn phải đặt một quả bóng màu đỏ
  • Sau khi đặt từng quả bóng màu đỏ, bạn phải đặt một quả bóng màu (không phải màu đỏ) (quả bóng màu trong chậu sau đó được thay thế trên bàn)
  • Sau khi tất cả các quả bóng màu đỏ đã hết (có 15), trước tiên bạn có thể chọn một quả bóng màu và sau đó bạn bắt đầu với quả bóng có điểm thấp nhất và tìm đường đến quả bóng có điểm cao nhất (những thứ này không được thay thế)
  • Không bầu tại bất kỳ điểm nào kết thúc lượt của bạn.
  • Điểm trên mỗi quả bóng
    • Bóng đỏ: 1 điểm
    • Quả bóng vàng: 2 điểm
    • Quả bóng xanh: 3 điểm
    • Bóng nâu: 4 điểm
    • Bóng xanh: 5 điểm
    • Bóng hồng: 6 điểm
    • Bóng đen: 7 điểm

Câu hỏi

Bạn bắt đầu với một cái bàn có tất cả các quả bóng vẫn còn trên đó - 15 quả đỏ và một trong những quả bóng màu khác - và được cho điểm của một người chơi bi-a sau lượt đầu tiên của họ, những cách mà họ có thể đạt được là gì ghi bàn?

Đầu vào sẽ là một số điểm đi từ 1 đến 147. Bạn có thể chọn nếu đó là số nguyên hoặc chuỗi. Đầu ra phải là sự kết hợp khác nhau của số lần bạn đặt trong mỗi quả bóng.

Các trường hợp thử nghiệm:

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

Quy tắc:

  • Bạn có thể chọn xem bạn xuất các khả năng được chia cho một dòng mới hoặc một dấu phân cách nào đó (/,; | \ hoặc thậm chí các khả năng khác mà tôi thiếu)

Đây là codegolf, vì vậy mã ngắn nhất sẽ thắng.


Tôi có thể xuất ra dưới dạng danh sách các mảng không?
Leaky Nun

1
Về đầu ra mảng: số lượng bóng được sắp xếp theo điểm số không rõ ràng, vì vậy có "5r 3b 2g"thể có thể là đầu ra [5,0,2,0,3,0,0](miễn là điều này phù hợp)?
Jonathan Allan

2
Bạn sử dụng bcho màu nâu và blmàu xanh; vậy bkcho màu đen? Chúng ta có thể sử dụng n, ek(chữ cái cuối) cho ba cái này không? Làm thế nào về dlerunaviệc xác định tất cả tám màu (chữ cái thứ 3 của mỗi màu)?
Jonathan Allan

1
@Shaggy, Nếu bạn sử dụng chỉ thị màu như dleruna hoặc màu khác, thì không. Nếu bạn chỉ sử dụng một mảng như [5 0 0 4 1 0 0], thì chúng nên được sắp xếp từ thấp đến cao.
Michthan

1
Chỉ nhằm mục đích minh họa, đây là một ví dụ (đáng kinh ngạc) về một lần phá vỡ 147 của Ronnie "The Rocket" O 'Sullivan.
Arnauld

Câu trả lời:


6

Thạch , 66 byte

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

Chà, bây giờ thì quá chậm cho TIO!
... vì vậy đây là một bản dán của 2636 cách để tạo chính xác 100 sản phẩm ngoại tuyến.
... và đây là phiên bản sẽ chạy ở đó chỉ với màu đỏ SIX (phá vỡ tối đa = 75)

In một lưới các số mỗi dòng là một danh sách các giá trị bóng được phân tách bằng dấu cách (ví dụ: ba màu đỏ và hai màu xanh lá cây sẽ nằm trên một dòng đọc 1 1 1 3 3).


Đối với phiên bản được nhóm giá trị in các dòng đếm cùng với tên đầy đủ của các quả bóng, ở 102 byte:

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

Làm sao?

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

Nó hoạt động tốt cho tất cả các trường hợp tôi đã cố gắng. Chỉ trong một số trường hợp, mã cuối cùng cho số không hàng đầu.
Michthan

À đúng rồi, họ nên được lọc ra ... Đã sửa.
Jonathan Allan

Đầu ra của bạn cho 53 là không rõ ràng như tôi đã nói trước đây, nhưng tôi vẫn nghi ngờ nếu mọi người có thể đọc được ..
Michthan

Nó là tốt hơn nhiều trong cách lưới. Nếu không có câu trả lời ngắn hơn trong vài ngày tới, tôi sẽ chấp nhận câu trả lời của bạn!
Michthan

Hừm. Tôi nhận được 2636 kết hợp phá vỡ thế kỷ. Vì vậy, bạn hoặc tôi sai ...
Arnauld

4

JavaScript (ES7), 188 180 178 byte

Trả về một mảng các mảng (được sắp xếp từ đỏ sang đen).

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)

Đã bình luận

Lưu ý : Phiên bản này không bao gồm tối ưu hóa cuối cùng trên p(hiện được khởi tạo thành 7), điều này khiến logic khó hiểu hơn.

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

Ví dụ đầu ra

Dưới đây là đầu ra cho 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 ] ]

Bản giới thiệu

Điều này là quá chậm cho một đoạn. Bạn có thể thử nó ở đây để thay thế. (Bạn có thể nhận được một hoặc hai cảnh báo tập lệnh không phản hồi , nhưng cuối cùng nó sẽ hoàn thành.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.