คะแนนโบว์ลิ่งสิบพิน - รุ่นโบว์ลิ่งโลก


20

คะแนนโบว์ลิ่งโลก

หลายคนไปที่ศูนย์โบว์ลิ่งในพื้นที่เพื่อเล่นโบว์ลิ่งไม่กี่เกมและหลายคนยังคงดิ้นรนเพื่อคำนวณคะแนนของพวกเขา World Bowling ได้แนะนำระบบการให้คะแนนที่ง่ายขึ้นเพื่อดึงดูดผู้คนให้เข้าร่วมการแข่งขันมากขึ้น ระบบการให้คะแนนนี้ใช้ในเกมระหว่างประเทศ

ระบบการให้คะแนนทำงานเช่นนี้ (จากWikipedia ):

ระบบการให้คะแนนโบว์ลิ่งของโลก - อธิบายว่า "การให้คะแนนเฟรมปัจจุบัน" [32] - ผลตอบแทนพินดังต่อไปนี้:

  • การนัดหยุดงาน: 30 (ไม่คำนึงถึงผลของการหมุนต่อเนื่อง)
  • สำรอง: 10 บวก pinfall ในม้วนแรกของเฟรมปัจจุบัน
  • เปิด: pinfall ทั้งหมดสำหรับกรอบปัจจุบัน

หากคุณไม่คุ้นเคยกับโบว์ลิ่งสิบพินนี่คือบทสรุป

มี 10 พินในตอนท้ายของเลนโบว์ลิ่งที่เป้าหมายคือการทำให้พวกเขาทั้งหมดล้มลงด้วยลูกโบว์ลิ่ง คุณได้รับลูกบอล 2 ลูกเพื่อพยายามล้มพวกเขาทั้งหมดโดยเฉพาะอย่างยิ่งการตีพวกเขาทั้งหมดด้วยการหมุนรอบแรก (เรียกว่าการโจมตี ) หากคุณได้รับการตีจากนั้นกรอบนั้นจะเสร็จสมบูรณ์และคุณไม่จำเป็นต้องหมุนลูกบอลเป็นครั้งที่สอง นัดหยุดงานมีค่า 30

หากคุณไม่ล้มลงทั้งสิบคุณจะได้รับอีกหนึ่งม้วน หากคุณเคาะลงทั้งหมดของหมุดที่เหลือที่เป็นที่รู้จักกันเป็นอะไหล่ คะแนนมีค่า 10 พิน + จำนวนพินที่ล้มในการหมุนครั้งแรก ตัวอย่างเช่นถ้าฉันล้มลง 7 พินจากนั้นก็จัดการที่จะล้มลง 3 ที่เหลือนั่นจะมีค่า 17

ถ้าหลังจากม้วนที่สองคุณล้มเหลวในการเคาะลงสิบทั้งหมดที่เป็นที่รู้จักในฐานะที่เป็นกรอบเปิด คะแนนมีค่าเท่ากับจำนวนพินทั้งหมดที่ล้มลงสำหรับเฟรมนั้น

มี10 เฟรมในเกม หากคุณคุ้นเคยกับการให้คะแนนโบว์ลิ่งแบบดั้งเดิมคุณจะไม่ได้รับคะแนนเพิ่มในเฟรมที่ 10 ด้วยการให้คะแนนโบว์ลิ่งโลก ในการให้คะแนนโบว์ลิ่งแบบดั้งเดิมนั้นจะใช้เวลา 12 ครั้งติดต่อกันเพื่อให้ได้คะแนนที่สมบูรณ์แบบ 300 คะแนนในขณะที่การให้คะแนน World Bowling นั้นต้องการเพียง 10 ครั้งติดต่อกัน

ท้าทาย

ความท้าทายของคุณคือการคำนวณคะแนนที่ได้รับจากแผ่นคะแนน

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

อินพุต

