Bagatelle เพียง


13

ความท้าทาย

รับบอร์ด bagatelle เหมือนด้านล่าง:

|                    |
|    /\            / |
|      \            /|
|  \      \ /\    \  |
|   \   /       \    |
|\     /   /  \      |
|   \            / \ |
|    \               |
|  \    / \ /\    \  |
|\     /   /  \     /|
|                /   |
|    /\         /  / |
|              /     |
|\     /   /  /      |
|                    |
----------------------

งานของคุณคือเปลี่ยนรายการ 'พ่น' เป็นคะแนน

กระดานจะมีความกว้าง 20 ตัวอักษร (บวก 2 ขอบ) เสมอ แต่มีความสูงผันแปรได้ การโยน 'แต่ละครั้ง' หมายถึงหมายเลขที่ลูกบอลตกลงไปในกระดานโดยเริ่มต้นที่ 0 สำหรับซ้ายสุดจนถึง 19 สำหรับขวาสุด ลูกแต่ละคนจะล้มลงตรงจนกว่าจะพบหรือ/ \การพบกับ/การเลื่อนลูกบอลหนึ่งคอลัมน์ทางด้านซ้ายและการ\เลื่อนลูกบอลหนึ่งคอลัมน์ไปทางขวา หลังจากที่ถูกขยับบอลยังคงตรงลงเหมือนเมื่อก่อน คะแนนสำหรับการโยนจะขึ้นอยู่กับที่ลูกบอลกระทบด้านล่างของกระดาน

คะแนนสำหรับการจบแต่ละตำแหน่งมีดังนี้:

|                    |
----------------------
 01234567899876543210

และเหมือนกันสำหรับทุกบอร์ด แถวแรกและแถวสุดท้ายจะว่างเปล่าเสมอ ลูกมีการประกันการเข้าถึงด้านล่างโดยไม่คำนึงถึงว่ามันอยู่ที่ไหนลดลงจากดังนั้นจะมีแผงไม่มีที่จะสามารถได้รับการติดโดย\/, \|หรือ|/รวมกัน

อินพุต

การป้อนข้อมูลจะอยู่ใน STDIN และจะประกอบด้วยคณะกรรมการตามด้วยบรรทัดว่างแล้วตามด้วยช่องว่างคั่นรายการตัวเลขที่แสดงการขว้าง

เอาท์พุต

Ouput ควรจะเป็นคะแนนรวมสำหรับเกมที่กำหนด

ตัวอย่างบางส่วน

อินพุต

|                    |
| \                  |
|  \                 |
|   \                |
|    \               |
|     \              |
|      \             |
|       \            |
|        \           |
|         \          |
|          \         |
|           \        |
|            \       |
|             \      |
|              \     |
|               \    |
|                \   |
|                 \  |
|                    |
|                    |
----------------------

1 4 2 19 0 2 4 3 17 13 16

เอาท์พุต

9

อินพุต

|                    |
| \                / |
|  \              /  |
|   \            /   |
|    \          /    |
|     \        /     |
|      \      /      |
|       \    /       |
|        \  /        |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
----------------------

15 10 3 8 18 19 0 6 7 10

เอาท์พุต

72

อินพุต

|                    |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
|                    |
----------------------

1 4 18 17 14 2 0 19 15

เอาท์พุต

18

สคริปต์ทดสอบ

ฉันใช้สคริปต์ทดสอบที่เขียนโดยJoeyและVentero (ฉันหวังว่าพวกเขาจะไม่สนใจ ... ) เพื่อสร้างแบบทดสอบสำหรับงานนี้: -

การใช้งาน: ./test [your program and its arguments]

นี่คือ codegolf - ทางออกที่สั้นที่สุดชนะ


คุณสามารถมีสคริปต์สร้างของฉันสำหรับพวกเขาเช่นกัน :-) ในที่สุดฉันก็ต้องการเผยแพร่ต่อสาธารณชน แต่ตราบใดที่ยังต้องการการปรับแต่งสำหรับงานหลายอย่างฉันไม่ต้องการทำเช่นนั้น
Joey

