Оцінка гри в боулінг


25

Ваше завдання полягає в підбитті та виведенні балів одного гравця в грі в 10-контактний боулінг після до 21 рулону .

Рулони представлені у вигляді послідовності цілих чисел у вашому бажаному способі введення . Кожне ціле число відповідає кількості штифтів, збитих у цьому рулоні.

Оцінка балів

Після кожного раунду кількість збитих в цьому раунді рахунків зараховується до остаточного рахунку. Якщо гравець збиває всі десять шпильок у першому рулоні раунду, це удар , і раунд закінчений. Інакше раунд триває ще один рулон. Якщо другий рулон раунду збиває всі шпильки, що залишилися, це запас .

За кожен удар є бонус, рівний сумі штирів, збитих у двох наступних рулонах. За кожну запасну частину є бонус, рівний кількості штифтів, збитих у наступному рулоні.

У 10-му та заключному раунді гравцеві можуть бути надані додаткові рулони: У разі удару гравцеві надається ще два рулони, щоб скласти свій бонус за страйк. У разі запасного, гравець отримує ще один рулон.

Приклади

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

Правила

  • Ви можете припустити, що вхід є дійсним.
  • Відповідно до коментаря Mego, я послабив вимоги до методів введення / виведення, щоб відповідати нашому чинному стандарту .
  • Відповіді дозволені новими мовами, ніж виклик
  • Найкоротший код виграє!

Я правильно пам’ятаю, що бонуси не складаються?
Тит

@Titus Я не точно впевнений, що ти маєш на увазі, але ні, бонуси не "стикуються", тобто за страйк ти додаєш кількість штифтів, які збиті в двох наступних рулонах , незалежно від того, чи вони страйкують чи ні. Тож максимальний бал за один удар становить 30 очок, а максимальний за всю гру - 300.
daniero

Чи кваліфікуються окремі аргументи командного рядка space separated integers?
Тит

1
@Titus впевнений. Це старий пост - сьогоднішній консенсус щодо прийнятних методів введення не був встановлений на даний момент. Насправді я зараз не бачу, чому сьогоднішній стандарт не повинен застосовуватися до цього (включаючи параметри функцій тощо), хоча я не прихильник змінювати правила виклику заднім числом.
daniero

1
@daniero Звичайна порада полягає в тому, що прийнятне послаблення правил відповідно до сучасних стандартів, доки це не змінить різко проблеми.
Мего

Відповіді:


6

GolfScript, 50 41 символ

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

Ще одна спроба в GolfScript ( запустіть його в Інтернеті ).

Далі пояснення коду. Рішення використовує проблему стека проблеми (споживайте ролики один за одним), але тому вхід повинен бути зворотним.

~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.

Попередня версія:

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

5

Пітон, 116 110 105 103 100 99 символів

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)

Витратити 30 символів на введення - набридливо. Пропозиції вітаються.

Велика подяка Говарду за вдосконалення.


Ви можете замінити 1+(z[i]!=10)з , 2-(z[i]>9)щоб зберегти один символ.
Говард

@Howard: Відмінна пропозиція. Я включив це у свою відповідь. Це врятувало двох символів.
Стівен Румбальський

І ще два, якщо ви видалите iповністю (встановлено значення 0) і замість цього i+=...використовуєтеz=z[2-(z[0]>9)::];
Howard

@Howard: Ще раз дякую. Збережено три символи.
Стівен Румбальський

Стандарти вводу / виводу зараз, як правило, більш гнучкі, тому це z=input()повинно бути нормальним (фактично беручи рядкове представлення списку ints і evaling). Однак повні програми повинні десь виводитись (я думаю, що це було і тоді). Я вважаю, що це може бути змінено на цю 78-байтну програму
Джонатан Аллан

4

R, 101 байт

Я не впевнений, чому цей виклик зіткнувся, але мені це подобається, тому я запізнюсь відповісти все одно.

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)

Спробуйте в Інтернеті!

Безголівки:

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)
  }
}

Рекурсивна функція. Приймає xяк вхід, який містить бали. Ініціалізує sсердечники та cунцію кількості викинутих патронів.

Оператор if перевіряє, чи викинуто 10 раундів, чи xпорожній. Якщо це так, рахунок повертається. В іншому випадку функція називатиме себе так:

Він видаляє кидки з x, перевіряючи, чи це удар, чи ні. Якщо так, перший запис видаляється, а інший - перший. (S=x[1]!=10)чеки на страйки. Видаляємо ( -) індекс 0:S, де S1, якщо це страйк, а 0 - якщо ні. А потім додайте: -(0:(x[1]!=10)+1). Ми передаємо скорочене xдо наступного дзвінка.

Що стосується рахунку, то це з'ясовується, приймаючи, x[1:2]якщо це черговий поворот, і x[1:3]якщо це удар чи запас. Ми перевіряємо, чи sum(x[1:2])більший він чи дорівнює 10. Якщо це страйк, очевидно, це так. Якщо це запасний, то це також працює. Тож якщо це ІСТИНА, ми додаємо x[3]до суми. Потім це додається до 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 : Потужне переписування, безсоромно плагіатування великого підходу Говарда на основі стека. Я впевнений, що більше доступу може бути позбавлено доступу до останнього елемента масиву, не знищуючи його ...


1

Рубін, 252 байти

Приймає вхід до масиву спочатку додає всі елементи, потім шукає запасний та бонусний удар

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 байти

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

приймає дані з аргументів командного рядка; запустити -nrабо випробувати його в Інтернеті .

зламатися

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

Желе ,  36  35 байт

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

Монадічне посилання, що приймає список цілих чисел і повертає ціле число.

Спробуйте в Інтернеті!

Як?

Обчислює бал кожного пробігу, що перекривається, з трьох чаш, як якщо б це був такий, який розпочався на початку кадру, і необов'язково додає ідентифікатор страйку (-1 ), розгладжує цей отриманий список, розбиває його за ідентифікаторами страйку, а потім відкидає кожен другий результат від кожен фрагмент (видалення балів тих прогонів, які насправді не починалися з початку кадру).

Для задоволення кінцевого кадру до входу спочатку додається нуль (щоб 3-мудрі нарізки дозволяли запускати кадр із того, що був передостанньою чашею), а отримані бали усікаються до першої десятки (щоб видалити тепер можливий фіктивний 11-й кадр) до їх підбиття.

+\µ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

Перл, 140?

Перша спроба:

#!/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

На жаль, є певні випадки, коли це не вдається. Я приїду і перероблю це пізніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.