คุณจะได้รับสตริงที่ประกอบด้วยคะแนนสำหรับแต่ละเฟรมและจะมีทั้งหมดสิบเฟรม แต่ละเฟรมจะมีค่าสูงสุดสองค่าหรือน้อยกว่า 1 ค่าหากมีการประท้วง อินพุตของคุณอาจเป็นพารามิเตอร์สตริงไปยังฟังก์ชันอ่านจากไฟล์หรือจาก STDIN

ตัวอย่างเช่นถ้าฉันล้มลง 1 พินในม้วนแรกของฉันจากนั้นล้มลง 2 เฟรมจะมีลักษณะเป็น "12" สิ่งนี้ไม่ได้หมายความว่า 12 (สิบสอง) แต่หมายถึง 1 และ 2 รวมเป็น 3

หากฉันพลาดพินทุกครั้งที่มีทั้งม้วน (ลูกรางน้ำ) มันจะมีลักษณะเช่นนี้ "-" (คะแนน 0)

แต่ละเฟรมจะถูกคั่นด้วยช่องว่าง

ตัวอย่างอินพุต

-- 9- -9 X -/ 8/ 71 15 44 X

เพื่อแยกตัวอย่างนี้

  • Frame 1 (-) - พลาดทั้งสองม้วน คะแนน 0
  • กรอบ 2 (9-) - ล้มลง 9 ในม้วนแรกที่พลาดในม้วนที่สอง คะแนน 9
  • Frame 3 (-9) - ทำพลาดในครั้งแรกได้ 9 อันในวินาที คะแนน 9
  • Frame 4 (X) - โจมตีล้มลงทั้งสิบตัว คะแนน 30
  • กรอบ 5 (- / /) - อะไหล่พลาดทั้งหมดในครั้งแรกล้มลงทั้งหมดด้วยม้วนที่ 2 คะแนน 10 + 0 = 10
  • กรอบ 6 (8 /) - อะไหล่, 8 พินในม้วนแรก, เคาะลงอีก 2 ด้วยม้วนที่ 2 คะแนน 10 + 8 = 18
  • กรอบ 7 (71) - เปิดเฟรม 7 พินในม้วนแรก, 1 พินในม้วนที่สอง คะแนน 7 + 1 = 8
  • เฟรม 8,9,10 ทำตามตัวอย่างเดียวกับด้านบน

เอาท์พุต

เอาต์พุตจะเป็นค่าที่มีผลรวมของคะแนนจากทั้ง 10 เฟรม การใช้อินพุตตัวอย่างเอาต์พุตจะเป็น 128 เอาต์พุตของคุณอาจเป็นสตริงหรือชนิดตัวเลข มันอาจจะเป็นค่าตอบแทนฟังก์ชั่นหรือเขียนถึง STDOUT

กฎระเบียบ

  • สมมติว่าอินพุตจะถูกต้องเสมอ ตัวอย่างเช่นเฟรมที่ไม่ถูกต้องจะเป็น "/ 8", "XX", "123", "0" ฯลฯ
  • คุณไม่จำเป็นต้องกังวลเกี่ยวกับการแยกหรือการทำผิดกติกา
  • รหัสของคุณอาจเป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่ใช้ในสตริงและส่งกลับคะแนน
  • รหัสของคุณต้องไม่ส่งข้อยกเว้นใด ๆ
  • นี่คือรหัสกอล์ฟคำตอบที่มีจำนวนไบต์น้อยที่สุดเป็นผู้ชนะ
  • ภาษาที่ใช้รวมหรือนำเข้าจะต้องรวมคำสั่งการนำเข้าเป็นส่วนหนึ่งของรหัสและนับรวมเป็นจำนวนไบต์

กรณีทดสอบ

"-- 9- -9 X -/ 8/ 71 15 44 X" -> 128
"-- -1 2- 12 22 5- 42 61 8- 72" -> 45
"X X X 1/ 2/ 3/ 4/ 5/ -- 9/" -> 174
"X X X X X X X X X X" -> 300
"-- -- -- -- -- -- -- -- -- --" -> 0

21
ฉันผิดหวังที่นี่ไม่ใช่ความท้าทายในการโยนรหัส
Jo King

