Lubię wyzwania związane z grami karcianymi, więc zrobiłem to dla włoskiej gry karcianej Scopa. Moja rodzina gra w tę grę od niepamiętnych czasów. Ma bardzo interesujący system punktacji, który powinien sprawiać przyjemność golfowi. Wyślę odpowiedź w R, aby rozpocząć zabawę, jestem pewien, że ludzie poprawią się.
Wyzwanie: obliczyć liczbę punktów zdobytych w rundzie Scopa, biorąc pod uwagę karty, które gracz złapał podczas rundy jako wkład.
W talii Scopa znajduje się 40 kart. Jeśli używasz talii międzynarodowej, usuwasz 8s, 9s i 10s, pozostawiając A, 2,3,4,5,6,7, Q, J, K w każdym kolorze. 1 Jest dwóch graczy lub partnerów, a po każdej rundzie wszystkie karty zostają schwytane przez jednego lub dwóch graczy. Wynik liczony jest w następujący sposób (więcej informacji tutaj ):
- Gracz z największą liczbą kart zdobywa 1 punkt.
- Gracz z największą ilością diamentów (lub monet, jeśli używa talii włoskiej) zdobywa 1 punkt.
- Gracz z 7 diamentami (lub monetami), znany jako Sette Bello lub Beautiful Seven, zdobywa 1 punkt.
- Gracz z najwyższą primierą zdobywa 1 punkt. Wynik Primiera gracza jest sumą wyników karty o najwyższej wartości, którą gracz przechwycił w każdym kolorze (patrz tabela poniżej). Jeśli nie masz co najmniej jednej karty w każdym kolorze, domyślnie przegrywasz, nawet jeśli Twój wynik przekroczy wynik przeciwnika. W niezwykle rzadkim przypadku, gdy żaden z graczy nie ma co najmniej jednej karty w każdym kolorze, gracz z wyższą sumą primiera zdobywa punkt. 2)
Tabela wyników primiera
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
Gracz może więc zdobyć maksymalnie 4 punkty w rundzie. 3 Jeśli jest remis, który jest możliwy dla kart, diamentów lub primiera , nikt nie zdobywa punktu.
Ważne jest, aby zdawać sobie sprawę, że ponieważ każda karta musi zostać schwytana przez jednego z dwóch graczy, możesz wywnioskować, jakie karty musiał wziąć drugi gracz, nawet jeśli wiesz tylko, jakie karty wziął jeden gracz. Musisz to zrobić, aby poprawnie zdobyć Primiera .
Zasady wyzwania
Wejście
Twój kod powinien pobierać jako dane wejściowe karty przechwycone przez jednego gracza podczas rundy Scopa.
Dane wejściowe muszą być w postaci łańcucha, w którym jeden znak reprezentuje rangę każdej karty, a jeden znak w jej kolorze. Usuwa to potencjalną lukę w przekazywaniuwyników primiera bezpośrednio jako danych wejściowych. Konwersja rang kart nawyniki Primiera musi odbywać się w programie. Możesz jednak użyć pojedynczego ciągu oddzielonego spacjami lub przecinkami, tablicy ciągów lub dowolnego innego formatu. Na przykład, jeśli zdecydujesz się zakodować rangi jako76A5432QJK
i kolory, jakDCHS
możesz użyć danych wejściowych takich jak['7D', '6H', 'QD', 'JS']
lub'7D,6H,QD,JS'
.
Wynik
Liczba całkowita od 0 do 4 reprezentująca wynik gracza.
Zwycięski
Najkrótsza odpowiedź w bajtach wygrywa!
Przypadki testowe
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Zdobywa 4 : 1 punkt za> 20 kart, 1 punkt za> 5 diamentów, 1 punkt za 7 diamentów i 1 punkt za zdobycie 78 w primiera (7,7,7,5, gdy przeciwnik ma 7,6,5, K dla 64)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Wyniki 0 : <= 20 kart, <= 5 karo, nr 7 karo, i zdobywa tylko 69 w primiera (7,7,4,3, gdy przeciwnik ma 7,7,6, K dla 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Wyniki 3 : 1 punkt za> 20 kart, 1 punkt za> 5 diamentów, 1 punkt za 7 diamentów. Primiera byłoby 63 (7,7,7), a przeciwnik może zdobyć tylko 51 (7, P, Q, Q), ale ponieważ ta ręka nie ma piki traci punkt domyślnie.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Wyniki 3 : <= 20 kart, 1 punkt za> 5 diamentów, 1 punkt za 7 diamentów. Primiera tylko zdobywa 51 (7, P, Q, Q), a przeciwnik może zdobyć 63 (7,7,7), ale od ręki przeciwnika nie ma diamentów ta ręka wygrywa primiera punkt domyślnie.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Wyniki 3 : <= 20 kart, 1 punkt za> 5 diamentów, 1 punkt za 7 diamentów. Chociaż ta ręka nie ma pik, nadal wygrywa Primiera wynikiem od 63 do 57 (7,7,7 kontra 7,6,6), ponieważ ręka przeciwnika nie ma diamentów.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Wyniki 2 : <= 20 kart, 1 punkt za> 5 diamentów, 1 punkt za 7 diamentów. Ta ręka nie ma pik, a ręka przeciwnika nie ma diamentów. Przeciwnik wygrywa primiera wynikiem 63 do 41 (7,7,7 w porównaniu z 7, Q, Q).
[]
(pusta tablica)
Wyniki 0
1: Przynajmniej w naszej rodzinie Jack przewyższa Królową w Scopie, ale nie ma to znaczenia dla punktacji.
2: Gram w tę grę od dzieciństwa i nigdy tego nie widziałem, ale twój kod lepiej poradziłby sobie z tą sprawą!
3: Podczas rundy są punkty bonusowe za „zamiatanie”, które ignoruję na potrzeby tego wyzwania.
źródło
Odpowiedzi:
Rubin,
156153 bajtówWypróbuj online!
To używa
;865432000
do reprezentowania76A5432QJK
odpowiednio, a kolory są pisane małymi literami. (Wybór znaków wynika z faktu, że odjęcie 38 od każdego daje wartość primiera, ale tak naprawdę nigdy tego nie robimy, ponieważ liczy się tylko różnica względna).Nie sprawdzamy, czy któryś z graczy brakuje koloru, ponieważ nie jest to konieczne - ponieważ wszystkie karty są liczone jako 38 plus ich rzeczywista wartość, jeśli komuś brakuje koloru, najwyższy możliwy wynik to (21 + 38) * 3 = 177, czyli mniej niż (10 + 38) * 3 + 21 + 38 = 203, najniższy wynik, jaki może uzyskać inny gracz. Nie możemy pozwolić dwóm graczom pominąć różnej niezerowej liczby kolorów, ponieważ graczowi może brakować tylko 0, 1 lub 2 kolorów, a jeśli komuś brakuje 2 kolorów, mają wszystkie karty z pozostałych 2 kolorów.
źródło
R,
320298265238229224211209179 bajtówJest to rozwiązanie głównie ze względu na @digEmAll, w postaci funkcji.
Wypróbuj online!
Poniżej znajduje się najlepsza moja stara mierna próba 209 bajtów.
edycja: gra w golfa poprzez aliasing niektórych funkcji, a następnie przyjęcie pomysłu Doorknob polegającego na dodaniu stałej do wyniku zamiast sprawdzania koloru.
następna edycja: pozbyłem się nadmiaru, a następnie wprowadziłem kilka ulepszeń od Giuseppe
następna edycja: -2 bajty dzięki digEmAll
Jestem w tym okropny, więc jestem pewien, że ktoś może to poprawić, jeśli zechce poświęcić trochę czasu. Czuję się jak
sapply
ifunction
jest bardzo długa i mogę się ich pozbyć, ale nie wiem, jak to zrobić. Dane wejściowe to dwuznakowe ciągi w standardowej notacji.źródło
JavaScript (ES6),
171163 bajtówPobiera dane wejściowe jako zestaw kart, używając ich standardowej reprezentacji.
Wypróbuj online!
Skomentował
źródło
05AB1E , 41 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Kolory
DCHS
są odpowiednio reprezentowane przez0123
. Rangi7A65432KJQ
są odpowiednio reprezentowane przez0123456789
. Są one brane jako ciągi, a nie liczby całkowite, zgodnie z wymaganiami wyzwania (ale następnie 05AB1E konwertuje je na liczby całkowite, gdy są potrzebne).Podobnie jak w innych rozwiązaniach, dodajemy dużą stałą (14) do każdego wyniku primiera, aby zbędne było sprawdzanie brakujących kolorów.
źródło
MS SQL Server 2017 , 525 bajtów
Wypróbuj na skrzypcach db <> .
źródło
Retina 0.8.2 , 334 bajty
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Utwórz listę wszystkich 40 kart.
Wyjmij karty, które gracz trzyma.
Zamień każdą rangę według kolejności sortowania, która wynosi 9 za
7
i 10 mniej niż wartość innych kart.Sortuj karty według koloru i rangi.
Policz liczbę kart w każdym kolorze, a także zdobądź kartę o najwyższym rankingu w każdym kolorze, dwukrotnie zdobywając najwyższy diament.
Sprawdź, czy najwyższy diament to 7.
Usuń wszystkie najwyższe karty, jeśli jeden z kolorów nie ma żadnych kart.
Konwertuj najwyższe karty na ich niepowtarzalny wynik i sumuj je razem. Przekształć również całkowitą liczbę kart i długości kolorów na unary.
Zdobywaj punkty, jeśli suma, diamenty lub primiera są wyższe.
Łączny wynik.
źródło
C # (interaktywny kompilator Visual C #) , 193 bajty
Wypróbuj online!
źródło
AWK , 235 bajtów
Wypróbuj online!
Odpowiada mapowaniu na 1234 (4 to diamenty), wartości mapowane na 0123456789. Ten program przekształca przypadki testowe w akceptowany format:
Moim celem było pokonanie wiodącej implementacji języka Python: D
źródło
Python 3 ,
249 245 239238 bajtów-4 bajty dzięki @ovs
-6 bajtów dzięki @movatica
Wypróbuj online!
źródło
int('0734569c00'[int(x[0])],13)
iif x[1]<'E'
można je zapisać jakoif'E'>x[1]
all(s in''.join(C)for s in S)
można skrócićnot S.strip(''.join(C))
, oszczędzając 6 bajtów