Snooker puanlaması


16

Dünya bilardo şampiyonasını izliyordum ve merak ettim ..

Snooker puanlaması

Snooker oyununda da uymanız gereken bazı kurallar vardır:

  • Masanın üzerinde kırmızı toplar olduğunda, sıra sende önce kırmızı bir top
  • Her kırmızı topu sakladıktan sonra, renkli (kırmızı olmayan) bir topu saklamanız gerekir (saksı renkli top daha sonra masaya yerleştirilir)
  • Tüm kırmızı toplar kaldıktan sonra (15 tane var) önce renkli bir top seçebilir ve daha sonra en düşük puanlama topuyla başlayıp en yüksek puanlama topuna kadar çalışabilirsiniz (bunlar değiştirilmez)
  • Hiçbir noktada çömlek atmamak sıranızı sonlandırır.
  • Top başına puan
    • Kırmızı Top: 1 puan
    • Sarı top: 2 puan
    • Yeşil top: 3 puan
    • Kahverengi top: 4 puan
    • Mavi top: 5 puan
    • Pembe top: 6 puan
    • Siyah top: 7 puan

Soru

- Bununla hala tüm topları içeren bir tablo ile başlar 15 kırmızı ve biri diğer renkli topları her birinin - ve ilk turda sonra snooker bir oyuncunun puanı verilir, bu elde ettik ki yolları nelerdir Puan?

Girdi 1 ile 147 arasında bir puan olacaktır. Tam sayı mı yoksa dize mi olacağını seçebilirsiniz. Çıktı, her bir topu kaç kez sakladığınızın farklı kombinasyonları olmalıdır.

Test senaryoları:

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

Kurallar:

  • Olasılıkların yeni bir satıra mı yoksa bir tür ayırıcıya mı bölüneceğini (/ ,; | \ veya hatta kaçırdığım başkaları) seçebilirsiniz

Bu kodgolf, bu yüzden en kısa kod kazanıyor.


Diziler listesi olarak çıktı alabilir miyim?
Leaky Nun

1
Bir dizi çıktısı ile ilgili olarak: puana göre sıralanan topların sayısı açık değildir, bu yüzden (bu tutarlı olduğu sürece) "5r 3b 2g"çıktı alınabilir [5,0,2,0,3,0,0]mi?
Jonathan Allan

2
Sen kullanmak bkahverengi ve blmavi için; böylece bksiyah için? Kullandığımız Could n, eve k(son harf) bu üçü için? dlerunaSekiz rengi de (her birinin 3. harfi) tanımlamaya ne dersiniz ?
Jonathan Allan

1
@Shaggy, Eğer dleruna ya da başka bir renk belirtisi kullanırsanız, hayır. Sadece [5 0 0 4 1 0 0] gibi bir dizi kullanırsanız, bunlar düşükten yükseğe doğru sıralanmalıdır.
Michthan

1
Sadece açıklama amaçlı olarak, Ronnie "The Rocket" O 'Sullivan'ın 147 molasının (şaşırtıcı) bir örneği .
Arnauld

Yanıtlar:


6

Jöle , 66 bayt

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

Peki, şimdi TIO için çok yavaş!
... işte tam olarak 100'ü çevrimdışı hale getirmenin 2636 yolunun bir macunu .
... ve burada sadece SIX kırmızılarıyla çalışacak bir sürüm var (maksimum mola = 75)

Her satırın boşlukla ayrılmış bir top değerleri listesi olan bir sayı ızgarası yazdırır (örneğin, satır okumasında üç kırmızı ve iki yeşil olur 1 1 1 3 3).


Topların tam adlarıyla birlikte sayı satırlarını 102 baytta basan değer gruplu bir sürüm için:

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

Nasıl?

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

Denediğim tüm vakalar için iyi çalışıyor. Sadece bazı durumlarda son kod baştaki sıfırları verir.
Michthan

Ah evet filtrelenmiş olmalıydı ... Düzeltildi.
Jonathan Allan

Daha önce söylediğim gibi 53 olanı için net değil, ama herkes için okunabilir ise hala şüphe ediyorum ..
Michthan

Izgara yolunda çok daha iyi. Önümüzdeki birkaç gün içinde daha kısa bir cevap yoksa, cevabınızı kabul edeceğim!
Michthan

Hmm. 2636 yüzyıl sonu kombinasyonları alıyorum. Ya sen ya da ben yanılıyoruz ...
Arnauld

4

JavaScript (ES7), 188 , 180 178 bayt

Bir dizi diziyi döndürür (kırmızıdan siyaha sıralanmış).

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)

Yorumlananlar

Not : Bu sürüm p, mantığın anlaşılmasını zorlaştıran en son açıklamayı (şimdi 7 olarak başlatıldı) içermez .

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

Örnek çıktı

Aşağıda n = 140 çıktısı verilmiştir:

//  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 ] ]

gösteri

Bu bir pasaj için çok yavaş. Bunun yerine burada deneyebilirsiniz . (Bir veya iki yanıt vermeyen komut dosyası uyarısı alabilirsiniz, ancak sonunda tamamlanması gerekir.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.