13
ตัวอย่างว่างแรกของคุณบอกว่าคะแนนจะเป็น 13 แต่ฉันคิดว่ามันควรจะเป็น 17
โจ

@Jo จับดี. ฉันได้อัปเดตคำถามเพื่อแก้ไขข้อผิดพลาดนั้น
Makotosan

@ โจกิ้งฉันคิดว่านี่เป็นความท้าทายในการเขียนรหัสซึ่งประกอบด้วย 10 subchallenges เมื่อฉันเห็นชื่อครั้งแรก
Weijun Zhou

1
หนึ่งในความท้าทายที่มีการบันทึกและเขียนที่ดีที่สุดที่ฉันได้เห็น
Joshua

คำตอบ:



7

จาวาสคริปต์, 43 ไบต์

f=([c,...s])=>c?({'/':10,X:30}[c]|c)+f(s):0

มันทำงานอย่างไร

เราแปลงอักขระแต่ละตัวเป็นจุด:

  • 'X' มีค่า 30 คะแนน
  • '/' คุ้มค่า 10 คะแนน
  • '1' .. '9' มีค่า 1 .. 9 จุด
  • ตัวละครอื่น ๆ ที่มีค่า 0 คะแนน

จากนั้นรวมคะแนนทั้งหมด

แปลง

ตัวดำเนินการBitwise OR|แปลงตัวถูกดำเนินการเป็น Int32 ก่อนใช้งาน เมื่อแปลงเป็น Int32 ค่าแรกจะแปลงเป็นรูปแบบ Number (64 บิตจำนวนลอย) จากนั้นจะเก็บเป็น Int32 (หรือแปลงเป็น 0 หากไม่ถูกต้อง)

  • ToInt32({'/':10,X:30}[c]) สามารถอ่านได้เป็น:
    • ถ้า c == '/': ผลลัพธ์คือ 10;
    • ถ้า c == 'X': ผลลัพธ์คือ 30;
    • มิฉะนั้น: ผลลัพธ์คือToInt32(undefined)-> ToInt32(NaN)-> 0;
  • ToInt32(c) อาจจะเป็น:
    • ถ้า c == '1' ... '9': ผลลัพธ์คือ 1 .. 9;
    • ถ้า c == '': Number(c)เป็น 0 ผลลัพธ์จะเป็น 0;
    • มิฉะนั้น: Number(c)คือNaNผลลัพธ์คือ 0;
  • Bitwise หรือที่นี่เหมือนกับ "เพิ่ม" เนื่องจากหนึ่งในตัวถูกดำเนินการจะเป็น 0

รวม

  • [c,...s] = sอนุญาตc = s[0]และs = s.slice(1);
    • ถ้าคือสตริงว่าง c คือไม่ได้กำหนด ;
    • มิฉะนั้น c คืออักษรตัวแรกของ s
  • ไม่ได้กำหนดเป็นเท็จสตริงที่ไม่ว่าง (รวมถึงพื้นที่) เป็นความจริง

1
คุณอธิบายรหัสของคุณได้ไหม ดูดีจริงๆ
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz เพิ่งเพิ่มบางส่วน
tsh

5

Stax , 13 ไบต์

─*âⁿ┴8òt↨HÉ÷8

เรียกใช้และแก้ไขข้อบกพร่อง

แกะคลายและแสดงความคิดเห็นว่าเป็นเช่นนั้น

F               for each character in input, execute...
 9R$'/20*+'X+   build the string "123456789////////////////////X"
 I              get the index of the current character in string
 ^+             increment and add to running total
                (index is -1 when no match; space and dash are 0 score)

เรียกใช้อันนี้



3

Java 8, 64 59 46 ไบต์

s->s.map(c->c<46?0:c<48?10:c>87?30:c-48).sum()

-5 ไบต์ขอบคุณที่@Neil
-13 ไบต์ขอบคุณที่@ OlivierGrégoire

คำอธิบาย:

ลองออนไลน์

