Sadece Bagatelle


13

Meydan okuma

Aşağıdaki gibi bir bagatelle tahtası verildi:

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

Senin görevin 'atar' listesini bir puana dönüştürmek.

Kart her zaman 20 karakter (artı 2 kenar) genişliğinde, ancak değişken yükseklikte olacaktır. Her 'atış', topun tahtaya nereye düştüğünü gösteren bir sayıdır ve en sol için 0'dan en sağ için 19'a kadar başlar. Her top, a /veya a ile karşılaşmadıkça düz olarak düşecektir \. Vites ile karşılaşmak /, topu bir sütun sola \kaydırır ve topu bir sütun sağa kaydırır. Vites değiştirildikten sonra top önceki gibi düz devam eder. Atış puanı, topun tahtanın tabanına vurduğu yere bağlıdır.

Her bitirme pozisyonu için puanlar aşağıdaki gibidir:

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

ve tüm kartlar için aynıdır. İlk ve son satırlar her zaman boş olacaktır. Top olursa olsun düştü nerede alt ulaşmak için garanti edilir, bu nedenle bu tarafından tuzağa alabilirsiniz panoları olacak \/, \|ya da |/kombinasyonları.

Giriş

Girdi STDIN'de olacak ve panonun ardından boş bir satır ve ardından atışları temsil eden boşlukla ayrılmış bir sayı listesinden oluşacaktır.

Çıktı

Çıkış, verilen oyunun toplam puanı olmalıdır.

Birkaç örnek

Giriş

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

1 4 2 19 0 2 4 3 17 13 16

Çıktı

9

Giriş

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

15 10 3 8 18 19 0 6 7 10

Çıktı

72

Giriş

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

1 4 18 17 14 2 0 19 15

Çıktı

18

Test komut dosyaları

Bu görev için bazı testler oluşturmak için Joey ve Ventero tarafından yazılan bazı test komut dosyaları kullandım (umarım umursamazlar ...): -

Kullanımı: ./test [your program and its arguments]

Bu kodgolf - en kısa çözüm kazanır.


Sen de benim için senaryom olabilir :-). Sonunda bunu kamuoyuna açıklamak istedim ama hala birçok görev için ince ayar yapmaya ihtiyaç duyduğu sürece bunu yapmak istemedim.
Joey

@Joey Oluşturma komut dosyası kullanılabilir olması için yararlı bir araç olacaktır.
Gareth

Her iki test seti de şimdi düzeltilmelidir.
Gareth

Yanıtlar:


3

GolfScript, 60 59 karakter

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

Öyle sembolleri yeniden tanımlayarak çalışır bir çözüm yazmak için cazip oldu /, \ve spacefakat (artık orijinali kullanabilirsiniz özellikle bir kez aslında oldukça pahalı \).

31%4%(Keith Randall çözeltisinden çalıp için ASCII kodları haritalar edilir space, /ve \hiç 0, -1, 1sırasıyla. (Bkz. Düzenleme geçmişi).


1
GolfScript için şaşırtıcı derecede uzun. :-) Test komut dosyası ile çalışmayı nasıl başardınız? Denediğimde tek yaptığım hatalar oldu ./test ruby golfscript.rb peter.gsmu? Bunun yerine bazı girişleri borulu girdi olarak attım.
Gareth

./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Peter Taylor

4

Python 2, 147 132 130 karakter

ithalat sys
s = 0
l = listesi (sys.stdin)
t için l [-1] .split ():
 p = int (t) + 1
 l'deki r için [: - 3]: p- = "/".find(r[p])
 s + = dakika (p-1,20-p)
baskı s

2
Belki s+=min(p,19-p)?
Keith Randall

2
for r in l[:-3]:p-=" /".find(r[p])birkaç karakter kaydetmeli
gnibbler

1
İkinize teşekkürler. Özellikle gnibbler'ın hilesi gerçekten harika - ama daha kısa bir tri fonksiyonunu bilmek de zarar
veremez

1
@gnibbler Bu dahice bir numara.
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())

Bir dizi puanla başlar ve her sıradan başlayan toplar için puanların ne olacağını hesaplayarak aşağıdan yukarıya doğru çalışır.


list(sys.stdin)yerinereadlines()
gnibbler

3

Yakut, 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
Kurtarmayı neden kullanmalıyım? İlk ödevdeki b'den iki satırı kesemez misiniz?
migimaru

@migimaru: Gerçekten. Ama üç satır kesmek zorundayım, iki değil.
Lowjacker

Sağ. İki satır daha demek istedim . Üzgünüm.
migimaru

1
i-='\ /'...bunun yerine bir tane daha kaydetmek için kullanabilirsiniz
gnibbler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.