Ten-pin bowling skoru - Dünya Bowling baskısı


20

Dünya Bowling atışı

Birçok kişi birkaç bowling oyunu oynamak için yerel bowling merkezlerine gitti ve birçok kişi skorlarını hesaplamak için mücadele etmeye devam ediyor. World Bowling, spora daha fazla insan çekmek için basitleştirilmiş bir skorlama sistemi sundu. Bu puanlama sistemi uluslararası oyunlarda kullanılmaktadır.

Puanlama sistemi şu şekilde çalışır ( Wikipedia'dan ):

“Mevcut kare skorlaması” [32] olarak tanımlanan Dünya Bowling skorlama sistemi - pimleri şu şekilde atar:

  • Grev: 30 (rulo sonuçlarına bakılmaksızın)
  • yedek: mevcut çerçevenin ilk rulo üzerinde 10 artı pinfall
  • açık: mevcut kare için toplam pinfall

Eğer on pinli bowling ile aşina değilseniz, işte bir özet.

Bir bowling şeridinin sonunda, hedefin hepsini bowling topu ile vurmak olduğu 10 pim var. Hepsini aşağıya vurmaya çalışmak için 2 top top alırsınız, tercihen hepsini ilk topla vururlar ( çarpma olarak bilinir ). Bir vuruş yaparsanız, o zaman bu çerçeve tamamlanır ve topu ikinci kez döndürmeniz gerekmez. Grev 30'a değer.

Eğer hepsini ondan aşağı indirmezseniz, bir rulo daha alırsınız. Kalan tüm pinleri yıkarsanız, yedek olarak bilinir . Skor 10 pim + ilk ruloda yere düşen pim sayısıdır. Örneğin, 7 pimi düşürdüysem, kalan 3'ü düşürmeyi başardım, bu 17 olurdu.

İkinci yuvarlamanızdan sonra, her birini yıkmak için başarısız olursa, bu açık bir çerçeve olarak bilinir . Skor, bu çerçeve için devirilen toplam pin sayısına değiyor.

Bir oyunda 10 kare var . Geleneksel bowling skorlarına aşina iseniz, World Bowling Scoring ile 10. karede fazladan bir top alamazsınız. Geleneksel bowling skorlarında, 300'lük mükemmel bir skor elde etmek için ardışık 12 vuruş yapılırken, World Bowling atışı sadece 10 ardışık vuruş gerektirir.

Meydan okuma

Buradaki zorluk, verilen puanları bir puan tablosundan hesaplamak.

Bir skor sayfasında, bir bayan bir çizgi ile belirtilir ( - ), bir grev bir ile X ve yedek bir çizgi ile ve ( / ). Bunlar geçerli değilse, o zaman pinfall sayısı sadece bir sayı ile gösterilir (1-9). Fauller ve yarıklar da skor tablolarına kaydedilir ancak bunlar için endişelenmenize gerek yoktur.

Giriş

Her kare için puanlardan oluşan bir dize verilecek ve toplamda on kare olacak. Her kare iki değere veya bir grev olursa 1 değer kadar küçük olacaktır. Girişiniz bir işleve dize parametresi, bir dosyadan veya STDIN'den okunabilir.

Örneğin, ilk rulomda 1 pimi düşürdüysem, sonra 2'yi düşürdüysem, çerçeve "12" gibi görünürdü. Bu, 12 (on iki) anlamına gelmez, ancak toplam 3 için 1 ve 2 anlamına gelir.

Her pimi her iki ruloda (oluk toplarıyla) kaçırırsam, "-" (0 puan) gibi görünür.

Her kare bir boşlukla ayrılacaktır.

Örnek giriş

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

Bu örneği yıkmak için,

  • Çerçeve 1 (-) - iki rulo da kaçırıldı. 0 attı
  • Kare 2 (9-) - ilk ruloda 9, ikinci ruloda kaçırıldı. Puan 9
  • Çerçeve 3 (-9) - İlk önce kaçırılan, ikinci olan 9. Puan 9
  • Kare 4 (X) - Grev, her birini yere indirdi. 30 puan
  • Pano 5 (- /) - Yedek, ilk önce hepsini kaçırdı, 2. rulo ile hepsini yere indirdi. Puan 10 + 0 = 10
  • Çerçeve 6 (8 /) - Yedek, ilk ruloda 8 pim, diğer 2'yi 2. rulo ile yere indirdi. Puan 10 + 8 = 18
  • Çerçeve 7 (71) - çerçeveyi açın, ilk ruloda 7 pim, ikinci ruloda 1 pim. Puan 7 + 1 = 8
  • 8,9,10 kasaları yukarıdakilerle aynı örnekleri takip etmektedir.

Çıktı

Çıktı sadece 10 karenin tümünün puanlarının toplamına sahip bir değer olacaktır. Örnek girişi kullanarak çıktı 128 olur. Çıktınız bir dize veya sayısal bir tür olabilir. Bir fonksiyon dönüş değeri olabilir veya STDOUT'a yazılabilir.

kurallar

  • Girişin her zaman geçerli olacağını varsayalım. Örneğin, geçersiz bir çerçeve "/ 8", "XX", "123", "0" vb. Olabilir.
  • Bölmeler veya fauller için endişelenmenize gerek yok.
  • Kodunuz tam bir program veya bir dizgede geçen ve puanı döndüren bir işlev olabilir.
  • Kodunuz istisnalar atmamalıdır.
  • Bu kod golf, bayt sayısının en az olduğu cevabı kazanıyor.
  • Kullanılan veya içe aktarılan diller, içe aktarma ifadelerini kodlarının bir parçası olarak içermeli ve bayt sayısına göre sayılmalıdır.

Test Kılıfları

"-- 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
Bunun bir kod atma mücadelesi olmadığını hayal kırıklığına
Jo King

13
İlk yedek örneğiniz, skorun 13 olacağını, ancak 17 olması gerektiğini düşünüyorum.
Jo.

@Jo. İyi yakalama. Bu hatayı düzeltmek için soruyu güncelledim.
Makotosan

@JoKing Bunun, unvanı ilk gördüğümde 10 alt zorluktan oluşan bir kod atma mücadelesi olduğunu düşünüyordum.
Weijun Zhou 27.03

1
Gördüğüm en iyi belgelenmiş ve yazılı zorluklardan biri.
Joshua

Yanıtlar:


7

05AB1E , 12 11 bayt

kod

S'/T:'X30:O

Çevrimiçi deneyin!

açıklama

S             # Split the string into a list of characters
 '/T:         # Replace '/' with 10
     'X30:    # Replace 'X' with 30
          O   # Sum up the array (ignoring non-number elements)

7

JavaScript, 43 bayt

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

Nasıl çalışır

Her karakteri amacına dönüştürüyoruz:

  • 'X' değeri 30 puan
  • 10 puan değerinde '/'
  • '1' .. '9' değer 1 .. 9 puan
  • 0 puan değerindeki diğer karakterler

Sonra tüm puanları toplayın.

Dönüştürmek

Bitwise OR operatörü |, işlemden önce işlenenini Int32'ye dönüştürür. Int32'ye dönüştürülürken, değer önce Number (64bit float number) biçimine, ardından trunk (Int32) (veya geçersizse 0'a dönüştürülür) biçimine dönüştürülür.

  • ToInt32({'/':10,X:30}[c]) olarak okunabilir:
    • eğer c == '/': sonuç 10;
    • c == 'X' ise: sonuç 30;
    • aksi halde: sonuç ToInt32(undefined)-> ToInt32(NaN)-> 0;
  • ToInt32(c) olabilirdi:
    • c == '1' ... '9' ise: sonuç 1 .. 9;
    • c == '': Number(c)0 ise, sonuç 0'dır;
    • aksi halde: Number(c)is NaN, sonuç 0'dır;
  • Bitsel ya da burada "add" ile aynıdır, çünkü işlenenden biri 0 olacaktır.

toplam

  • [c,...s] = sizin c = s[0]ve s = s.slice(1);
    • s boş dize ise, c tanımsızdır ;
    • Aksi takdirde, c s nin ilk harfidir.
  • tanımsız sahte, boş olmayan dize (boşluk dahil) truthy

1
Kodunu açıklayabilir misin? çok iyi görünüyor
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz Sadece biraz eklendi.
tsh

5

Stax , 13 bayt

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

Koş ve hata ayıkla

Ambalajsız, ağzı açılmış ve böyle yorumladı.

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)

Bunu çalıştır



3

Java 8, 64 59 46 bayt

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

@Neil sayesinde -5 bayt . @ OlivierGrégoire
sayesinde -13 bayt .

Açıklama:

Çevrimiçi deneyin.

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 bayt kurtarıyor gibi görünüyor.
Neil

Bazı dolgu ipleri oluşturmak için akıllıca bir tekniktir.
Makotosan


3

F #, 106 103 bayt

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

Çevrimiçi deneyin!

Bu yapbozun (golf oynamaksızın) "Yeni başlayanlar için fonksiyonel programlama" rehberi için harika bir soru olacağını düşünüyorum. Ve bilmeliyim!

-3 'Kevin Cruijssen'den' ve 'o zaman' arasındaki boşlukların silinebildiğini tespit etmek için. Teşekkürler!

özyinelemenin string dizinlerini kullanma konusundaki Stax çözümü çok çok iyi. F # 'ya taşırsanız , 77 bayt için alabilirsiniz :

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

Bunu çevrimiçi deneyin!


1
F # 'yi çok iyi tanımıyorum, ama boşlukları '-3 bayttan sonra bırakabilirsiniz .
Kevin Cruijssen

Hiçbirini yapmam! Ama haklısın, iyi tespit edildi! Teşekkürler!
Ciaran_McCarthy

2
@Ciaran_McCarthy: Ayrıca eklemek istersem çözümümü kopyalarsan sorun olmaz. Buradaki insanlar genellikle bu konuda oldukça açıklar. Resmen bir rekabet olsa bile, en küçük kodların tümünü bulmak işbirliğine dayalı bir çabadır.
özyinelemeli

1
Özyinelemeli teşekkürler. O zaman ekleyeceğim, çünkü çok güzel bir çözüm ve farklı dillerde nasıl göründüğünü görmek ilginç.
Ciaran_McCarthy

2

Jöle , 17 bayt

ḟ⁾ -“X0/⁵”yV€o30S

Bir karakter listesini kabul eden ve bir tamsayı döndüren tek yönlü bir bağlantı

Çevrimiçi deneyin!

Nasıl?

ḟ⁾ -“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

Ayrıca 17:

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

Bunu dene



2

Retina , 17 bayt

X
///
/
55
\d
*
_

Çevrimiçi deneyin!

Son Retina değişikliklerinde pek güncel değilim. Bir şans yakaladığımda onlara bakıp, golf oynamak için yeni numaralar olup olmadığına bakacağım. Kod tüm grevleri üç bölüme, tüm bölümleri on noktaya, ardından tüm puanları karşılık gelen alt çizgi sayısına dönüştürür. Sonra alt çizgi sayısını sayar.



1

05AB1E , 14 bayt

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

Çevrimiçi deneyin!

açıklama

þ`              # 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 bayt

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

Çevrimiçi deneyin!

Açıklama:

] girdi

('-123456789',20 1#'/X')dizeye 20 /ve birini eklerX-123456789

i. Yukarıdaki dizede girişin indekslerini bulur.

31|modulo 31 - boşluklardan kurtulmak için - dizgede bulunmazlar, bu yüzden i.onlar için 31 döndürür

1#. endekslerin toplamını bulur


J ve Kırmızı tamamen farklı iki dil olduğundan, aynısını yapsalar bile, iki ayrı cevap göndermek daha iyidir. Red cevabından bu J cevabına bir bağlantı ekleyebilir ve J cevabınızın bir bağlantı noktası olduğunu belirtebilirsiniz.
Kevin Cruijssen

@Kevin Cruijssen - Tamam, teşekkürler - Ben yaparım. Onları bir araya getirmenin nedeni, açık bir şekilde Kırmızı çözümün rekabetçi olmamasıdır (çok okunabilir olmasına rağmen :))
Galen Ivanov


1

Jöle , 12 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

⁾/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 bayt

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

Çevrimiçi deneyin!

Umarım kendi sorunuzu cevaplamak kurallara aykırı değildir ama eğlenceye katılmak istedim.

Math.Edeğeri üretir 2.718281828459045. X'i 30. konuma itmek için bir dolgu dizesi oluşturmak için kullanıyorum.

indexOf"12345 ..." dizesindeki karakterin konumunu (0 tabanlı) alır. Bulunmazsa -1 döndürür. Bunları yapmak için 1 ekleriz ve bu da 0-tabanlı konumu dizgenin değeri yapar.


1

PHP, 119 109 bayt

@KevinCruijssen sayesinde -10 bayt

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

Çevrimiçi deneyin!


Değişebilirsin ($b=='/'?10+(int)$a:((int)$a+(int)$b))için (int)$a+($b=='/'?10:(int)$b)-10 bayt için.
Kevin Cruijssen

@KevinCruijssen Teşekkürler, iyi görünüyor! Yine de, diğer cevaplara bakarken, yanlış / uzun yoldan gideceğim gibi görünüyor. :)
Jo.

0

Kömür , 23 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

  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 bayt

	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

Çevrimiçi deneyin!

	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 bayt

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

Çevrimiçi deneyin!

Bir reduceString'in üzerine geldiğinde , her karakter aslında bir karaktere dönüştürülür - kim düşünebilirdi. Fakat bu anlamsız, yazmalıyım \spaceve bu hayal edebileceğinden daha fazla acı veriyor . Ayrıca, bir karakterden gerçek bir sayı oluştururken, kombinasyonu bigintve strkullanılabilir olan tek kombinasyon gibi görünüyor.

Eh, tüm bu mücadelelerin yanı sıra: Puanı doğal olarak veren isimsiz fonksiyon.


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.