s->               // Method with an IntStream parameter and integer return-type
  s.map(c->       //  Loop over the characters
          c<46?   //   If the character is a space or '-':
           0      //    Count it as 0
          :c<48?  //   Else-if it's a '/':
           10     //    Count it as 10
          :c>87?  //   Else-if it's an 'X':
           30     //    Count it as 30
          :       //   Else (it's a digit):
           c-48   //    Count it as the value of the digit
       ).sum()    //   And sum everything

1
("123456789//"+1e6+1e6+"X")ดูเหมือนว่าจะบันทึก 5 ไบต์
Neil

นั่นเป็นเทคนิคที่ฉลาดในการสร้างสตริงฟิลเลอร์
Makotosan


3

F #, 106 103 ไบต์

let s c=Seq.sumBy(fun x->if x=' '||x='-'then 0 elif x='X'then 30 elif x='/'then 10 else int(string x))c

ลองออนไลน์!

ฉันคิดว่าปริศนานี้ (โดยไม่ต้องเล่นกอล์ฟ) จะเป็นคำถามที่ยอดเยี่ยมสำหรับคำแนะนำ และฉันควรรู้!

-3 จาก Kevin Cruijssen เพื่อให้ทราบว่าสามารถลบช่องว่างระหว่าง 'และ "จากนั้น" ขอบคุณ!

โซลูชัน Stax ของ recursive ในการใช้ดัชนีสตริงนั้นดีมาก หากคุณย้ายไปที่ F # คุณสามารถรับได้77 ไบต์ :

let s c=Seq.sumBy(fun x->"123456789/???????????????????X".IndexOf(char x)+1)c

ลองใช้ออนไลน์!


1
ฉันไม่ทราบ F # ดีมาก แต่ดูเหมือนว่าคุณสามารถวางช่องว่างหลังจาก'-3 ไบต์
Kevin Cruijssen

ฉันไม่! แต่คุณถูกด่างดี! ขอบคุณ!
Ciaran_McCarthy

2
@Ciaran_McCarthy: ฉันไม่รังเกียจหากคุณคัดลอกโซลูชันของฉันหากคุณต้องการรวมไว้ด้วย ผู้คนที่นี่มักจะเปิดใจเกี่ยวกับสิ่งนี้ มันเป็นความร่วมมือแบบร่วมมือกันเพื่อค้นหารหัสที่เล็กที่สุดแม้ว่าจะเป็นการแข่งขันที่เป็นทางการก็ตาม
เรียกซ้ำ

1
ขอบคุณซ้ำ ฉันจะรวมมันเพราะมันเป็นทางออกที่ดีมากและเป็นที่น่าสนใจเพื่อดูว่ามันดูในภาษาต่าง ๆ
Ciaran_McCarthy

2

เยลลี่ขนาด 17 ไบต์

ḟ⁾ -“X0/⁵”yV€o30S

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

ลองออนไลน์!

อย่างไร?

ḟ⁾ -“X0/⁵”yV€o30S - Link: list of characters
 ⁾ -              - literal list of characters [' ','-']
ḟ                 - filter discard
    “X0/⁵”        - literal list of characters ['X','0','/','⁵']
          y       - translate (change 'X's to '0's and '/'s to '⁵'s)
           V€     - evaluate €ach character as Jelly code (the '⁵'s become 10s)
             o30  - logical OR with 30 (change all instances of 0 to 30)
                S - sum

ยังที่ 17:

”/ẋ20ØD;;”XḊiЀ⁸S

ลองดู



2

เรติน่า 17 ไบต์

X
///
/
55
\d
*
_

ลองออนไลน์!

ฉันไม่ได้รับการปรับปรุงเกี่ยวกับการเปลี่ยนแปลง Retina ล่าสุด ฉันจะดูพวกเขามากขึ้นเมื่อฉันได้รับโอกาสและดูว่ามีลูกเล่นใหม่ ๆ ในการลงสนาม รหัสจะเปลี่ยนการโจมตีทั้งหมดเป็นสามชิ้นส่วนอะไหล่ทั้งหมดเป็นสิบคะแนนจากนั้นทุกคะแนนจะเป็นขีดล่างที่สอดคล้องกัน จากนั้นจะนับจำนวนขีดล่าง