@Joey สคริปต์การสร้างจะเป็นเครื่องมือที่มีประโยชน์ที่จะมีให้
Gareth

การทดสอบทั้งสองชุดควรได้รับการแก้ไขแล้ว
Gareth

คำตอบ:


3

GolfScript 60ตัวอักษร 59

n/{},)\);{1>:x,,{.x=31%4%(+}%}%[10,.-1%+]+0@[~]{2${=}/+}/\;

ฉันถูกล่อลวงให้เขียนโซลูชันที่ทำงานโดยการกำหนดสัญลักษณ์/ใหม่\และspaceแต่จริงๆแล้วมันค่อนข้างแพง (โดยเฉพาะเมื่อคุณไม่สามารถใช้ต้นฉบับได้อีกต่อไป\)

31%4%(จะแหว่งจากสารละลายคีแรนดัลและแผนที่รหัส ASCII สำหรับspace, /และ\เพื่อ0, -1, 1ตามลำดับ (ดูประวัติการแก้ไข)


1
ยาวอย่างน่าประหลาดสำหรับ GolfScript :-) คุณทำให้มันทำงานกับสคริปต์ทดสอบได้อย่างไร สิ่งที่ฉันได้รับคือข้อผิดพลาดเมื่อฉันพยายาม./test ruby golfscript.rb peter.gs? ฉันโยนการทดสอบบางอย่างไปเป็นอินพุตแบบ piped แทน
Gareth

./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
ปีเตอร์เทย์เลอร์

4

Python 2, 147 132 130 ตัวอักษร

sys นำเข้า
s = 0
L = รายการ (sys.stdin)
สำหรับ t ใน l [-1] .split ():
 p = int (t) 1
 สำหรับ r ใน l [: - 3]: p- = "/".find(rutyp])
 s = + นาที (P-1,20-P)
พิมพ์

2
อาจจะs+=min(p,19-p)?
Keith Randall

2
for r in l[:-3]:p-=" /".find(r[p])ควรบันทึกสองสามตัวอักษร
gnibbler

1
ขอบคุณสอง โดยเฉพาะอย่างยิ่งเคล็ดลับ gnibbler คือน่ากลัวจริง - แต่ก็ไม่สามารถทำร้ายที่จะรู้ว่าฟังก์ชั่นไตรสั้นเกินไป;)
cemper93

1
@gnibbler นั่นเป็นเคล็ดลับอัจฉริยะ
Gareth

1
19-p+1 == 20-p
Lowjacker

3

Python, 165 159 ตัวอักษร

import sys
A=list(sys.stdin)
C=range(10)
C+=C[::-1]
for L in A[-4::-1]:C=[C[i+ord(L[i+1])%31%4-1]for i in range(20)]
print sum(C[int(x)]for x in A[-1].split())

มันเริ่มต้นด้วยแถวของคะแนนและทำงานจากด้านล่างขึ้นไปคำนวณว่าคะแนนจะเป็นอย่างไรสำหรับลูกบอลที่เริ่มต้นในแต่ละแถว


list(sys.stdin)แทนreadlines()
gnibbler

3

ทับทิม, 123 117 115 107 99 98 97

*b,_,_,n=*$<
p eval n.split.map{|k|i=k.to_i+1
b.map{|l|i-='\ /'.index(l[i])-1}
[i-1,20-i].min}*?+

1
เหตุใดจึงต้องใช้กู้ภัย คุณไม่สามารถตัดสองบรรทัดจาก b ในการกำหนดเริ่มต้นได้หรือไม่
migimaru

@migimaru: แน่นอน แต่ฉันต้องตัดสามบรรทัดไม่ใช่สองเส้น
Lowjacker

ขวา. ฉันหมายถึงสองเพิ่มเติมสาย ขอโทษ
migimaru

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