A Mere Bagatelle

13

Tantangan

Diberikan papan bagatelle seperti di bawah ini:

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

tugas Anda adalah mengubah daftar 'lemparan' menjadi skor.

Papan akan selalu memiliki 20 karakter (ditambah 2 tepi) lebar, tetapi dengan tinggi variabel. Setiap 'lemparan' adalah angka yang menunjukkan di mana bola jatuh ke papan, mulai dari 0 untuk paling kiri hingga 19 untuk paling kanan. Setiap bola akan jatuh lurus ke bawah kecuali jika bertemu dengan a /atau a \. Menghadapi sebuah /bola menggeser satu kolom ke kiri, dan \menggeser bola satu kolom ke kanan. Setelah digeser, bola terus lurus ke bawah seperti sebelumnya. Skor untuk lemparan bergantung pada di mana bola menyentuh bagian bawah papan.

Skor untuk setiap posisi finishing adalah sebagai berikut:

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

dan sama untuk semua papan. Baris pertama dan terakhir akan selalu kosong. Bola dijamin untuk mencapai bagian bawah terlepas dari mana ia dijatuhkan, sehingga tidak akan ada papan tempat ia bisa terjebak oleh \/, \|atau |/kombinasi.

Memasukkan

Masukan akan berada di STDIN, dan akan terdiri dari papan diikuti oleh garis kosong diikuti oleh daftar angka yang dipisahkan spasi yang mewakili lemparan.

Keluaran

Ouput harus menjadi skor total untuk game yang diberikan.

Beberapa contoh

Memasukkan

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

1 4 2 19 0 2 4 3 17 13 16

Keluaran

9

Memasukkan

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

15 10 3 8 18 19 0 6 7 10

Keluaran

72

Memasukkan

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

1 4 18 17 14 2 0 19 15

Keluaran

18

Skrip uji

Saya telah menggunakan beberapa skrip uji yang ditulis oleh Joey dan Ventero (saya harap mereka tidak keberatan ...) untuk membuat beberapa tes untuk tugas ini: -

Pemakaian: ./test [your program and its arguments]

Ini adalah codegolf - solusi menang tercepat.

Gareth
sumber
Anda dapat memiliki skrip pembangkit saya untuk mereka juga :-). Saya akhirnya ingin mengumumkannya kepada publik, tetapi selama masih perlu penyesuaian untuk banyak tugas, saya tidak ingin melakukannya.
Joey
@ Joey Skrip pembuatan akan menjadi alat yang berguna untuk tersedia.
Gareth
Kedua set tes harus diperbaiki sekarang.
Gareth

Jawaban:

3

GolfScript, 60 59 karakter

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

Aku sangat tergoda untuk menulis solusi yang bekerja dengan mendefinisikan kembali simbol-simbol /, \dan space, tapi itu sebenarnya cukup mahal (terutama setelah Anda tidak lagi dapat menggunakan aslinya \).

31%4%(adalah sobek dari solusi Keith Randall dan memetakan kode ASCII untuk space, /, dan \untuk 0, -1, 1masing-masing. (Lihat edit sejarah).

Peter Taylor
sumber
1
Sangat lama untuk GolfScript. :-) Bagaimana Anda membuatnya bekerja dengan skrip uji? Yang saya dapatkan hanyalah kesalahan ketika saya mencoba ./test ruby golfscript.rb peter.gs? Saya melemparkan beberapa tes sebagai input pipa sebagai gantinya.
Gareth
./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Peter Taylor
4

Python 2, 147 132 130 karakter

impor sys
s = 0
l = daftar (sys.stdin)
untuk t dalam l [-1] .split ():
 p = int (t) +1
 untuk r in l [: - 3]: p- = "/".find(r[p])
 s + = min (p-1,20-p)
cetak s
cemper93
sumber
2
Mungkin s+=min(p,19-p)?
Keith Randall
2
for r in l[:-3]:p-=" /".find(r[p])harus menyimpan beberapa karakter
gnibbler
1
Terima kasih dua Terutama trik gnibbler benar-benar hebat - tetapi tidak ada salahnya untuk mengetahui fungsi tri yang lebih pendek juga;)
cemper93
1
@gnibbler Itu trik jenius.
Gareth
1
19-p+1 == 20-p
Lowjacker
3

Python, 165 159 karakter

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

Itu dimulai dengan deretan skor dan berjalan dari bawah ke atas, menghitung berapa skor untuk bola yang dimulai di setiap baris.

Keith Randall
sumber
list(sys.stdin)bukannyareadlines()
gnibbler
3

Ruby, 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}*?+
Lowjacker
sumber
1
Mengapa menggunakan penyelamatan? Tidak bisakah kamu memotong dua baris dari b dalam tugas awal?
migimaru
@migimaru: Memang. Tapi saya harus memotong tiga baris, bukan dua.
Lowjacker
Baik. Maksud saya dua baris lagi . Maaf.
migimaru
1
Anda dapat menggunakan i-='\ /'...sebagai gantinya untuk menyimpan satu karakter lagi
gnibbler