Wiele osób poszło do lokalnego centrum gry w kręgle, aby zagrać w kilka gier w kręgle, a wiele osób nadal próbuje wyliczyć swoje wyniki. World Bowling wprowadził uproszczony system punktacji, aby przyciągnąć więcej osób do sportu. Ten system punktacji jest wykorzystywany w grach międzynarodowych.
System punktacji działa w następujący sposób (z Wikipedii ):
System punktacji World Bowling - opisany jako „bieżąca punktacja klatek” [32] - przyjmuje następujące piny:
- strajk: 30 (niezależnie od wyników rzutów)
- spare: 10 plus pinfall przy pierwszym rzucie bieżącej ramy
- open: całkowity pinfall dla bieżącej ramki
Jeśli nie jesteś zaznajomiony z kręgielnią na 10 pinów, oto podsumowanie.
Na końcu toru do gry w kręgle znajduje się 10 kręgli, których celem jest powalenie ich wszystkich kulą do kręgli. Dostajesz 2 rzuty piłki, aby spróbować powalić je wszystkie, najlepiej powalić je wszystkie pierwszym rzutem (znanym jako uderzenie ). Jeśli dostaniesz ostrzeżenie, ta rama jest zakończona i nie musisz ponownie rzucać piłką. Strajk jest wart 30.
Jeśli nie powalisz wszystkich dziesięciu, otrzymasz jeszcze jeden rzut. Jeśli powalisz wszystkie pozostałe szpilki, jest to znane jako zapasowe . Wynik jest wart 10 pinów + liczba pinów powalonych podczas pierwszego rzutu. Na przykład, jeśli powaliłem 7 szpilek, a następnie udało mi się powalić pozostałe 3, byłoby to warte 17.
Jeśli po drugim rzucie nie uda Ci się powalić wszystkich dziesięciu, nazywa się to otwartą ramą . Wynik jest wart całkowitej liczby wyrzuconych szpilek dla tej ramki.
Gra zawiera 10 klatek . Jeśli jesteś zaznajomiony z tradycyjną punktacją w kręgle, nie uzyskasz dodatkowego rzutu w 10. klatce dzięki World Bowling Scoring. W tradycyjnych punktach do gry w kręgle potrzeba 12 kolejnych uderzeń, aby uzyskać doskonały wynik 300, podczas gdy punktacja w World Bowling wymaga tylko 10 kolejnych uderzeń.
Wyzwanie
Twoim wyzwaniem jest obliczenie podanych wartości z arkusza wyników.
Na karcie wyników chybienie jest oznaczone kreską ( - ), uderzeniem za pomocą X i rezerwowym ukośnikiem ( / ). Jeśli nie mają zastosowania, liczba pinfall jest po prostu oznaczana liczbą (1-9). Faule i podziały są również zapisywane na kartach wyników, ale nie musisz się o to martwić.
Wkład
Otrzymasz ciąg znaków składający się z wyników dla każdej klatki i będziesz miał w sumie dziesięć klatek. Każda ramka będzie miała maksymalnie dwie wartości lub 1 wartość, jeśli wystąpi ostrzeżenie. Dane wejściowe mogą być ciągiem parametrów funkcji, odczytanym z pliku lub ze STDIN.
Na przykład, jeśli przewróciłem 1 kołek przy pierwszym rzucie, a następnie przewróciłem 2, ramka wyglądałaby jak „12”. Nie oznacza to 12 (dwanaście), ale oznacza 1 i 2, w sumie 3.
Gdybym nie trafił w każdy kołek przy obu rolkach (kule rynnowe), wyglądałoby to tak: „-” (wynik 0).
Każda ramka będzie oddzielona spacją.
Przykładowe dane wejściowe
-- 9- -9 X -/ 8/ 71 15 44 X
Aby rozbić ten przykład,
- Ramka 1 (-) - brak dwóch rzutów. zdobył 0
- Frame 2 (9-) - powalony na 9 przy pierwszym rzucie, pominięty przy drugim rzucie. Ocena 9
- Ramka 3 (-9) - Nieodebrane wszystkie za pierwszym razem, otrzymałem 9 za drugim. Ocena 9
- Ramka 4 (X) - Uderzenie, powalenie wszystkich dziesięciu. Ocena 30
- Ramka 5 (- /) - Zapasowa, spudłowała za pierwszym razem, powalona za wszystko przy drugim rzucie. Ocena 10 + 0 = 10
- Ramka 6 (8 /) - Zapasowa, 8 szpilek na pierwszym rolce, powalona na pozostałe 2 za pomocą drugiej rolki. Ocena 10 + 8 = 18
- Rama 7 (71) - otwarta rama, 7 pinów na pierwszym rolce, 1 pin na drugim rolce. Wynik 7 + 1 = 8
- Ramki 8,9,10 przedstawiają te same przykłady, co powyżej.
Wydajność
Wynik będzie po prostu wartością, która ma sumę wyników ze wszystkich 10 klatek. Przy użyciu przykładowego wejścia wynik będzie wynosił 128. Wynik może być ciągiem lub typem liczbowym. Może to być wartość zwracana przez funkcję lub zapisana w STDOUT.
Zasady
- Załóż, że dane wejściowe zawsze będą prawidłowe. Na przykład niepoprawna ramka to „/ 8”, „XX”, „123”, „0” itd.
- Nie musisz się martwić rozłamami lub faulami.
- Kod może być pełnym programem lub funkcją, która pobiera ciąg znaków i zwraca wynik.
- Twój kod nie może zgłaszać żadnych wyjątków.
- To jest golf golfowy, odpowiedź z najmniejszą liczbą bajtów wygrywa.
- Języki, które używają obejmują lub importują, muszą zawierać instrukcje importu jako część kodu i liczyć się do liczby bajtów.
Przypadki testowe
"-- 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
Odpowiedzi:
05AB1E ,
1211 bajtówKod
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript, 43 bajty
Pokaż fragment kodu
Jak to działa
Konwertujemy każdą postać na jej punkt:
Następnie zsumuj wszystkie punkty.
Konwertować
Bitowy operator LUB
|
konwertuje swój operand na Int32 przed wykonaniem operacji. Podczas konwersji na Int32 wartość najpierw konwertuje na format Number (liczba zmiennoprzecinkowa 64-bitowa), a następnie trunk do Int32 (lub konwertuje na 0, jeśli jest niepoprawna).ToInt32({'/':10,X:30}[c])
może być odczytany jako:ToInt32(undefined)
->ToInt32(NaN)
-> 0;ToInt32(c)
możliwe:Number(c)
wynosi 0, wynikiem jest 0;Number(c)
jestNaN
, wynikiem jest 0;Suma
[c,...s] = s
niechc = s[0]
is = s.slice(1)
;źródło
Stax , 13 bajtów
Uruchom i debuguj
Rozpakowałem, nieprzylepiłem i skomentowałem to w ten sposób.
Uruchom ten
źródło
Python 2 , 55 bajtów
Wypróbuj online!
Oparty na podejściu indeksowym wielu rozwiązań.
źródło
Java 8,
645946 bajtów-5 bajtów dzięki @Neil .
-13 bajtów dzięki @ OlivierGrégoire .
Wyjaśnienie:
Wypróbuj online.
źródło
("123456789//"+1e6+1e6+"X")
wydaje się oszczędzać 5 bajtów.F #,
106103 bajtówWypróbuj online!
Myślę, że ta łamigłówka (bez gry w golfa) byłaby świetnym pytaniem dla przewodnika „Programowanie funkcjonalne dla początkujących”. I powinienem wiedzieć!
-3 od Kevina Cruijssena, za wykrycie, że białe spacje między „a” wtedy można usunąć. Dzięki!
Rozwiązanie rekurencyjne Staxa wykorzystujące indeksy łańcuchowe jest bardzo dobre. Jeśli przeniesiesz go do F #, możesz uzyskać go za 77 bajtów :
Wypróbuj to online!
źródło
'
-3 bajtach.Galaretka , 17 bajtów
Monadyczny link akceptujący listę znaków i zwracający liczbę całkowitą
Wypróbuj online!
W jaki sposób?
Również o 17:
Spróbuj tego
źródło
Perl 6 , 30 bajtów
Wypróbuj online!
źródło
Siatkówka , 17 bajtów
Wypróbuj online!
Nie jestem na bieżąco z najnowszymi zmianami w Retinie. Przyjrzę się im bardziej, kiedy będę miał szansę i sprawdzę, czy są jakieś nowe sztuczki do gry w golfa. Kod zamienia wszystkie ostrzeżenia w trzy części zamienne, wszystkie części zamienne w dziesięć punktów, a następnie wszystkie punkty w odpowiednią liczbę znaków podkreślenia. Następnie zlicza liczbę znaków podkreślenia.
źródło
Perl 5
-pF
,3027 bajtów-3 bajty dzięki Xcali
Wypróbuj online!
źródło
/X/
zamiasty/X//
i jeszcze jeden, używającm%/%
zamiasty%/%%
: Wypróbuj online!y///
kiedy zrobiłem je poza pętlą. Dzięki05AB1E , 14 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
J , 33 bajty
Wypróbuj online!
Wyjaśnienie:
]
wejście('-123456789',20 1#'/X')
dodaje 20/
i jedenX
do ciągu-123456789
i.
znajduje indeksy wejściowe w powyższym ciągu31|
modulo 31 - aby pozbyć się spacji - nie znajdują się w ciągu, więci.
zwraca za nie 311#.
znajduje sumę wskaźnikówźródło
Python 2 , 67 bajtów
-3 bajty dzięki @KevinCruijssen
Wypróbuj online!
źródło
'-123456789'+'/'*20+'X':sum(p.index(i)
na'-123456789/'+'X'*20:sum(p.rfind(i)
Galaretka , 12 bajtów
Wypróbuj online!
Jak to działa
źródło
Python 3.6 , 54 bajty
Wypróbuj online!
źródło
Kotlin , 50 bajtów
Wypróbuj online!
Mam nadzieję, że odpowiedź na twoje pytanie nie jest sprzeczna z zasadami, ale chciałem dołączyć do zabawy.
Math.E
tworzy wartość2.718281828459045
. Używam go, aby utworzyć ciąg wypełniający, aby wypchnąć X do pozycji 30.indexOf
pobiera pozycję (w oparciu o 0) znaku w ciągu „12345 ...”. Jeśli nie zostanie znaleziony, zwraca -1. Dodajemy 1, aby te 0, i to również powoduje, że pozycja oparta na 0 jest wartością ciągu.źródło
PHP,
119109 bajtów-10 bajtów dzięki @KevinCruijssen
Wypróbuj online!
źródło
($b=='/'?10+(int)$a:((int)$a+(int)$b))
, aby(int)$a+($b=='/'?10:(int)$b)
do -10 bajtów.Węgiel , 23 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
źródło
Czerwony , 93 bajty
Wypróbuj online!
źródło
C # (.NET Core) , 40 + 18 = 58 bajtów
Wypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) , 53 bajty
Wypróbuj online!
źródło
SNOBOL4 (CSNOBOL4) ,
169151147 bajtówWypróbuj online!
źródło
Clojure , 70 bajtów
Wypróbuj online!
Podczas
reduce
przetwarzania ciągu znaków każdy znak jest w rzeczywistości konwertowany na znak - kto by pomyślał. Ale to wszystko, muszę pisać\space
i to boli więcej niż można sobie wyobrazić. Ponadto podczas tworzenia rzeczywistej liczby z znaku kombinacjabigint
istr
wydaje się być jedyną możliwą do użycia kombinacją.Poza tymi wszystkimi zmaganiami: funkcja anonimowa, która zwraca wynik jako naturalny.
źródło
Rubinowy , 38 bajtów
Wypróbuj online!
źródło