2

Perl 5 -pF , 30 27 ไบต์

-3 ไบต์ขอบคุณXcali

#!/usr/bin/perl -pF
$\+=m%/%+3*/X/.0+$_ for@F}{

ลองออนไลน์!


คุณสามารถตัดสองไบต์โดยใช้/X/แทนy/X//และอีกหนึ่งโดยใช้m%/%แทนy%/%%: ลองออนไลน์!
Xcali

@ Xcali Ah แน่นอน สายตาสั้นกอล์ฟคลาสสิกฉันยังคงคิดในแง่ของy///เมื่อฉันทำพวกเขานอกวง ขอบคุณ
Ton Hospel

1

05AB1E , 14 ไบต์

þ`I…/aXS¢ƶT*`O

ลองออนไลน์!

คำอธิบาย

þ`              # Push the digits of the input on the stack (removes everyting that isn't a digit)
  I…/aXS        # Push the input and the array "/","a","X" on the stack
        ¢       # Index of each element in the input ...
         ƶT*    # ... multiplied by its index (a could be anything that can't be found in the input), multiplied by 10.
            `O  # Sum the stack, implicit display

1

J , 33 ไบต์

1#.31|('-123456789',20 1#'/X')i.]

ลองออนไลน์!

คำอธิบาย:

] อินพุต

('-123456789',20 1#'/X')ต่อท้าย 20 /และหนึ่งXในสตริง-123456789

i. ค้นหาดัชนีของอินพุตในสตริงด้านบน

31|modulo 31 - เพื่อกำจัดช่องว่าง - ไม่พบในสตริงดังนั้นi.ส่งคืน 31 สำหรับพวกเขา

1#. ค้นหาผลรวมของดัชนี


เนื่องจาก J และ Red เป็นสองภาษาที่แตกต่างกันโดยสิ้นเชิงจึงเป็นการดีกว่าที่จะโพสต์คำตอบที่แยกกันสองถึงแม้ว่าพวกเขาอาจทำเช่นเดียวกัน คุณสามารถเพิ่มลิงค์จากคำตอบ Red ไปยังคำตอบ J นี้โดยระบุว่าเป็นพอร์ตของคำตอบ J ของคุณ
Kevin Cruijssen

@ Kevin Cruijssen - โอเคขอบคุณ - ฉันจะทำมัน เหตุผลในการโพสต์ข้อความเหล่านี้เข้าด้วยกันก็คือโซลูชั่นสีแดงนั้นไม่สามารถแข่งขันได้ (แม้ว่าจะอ่านได้มาก :))
Galen Ivanov

1

Python 2 , 67 ไบต์

-3 ไบต์ขอบคุณ @KevinCruijssen

lambda I,p='-123456789/'+20*'X':sum(p.rfind(i)for i in I if i in p)

ลองออนไลน์!


