Bowling oyununu puanla


25

Görevin, bir oyuncunun puanını, en fazla 21 top atmanın ardından 10 iğneli bir bowling oyununda toplamak .

Rulolar, tercih ettiğiniz giriş yönteminde bir tamsayı dizisi olarak gösterilir . Her bir tamsayı, o ruloda aşağı vurulmuş pimlerin sayısına karşılık gelir.

puanlama

Her turdan sonra o turda düşürülen pimlerin sayısı final skoruna dahil edilir. Bir oyuncu, bir turun ilk rulosundaki on pimin hepsini vurursa , bu bir vuruştur ve tur sona erer. Aksi takdirde, tur bir rulo daha sürer. Bir turun ikinci rulosu kalan tüm pimleri aşağıya vurursa, bu bir yedek .

Her vuruş için sonraki iki ruloda düşürülen pimlerin toplamına eşit bir bonus vardır . Her yedek için, bir sonraki ruloda devirilen pin sayısına eşit bir bonus vardır.

10. ve son turda, oyuncuya ekstra rulo verilebilir: Bir vuruş durumunda, oyuncu, vuruş bonusunu oluşturmak için iki atış daha alır. Yedek olması durumunda, oyuncu bir rulo daha alır.

Örnekler

Input: 4 3 8 2 7 1 10 7 3 0 10 2 2 10 10 5 4
Output: 131

Input: 10 10 9 1 7 3 2 7 10 1 9 10 7 1 10 10 10
Output: 183

kurallar

  • Girişin geçerli olduğunu kabul edebilirsiniz.
  • Mego'nun yorumuna göre, mevcut standartlarımızı karşılamak için girdi / çıktı yöntemlerinin gereksinimlerini gevşettim .
  • Zorluktan daha yeni olan dillerdeki cevaplara izin verilir
  • En kısa kod kazanır!

Bonusların yığılmadığını doğru hatırlıyor muyum?
Titus,

@Titus Tam emin ne demek istediğini değilim, ama hayır, ikramiye iki yanındaki yere serdi pimleri sayısını eklemek bir saldırı için yani "yığın", yapma rulo onlar grevler olup olmadığını bakılmaksızın, ya da değil. Bir vuruş için maksimum puan 30, en yüksek puan ise 300'dür.
daniero

Farklı komut satırı argümanları olarak nitelenir space separated integersmi?
Titus

1
@Titus emin. Bu eski bir mesajdır - Bugünün kabul edilebilir girdi yöntemleri konusundaki fikir birliği bu noktada kurulmamıştır. Aslında, bugünün standardının neden buna uygulanmaması gerektiğine bakmıyorum (fonksiyon parametreleri vb. Dahil), ancak geriye dönük olarak mücadelenin kurallarını değiştirmenin hayranı değilim.
daniero

1
@ daniero Her zamanki tavsiye, zorlu mücadeleyi büyük ölçüde değiştirmediği sürece, modern standartlara uyacak şekilde kuralları gevşetmenin kabul edilebilir olmasıdır.
Mego

Yanıtlar:


6

GolfScript, 50 41 karakter

~0]-1%~0{\.9>{+1$3$}{@+.9>3$*}if++}10*p];

GolfScript'te başka bir deneme ( çevrimiçi olarak çalıştırın ).

Kodun açıklaması aşağıdadır. Çözüm, problemin yığın yapısını kullanır (birbiri ardına rulo tüketir) ancak bu nedenle girdi ters çevrilmelidir.

~0          # Take the input and evaluate to single numbers on the stack. Add zero.
]-1%~       # Reverse the stack (make array, reverse array, dump array)

0           # Start with a sum of zero
{           # Perform this block 10 times (once for each round)
  \         #   Take the next roll
  .9>{      #   If it is a strike
    +       #     Add the value of the roll to the sum
    1$3$    #     and duplicate top two members of the stack (i.e. next two rolls).
  }{        #   ... else ...
    @+      #     Take the next roll and add with first roll in round.
    .9>     #     Does this sum show a spare?
    3$*     #     Get next roll (potential bonus) and multiply with yes/no.
            #     Since we pushed an additional 0 in the beginning 
            #     there is a spare roll even for the last round.
  }if       #   endif
  ++        #   Add top three stack entries together
            #   (i.e. sum+2 bonus rolls for strike, sum+rolls+bonus else)
}10*        # Loop ten times

p];         # Sum is top of stack. Print sum and discard any leftover rolls.

Önceki versiyon:

