ทำคะแนนเกมโบว์ลิ่ง


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

กฎระเบียบ

  • คุณอาจสันนิษฐานว่าอินพุตนั้นถูกต้อง
  • ตามความคิดเห็นของชำเลืองฉันได้คลายความต้องการสำหรับการป้อนข้อมูลวิธีการ / ส่งออกของเราเพื่อตอบสนองความมาตรฐานในปัจจุบัน
  • อนุญาตให้มีคำตอบในภาษาที่ใหม่กว่าความท้าทาย
  • รหัสที่สั้นที่สุดชนะ!

ฉันจำได้อย่างถูกต้องว่าโบนัสไม่ซ้อนกันหรือไม่
ติตัส

@Titus ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึง แต่ไม่โบนัสไม่ "สแต็ค" คือสำหรับการนัดหยุดงานคุณเพิ่มจำนวนพินที่ล้มลงในม้วนถัดไปสองโดยไม่คำนึงถึงว่าพวกเขาจะนัดหยุดงาน หรือไม่. ดังนั้นคะแนนสูงสุดสำหรับการนัดหยุดงานหนึ่งครั้งคือ 30 คะแนนและสูงสุดสำหรับทั้งเกมคือ 300
daniero

อาร์กิวเมนต์บรรทัดคำสั่งที่แตกต่างกันมีคุณสมบัติเป็นspace separated integersหรือไม่
ติตัส

1
@Tios แน่ใจว่า นี่คือโพสต์เก่า - ฉันทามติในวันนี้เกี่ยวกับวิธีการป้อนข้อมูลที่ยอมรับได้ไม่ได้รับการจัดตั้งขึ้น ณ จุดนี้ ที่จริงแล้วฉันไม่เห็นเลยว่าทำไมมาตรฐานของวันนี้จึงไม่ควรนำไปใช้กับสิ่งนี้ (รวมถึงพารามิเตอร์ฟังก์ชั่นและอื่น ๆ ) แม้ว่าฉันจะไม่ได้เป็นแฟนของการเปลี่ยนกฎของการท้าทายย้อนหลัง
daniero

1
@daniero คำแนะนำทั่วไปคือมันเป็นที่ยอมรับเพื่อคลายกฎให้พอดีกับมาตรฐานที่ทันสมัยตราบใดที่มันไม่ได้เปลี่ยนความท้าทายอย่างมาก
Mego

คำตอบ:


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

Python, 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: ข้อเสนอแนะที่ยอดเยี่ยม ฉันได้รวมไว้ในคำตอบของฉัน มันบันทึกอักขระสองตัว
Steven Rumbalski

และอีกสองถ้าคุณลบออกiอย่างสมบูรณ์ (ตั้งค่าเป็น 0) และแทนที่จะi+=...ใช้z=z[2-(z[0]>9)::];
Howard

@ วิธี: ขอบคุณอีกครั้ง บันทึกตัวละครสามตัว
Steven Rumbalski

มาตรฐาน I / O โดยทั่วไปจะมีความยืดหยุ่นมากขึ้นในขณะนี้ดังนั้นz=input()ควรจะปรับ (อย่างมีประสิทธิภาพการแสดงสตริงของรายการintและevalไอเอ็นจีได้) อย่างไรก็ตามโปรแกรมเต็มควรจะแสดงผลที่ใดที่หนึ่ง (ฉันคิดว่านี่ก็เป็นกรณีเช่นกันเช่นกัน) เช่นนี้ฉันเชื่อว่าสิ่งนี้อาจเปลี่ยนไปเป็นโปรแกรมขนาด 78 ไบต์
Jonathan Allan

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)

ลองออนไลน์!

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

ฟังก์ชั่นวนซ้ำ ใช้xเป็นอินพุตซึ่งเก็บคะแนน เริ่มต้นsแกนและcounts จำนวนรอบที่โยน

คำสั่ง 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 ถ้าเป็นการนัดหยุดงานแน่นอนว่าเป็นกรณีนี้ หากเป็นอะไหล่ก็ใช้งานได้เช่นกัน ดังนั้นถ้านี่เป็น TRUE เราบวก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

แก้ไข : วิธีการเขียนใหม่ที่หนักหน่วงคัดลอกผลงานของกองซ้อนที่ดีของ Howard ฉันมั่นใจมากขึ้นสามารถถูกแยกออกเพื่อเข้าถึงองค์ประกอบสุดท้ายของอาร์เรย์โดยไม่ทำลายมัน ...


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

ลิงก์ monadic ยอมรับรายการจำนวนเต็มและส่งคืนจำนวนเต็ม

ลองออนไลน์!

อย่างไร?

คำนวณคะแนนของการวิ่งสามครั้งที่ทับซ้อนกันของสามโบวล์ราวกับว่ามันเป็นเกมที่เริ่มต้นที่จุดเริ่มต้นของเฟรมและผนวกตัวระบุการนัดหยุดงาน ( -1) เพื่อทำให้รายการผลลัพธ์นี้แบนแล้วแยกมันออกจากตัวระบุการนัดหยุดงาน แต่ละอัน (ลบคะแนนของการวิ่งที่ไม่ได้เริ่มต้นด้วยการเริ่มเฟรม)

เพื่อรองรับเฟรมสุดท้ายศูนย์จะถูกผนวกเข้ากับอินพุตเป็นครั้งแรก (เพื่ออนุญาตให้การแบ่งส่วนสามอย่างชาญฉลาดเพื่อให้เฟรมเริ่มต้นในสิ่งที่เป็นชามถัดไป) และคะแนนที่ได้จะถูกตัดให้เหลือสิบอันดับแรก เป็นไปได้ว่าเป็นการปลอมเฟรมที่ 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

Perl, 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

น่าเศร้าที่มีบางกรณีที่มันล้มเหลว ฉันจะมาและทำซ้ำในภายหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.