1
คุณสามารถบันทึก 3 ไบต์โดยเปลี่ยน'-123456789'+'/'*20+'X':sum(p.index(i)เป็น'-123456789/'+'X'*20:sum(p.rfind(i)
Kevin Cruijssen

@KevinCruijssen ขอบคุณดีมาก!
Dead Possum

1

เยลลี่ 12 ไบต์

⁾/X,“½œ‘y|0S

ลองออนไลน์!

มันทำงานอย่างไร

⁾/X,“½œ‘y|0S  Main link. Argument: s (string)

⁾/X,“½œ‘      Literal; yield [['/', 'X'], [10, 30]].
        y     Transliterate; replace '/' with 10, 'X' with 30.
         |0   Bitwise OR with 0. Bitwise operators attempt to cast to int, mapping 
              '0', ..., '9' to 0, ..., 9. All other characters map to 0.
           S  Take the sum.


1

Kotlinขนาด 50 ไบต์

x->x.sumBy{"123456789/_${Math.E}_X".indexOf(it)+1}

ลองออนไลน์!

หวังว่ามันจะไม่ขัดกับกฏที่จะตอบคำถามของคุณ แต่ฉันต้องการเข้าร่วมในความสนุกสนาน

Math.E2.718281828459045ผลิตค่า ฉันใช้มันเพื่อสร้างสตริงฟิลเลอร์เพื่อผลัก X ไปยังตำแหน่งที่ 30

indexOfรับตำแหน่ง (ตาม 0) ของตัวละครในสตริง "12345 ... " หากไม่พบก็จะส่งกลับ -1 เราเพิ่ม 1 เพื่อทำให้ 0 เหล่านี้และนั่นยังทำให้ 0 ตามตำแหน่งมูลค่าของสตริง


1

PHP, 119 109 ไบต์

-10 ไบต์ขอบคุณ@KevinCruijssen

<?foreach(explode(" ",$argv[1])as$f){[$a,$b]=str_split($f);$n+=$f==X?30:(int)$a+($b=='/'?10:(int)$b);}echo$n;

ลองออนไลน์!


คุณสามารถเปลี่ยน($b=='/'?10+(int)$a:((int)$a+(int)$b))เป็น(int)$a+($b=='/'?10:(int)$b)-10 ไบต์
Kevin Cruijssen

@KevinCruijssen ขอบคุณดูดี! แม้ว่าการดูคำตอบอื่น ๆ ดูเหมือนว่าฉันจะไปในทางที่ผิด / ยาว :)
โจ

0

ถ่าน 23 ไบต์

IΣEχΣES⎇№-/Xλ×χ⌕-//XλIλ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

  Eχ                    Map over 10 frames
      S                 Input the frame
     E                  Map over the characters
            λ           Current character
        №-/X            Search the literal string `-/X`
                    λ   Current character
               ⌕-//X    Find position in literal string `-//X`
             ×χ         Multiply by predefined variable 10
                      λ Current character
                     I  Cast to integer
       ⎇                Ternary
    Σ                   Sum for each frame
 Σ                      Sum over frames
I                       Cast to string for implicit print




0

SNOBOL4 (CSNOBOL4) , 169 151 147 ไบต์

	F =INPUT ' '
R	F '-' =0	:S(R)
T	F 'X' ='_'	:S(T)
S	F LEN(1) . X ARB . Y ' ' REM . F	:F(O)
	X '_' =30
	Y '/' =10
	S =S + X + Y	:(S)
O	OUTPUT =S
END

ลองออนไลน์!

	F =INPUT ' '					;* read input and append a space
R	F '-' =0	:S(R)				;* replace - with 0
T	F 'X' ='_'	:S(T)				;* replace X with _
S	F LEN(1) . X ARB . Y ' ' REM . F	:F(O)	;* set first character to x, remainder up to ' ' to y, and remainder to F
	X '_' =20					;* replace _ in x with 20
	Y '/' =10					;* replace / in y with 10
	S =S + X + Y	:(S)				;* else X and Y are their values so we can sum them
O	OUTPUT =S					;* output the sum
END

0

Clojure 70 ไบต์

#(reduce(fn[s i](+ s(case i\- 0\/ 10\X 30\space 0(bigint(str i)))))0%)

ลองออนไลน์!

เมื่อนำreduceมาใช้กับสตริงอักขระแต่ละตัวจะถูกแปลงเป็นตัวอักษร - ใครจะคิด แต่สิ่งนี้ฉันต้องเขียน\spaceและเจ็บมากกว่าหนึ่งสามารถจินตนาการ นอกจากนี้เมื่อสร้างจำนวนจริงจากถ่านการรวมกันของbigintและstrดูเหมือนจะเป็นการรวมกันที่ใช้งานได้เท่านั้น

นอกเหนือจากการต่อสู้ทั้งหมด: ฟังก์ชั่นไม่ระบุชื่อที่ส่งคืนคะแนนตามธรรมชาติ


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