~].1>.1>]zip{((.10<{@(0=@+@1>1$9><}*@}10*;]{+}.@**

5

Python, 116 110 105 103 100 99 karakter

z=map(int,raw_input().split())
s=0
exec('s+=sum(z[:2+(z[0]+z[1]>9)]);z=z[2-(z[0]>9):];'*10)

Girişte 30 karakter harcamak zahmetlidir. Önerilerinizi bekliyoruz.

Gelişmeler için Howard'a çok teşekkürler.


Bir karakter kaydetmek için 1+(z[i]!=10)ile değiştirebilirsiniz 2-(z[i]>9).
Howard

@Howard: Mükemmel öneri. Cevabıma dahil ettim. İki karakter kaydetti.
Steven Rumbalski,

Ve eğer iki tane daha kaldırırsanız i(0 olarak ayarlanmışsa) ve i+=...kullanım yerinez=z[2-(z[0]>9)::];
Howard

@Howard: Tekrar teşekkürler. Üç karakter kaydedildi.
Steven Rumbalski,

I / O için standartlar genellikle şimdi çok daha esnektir z=input()ince (etkili bir listesinin bir dize temsilini alarak olmalıdır ints ve evalbunu ing). Ancak, tam programlar bir yerde çıktı vermelidir (sanırım bu durum o zamanlar da aynıydı). Dolayısıyla, bu 78 byte programla
Jonathan Allan,

4

R, 101 bayt

Bu zorluğun neden atıldığından emin değilim, ama hoşuma gitti, bu yüzden yine de geç cevaplayacağım.

f=function(x,s=0,c=10)`if`(c&length(x),f(x[-(0:(x[1]!=10)+1)],sum(x[1:(2+(sum(x[1:2])>9))])+s,c-1),s)

Çevrimiçi deneyin!

Ungolfed:

f <- function(throws, score = 0, count = 10){
  if(count != 0 & length(throws) != 0){
    IsStrike <- throws[1] == 10
    IsStrikeOrSpare <- sum(throws[1:2]) >= 10
    f(throws[-c(1, 2 * !IsStrike)],
      score + sum(throws[c(1:(2 + IsStrikeOrSpare))]),
      count - 1)
  } else {
    return(score)
  }
}

Özyinelemeli işlevi. Alır xpuanları tutan giriş gibi. sÇekirdekleri başlatır ve catılan mermi miktarını atlatır.

İf ifadesi 10 tur atılıp atılmadığını veya xboş olup olmadığını kontrol eder . Bu durumda, puan döndürülür. Aksi takdirde, işlev kendini şöyle söyleyecektir:

xGrev olup olmadığını kontrol ederek atışı uzaklaştırır . Öyleyse, ilk giriş, ilk ikisi kaldırılır. (S=x[1]!=10)grevleri kontrol eder. Biz kaldırıyoruz ( -) index 0:S, nerede Sbir grev ise 1 ve eğer değilse 0. Sonra bir tane ekleyin: -(0:(x[1]!=10)+1). Kısaltılmışları bir xsonraki görüşmeye geçiyoruz.

Skor gelince, bu x[1:2]düzenli bir dönüş olup x[1:3]olmadığını ve bir grev veya bir yedek olup olmadığını alarak bulunur . sum(x[1:2])10'dan büyük veya eşit olup olmadığını kontrol ederiz . Eğer grev ise, açıkçası durum budur. Yedek ise, o zaman bu da işe yarıyor. Yani eğer bu DOĞRU x[3]ise, toplamı ekleriz . Bu daha sonra eklenir s.


1

CoffeeScript ( 234 215 170)

z=(a)->b=(Number i for i in a.split(' ').reverse());t=0;(r=b.pop();l=b.length;if(9<r)then(t+=r;t+=b[l-1]+b[l-2];)else(f=r+b.pop();t+=f;(t+=b[l-2])if 9<f))for i in[0..9];t

EDIT : Ağır bir yeniden yazma, utanmadan Howard'ın büyük yığın temelli yaklaşımını intihal intihal. Bir dizinin son elemanına zarar vermeden erişmek için daha fazla çıkarılabileceğinden eminim ...


1

Ruby, 252 bayt

Diziye giriş kabul eder, önce tüm öğeleri ekler, ardından yedek ve grev bonusu arar

s,p,t,r=0,0,1,1
o=ARGV
o.each_with_index do |m,n|
y=m.to_i
s+=y
if r<10
p+=y
if p==10&&t==1
r,p=(r+1),0
s+=o[n+1].to_i+o[n+2].to_i
elsif p<10&&t==1
t=2
elsif p<10&&t==2
t,p,r=1,0,(r+1)
elsif p==10&&t==2
t,p,r=1,0,(r+1)
s+=o[n+1].to_i
end end end
puts s

1

PHP, 82 bayt

for($a=$argv;$r++<10;$i+=$p<10)$s+=(9<$q=$a[++$i+1]+$p=$a[$i])*$a[$i+2]+$q;echo$s;

komut satırı argümanlarından girdi alır; çevrimiçi olarak çalıştırın -nrveya test edin .

Yıkmak

for($a=$argv;       # import arguments
    $r++<10;        # loop through rounds
    $i+=$p<10)          # 6. if no strike, increment throw count again
    $s+=(9<
        $q=$a[++$i+1]+  # 1. increment throw count  2. $q=second throw plus
        $p=$a[$i]       # 3. $p=first throw
        )*$a[$i+2]      # 4. if $q>9 (strike or spare), add third throw to sum
    +$q;                # 5. add first and second throw to sum
echo$s;             # print sum


1

Jöle ,  36  35 bayt

+\µi©⁵+Ị$ḂḤị;®×Ị¤¡-
;0Ç3ƤFṣ-m€2Fḣ⁵S

Bir tamsayı listesini kabul eden ve bir tamsayı döndüren bir tek renkli bağlantı.

Çevrimiçi deneyin!

Nasıl?

Üst üste gelen her üç kasanın koşusunun skorunu, bir karenin başında başlayan ve isteğe bağlı olarak bir grev tanımlayıcısı -1ekleyen ( ) gibi hesaplar, bu sonuç listesini düzleştirir, grev tanımlayıcılarına böler, sonra her ikinci sonucu atar. her yığın (bir çerçevenin başlangıcıyla gerçekten başlamayan koşuların puanlarını çıkarmak).

Son kareye hitap etmek için ilk önce girişe bir sıfır eklenir (3-dilimli dilimlemenin bir karenin, sondan geçen kasenin ne üzerinde başlayabilmesine izin vermesine izin vermek için) ve elde edilen puanlar ilk ona kesilir (şimdi kaldırmak için olası sahte 11 çerçevesi) onları toplamaya başlamadan önce.

+\µi©⁵+Ị$ḂḤị;®×Ị¤¡- - Link 1, threeBowlEvaluate: list, bowlScores
                    -               e.g. [0,4,6]   [9,1,10]   [0,4,4]  [10,7,9]
 \                  - cumulative reduce with:
+                   -   addition         [0,4,10]  [9,10,20]  [0,4,8]  [10,17,26]
  µ                 - monadic chain separation, call that "left"
     ⁵              - literal ten        10        10         10       10
   i                - first index in left 3         2 (spare)  0        1 (strike)
    ©               - (copy to register for later reuse)
        $           - last two links as a monad (f(x)):
       Ị            -   abs(x) <= 1       0         0          1        1
      +             -   add x             3         2          1        2
         Ḃ          - modulo by 2         1         0          1        0
          Ḥ         - double              2         0          2        0
           ị        - index into left (both 1-indexed and modular)
                    -            ...      4        20          4       26
                  - - literal -1         -1        -1         -1       -1
                 ¡  - repeat:
            ;       - ...action: concatenate
                ¤   - ...number of times: nilad followed by link(s) as a nilad:
             ®      -   z from register   3         2          0        1
               Ị    -   abs(z) <= 1       0         0          1        1
              ×     -   multiply          0         0          0        1 (strike)
                    - ...yielding:        4         20         4        [26,-1]

;0Ç3ƤFṣ-m€2Fḣ⁵S - Main link: list bowlValues
                -                    e.g. [4,3,8,2,7,1,10,7,3,0,10,2,2,10,10,5,4]
 0              - literal zero            0
;               - concatenate             [4,3,8,2,7,1,10,7,3,0,10,2,2,10,10,5,4,0]
   3Ƥ           - for infixes of length 3:
  Ç             -   last link (1) as a monad
                -                         [7,11,17,9,8,11,[20,-1],10,3,12,[14,-1],4,12,[25,-1],[19,-1],9]
     F          - flatten                 [7,11,17,9,8,11,20,-1,10,3,12,14,-1,4,12,25,-1,19,-1,9]
       -        - literal -1              -1
      ṣ         - split at                [[7,11,17,9,8,11,20],[10,3,12,14],[4,12,25],[19],[9]]
          2     - literal two             2
        m€      - modulo slice for €ach   [[7,17,8,20],[10,12],[4,25],[19],[9]]
           F    - flatten                 [7,17,8,20,10,12,4,25,19,9]
             ⁵  - literal ten             10
            ḣ   - head to index           [7,17,8,20,10,12,4,25,19,9] (no effect this time)
              S - sum                     131

0

Perl, 140 mı?

İlk girişim:

#!/usr/bin/perl
# usage: ./bowling.pl [list of scores]

@A=@ARGV;{last if(9<$n++);$a=shift@A;$S+=$a;($S+=$A[0]+$A[1])&redo if($a==10);$b=shift@A;$S+=$b;($S+=$A[0])&redo if(10==$a+$b);redo}print$S

Ne yazık ki, başarısız olduğu bazı durumlar vardır. Daha sonra gelip tekrar yapacağım.

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.