Snooker mencetak gol

16

Saya menyaksikan kejuaraan snooker dunia dan itu membuat saya bertanya-tanya ..

Snooker mencetak gol

Dalam permainan snooker ada beberapa aturan yang harus Anda patuhi juga:

  • Ketika ada bola merah di atas meja, selama giliran Anda, Anda harus terlebih dahulu memasang bola merah
  • Setelah pot setiap bola merah, Anda harus pot bola berwarna (bukan merah) (bola berwarna pot kemudian diganti ke atas meja)
  • Setelah semua bola merah naik (ada 15), pertama Anda dapat memilih bola berwarna dan kemudian Anda mulai dengan bola skor terendah dan bekerja sampai bola skor tertinggi (ini tidak diganti)
  • Tidak pot pada titik mana pun mengakhiri giliran Anda.
  • Poin per bola
    • Bola merah: 1 poin
    • Bola kuning: 2 poin
    • Bola hijau: 3 poin
    • Bola coklat: 4 poin
    • Bola biru: 5 poin
    • Bola merah muda: 6 poin
    • Bola hitam: 7 poin

Pertanyaan

Anda mulai dengan sebuah meja dengan semua bola masih di atasnya - 15 merah dan satu dari masing-masing bola berwarna lainnya - dan diberi skor pemain di snooker setelah giliran pertama mereka, apa cara yang bisa mereka lakukan untuk mencapai ini skor?

Input akan berupa skor dari 1 hingga 147. Anda dapat memilih apakah bilangan bulat atau string. Output harus berupa kombinasi yang berbeda dari berapa kali Anda menempatkan setiap bola.

Kasus uji:

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

Aturan:

  • Anda dapat memilih apakah Anda menampilkan kemungkinan yang dibagi dengan baris baru atau pemisah semacam (/,; | | atau bahkan yang lain yang saya lewatkan)

Ini codegolf, jadi kode terpendek menang.

Michthan
sumber
Bisakah saya menampilkan sebagai daftar array?
Leaky Nun
1
Mengenai output array: jumlah bola yang dipesan oleh skor tidak ambigu, jadi mungkin "5r 3b 2g"bisa menjadi output [5,0,2,0,3,0,0](selama ini konsisten)?
Jonathan Allan
2
Anda gunakan buntuk cokelat dan blbiru; jadi bkuntuk hitam? Bisakah kita menggunakan n, edan k(huruf terakhir) untuk ketiganya? Bagaimana dlerunamengidentifikasi delapan warna (masing-masing 3 huruf)?
Jonathan Allan
1
@ Shaggy, Jika Anda menggunakan indikasi warna seperti dleruna atau yang lain, tidak. Jika Anda hanya menggunakan array seperti [5 0 0 4 1 0 0], maka array harus diurutkan dari rendah ke tinggi.
Michthan
1
Hanya untuk tujuan ilustrasi, berikut adalah contoh (menakjubkan) dari istirahat oleh Ronnie "The Rocket" O 'Sullivan.
Arnauld

Jawaban:

6

Jelly , 66 byte

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

Yah, terlalu lambat untuk TIO sekarang!
... jadi di sini adalah rekat dari 2636 cara untuk membuat persis 100 diproduksi offline.
... dan di sini adalah versi yang akan berjalan di sana dengan hanya ENAM merah (maksimum istirahat = 75)

Mencetak kisi angka masing-masing garis menjadi daftar nilai bola yang dipisahkan ruang (mis. Tiga merah dan dua hijau akan berada pada pembacaan garis 1 1 1 3 3).


Untuk versi yang dikelompokkan nilai yang mencetak garis jumlah bersama dengan nama lengkap bola, pada 102 byte:

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

Bagaimana?

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
Jonathan Allan
sumber
Ini bekerja dengan baik untuk semua kasus yang saya coba. Hanya dalam beberapa kasus kode terakhir memberikan angka nol di depan.
Michthan
Ah ya mereka seharusnya sudah disaring ... Diperbaiki.
Jonathan Allan
Output Anda untuk yang satu tidak ambigu seperti yang saya katakan sebelumnya, tapi saya masih ragu apakah itu dapat dibaca untuk semua orang ..
Michthan
Itu jauh lebih baik dalam cara grid. Jika tidak ada jawaban yang lebih pendek dalam beberapa hari ke depan, saya akan menerima jawaban Anda!
Michthan
Hmm. Saya mendapatkan kombinasi break abad ke 2636. Jadi Anda atau saya salah ...
Arnauld
4

JavaScript (ES7), 188 180 178 byte

Mengembalikan array array (diurutkan dari merah ke hitam).

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)

Berkomentar

Catatan : Versi ini tidak termasuk optimisasi terakhir pada p(sekarang diinisialisasi ke 7) yang membuat logika lebih sulit untuk dipahami.

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

Contoh output

Di bawah ini adalah output untuk 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 ] ]

Demo

Ini terlalu lambat untuk cuplikan. Anda bisa mencobanya di sini . (Anda mungkin mendapatkan satu atau dua lansiran skrip yang tidak responsif , tetapi akhirnya akan selesai.)

Arnauld
sumber