Twoim zadaniem jest napisanie małego programu, który liczy punkty ręki Skata. Talia Skata zawiera karty od 7 do 10, walet, królową, króla i asa (zwane Unter, Ober, König i Daus). Używamy niemieckich kolorów, które mają żołędzie, liście, serca i dzwony zamiast trefl, pik, kier i diamentów. Punkty zależą od liczby na karcie:
- 7, 8 i 9 oznaczają 0 punktów
- Unter to 2 punkty
- Ober ma 3 punkty
- König to 4 punkty
- 10 to 10 punktów
- Daus ma 11 punktów.
Wejście wyjście
Format wejściowy składa się z dwóch symboli, pierwszy reprezentuje wartość, a drugi oznacza kolor:
- 7, 8 i 9 oznaczają ich samych
- 0 (zero) oznacza 10
- Unter, Ober, König i Daus są nazwane po pierwszych literach (U, O i D)
- To samo dotyczy żołędzi, liści, serc i brzucha (A, L, H i B)
Dane wejściowe to pojedyncza linia kart oddzielona pojedynczym białym znakiem. Możesz pobrać dane wejściowe z dowolnego miejsca, argumenty wiersza poleceń też są w porządku. Wynik jest wartością ręki, wydrukowaną lub zwróconą jako kod wyjścia. Wyjście twojego programu musi pokazywać błąd, jeśli jakakolwiek karta pojawi się dwukrotnie w ręce. (Więc 7A 0L 7A
musi zwrócić błąd zamiast 10
). Można także wyjść z kodem wyjścia 255 zamiast wyświetlać błąd, jeśli jest to domyślny sposób wyświetlania wyniku przez program.
Przykłady
7A 8A 9A UA OA KA 0A DA 7L 8L 9L UL OL KL 0L DL 7H 8H 9H UH OH KH 0H DH 7B 8B 9B UB OB KB 0B DB
daje 1207A 8L 0K DB 8L
daje błądUA OB DL KH
daje 20
Zasady
- Code golf: wygrywa najkrótszy kod
- Obowiązują zwykłe zasady gry w golfa
- Program musi działać na wszystkie ręce, a nie tylko na przykłady
- GIGO: Jeśli dane wejściowe są nieprawidłowe, dane wyjściowe mogą być dowolne
źródło
Odpowiedzi:
APL (
5448)Tam ma być krótsza droga wybierając wartość karty, ale ja tego nie widzę.
Dostajesz,
DOMAIN ERROR
jeśli istnieje duplikat karty.Wyjaśnienie:
A←⍞~' '
: store (←
) wA
wierszu danych wejściowych użytkownika (⍞
) bez (~
) spacji.2,⍨2÷⍨⍴A
: lista dwuelementowa, zawierająca długość (⍴
)A
podzieloną przez (÷⍨
) 2, a następnie (,⍨
) liczbę 2. (Tak więc, jeśli dane wejściowe toUA OB DL KH
lista to (4, 2)).↓A⍴⍨
: zdefiniuj macierz (⍴
) o wymiarach tej listy zawierającej wartości A. Następnie połącz elementy jej wierszy razem (↓
), podając na przykład listę list['UA','OB','DL','KH']
.A←
: Zapisz tę listę w A.A≡∪A
:∪A
jest listą unikalnych elementów w A. Jeśli jest ona równa A, nie ma duplikatów i zwraca 1, w przeciwnym razie 0.÷
: podziel to, co jest po lewej stronie (co faktycznie oblicza) przez wynik testu równości. Więc jeśli nie ma duplikatów, wynik pozostaje niezmieniony, a jeśli są duplikaty, otrzymujesz wynik zDOMAIN ERROR
powodu podziału przez zero.⊃¨A
: Lista podająca pierwszy element (⊃
) każdego elementu (¨
) z A. Tak więc to upuszcza literę koloru, pozostawiając literę wyniku. (UODK
)'D0.....KOU.'⍳
: podaje indeks każdej z liter wyniku w tym ciągu, zwraca 12 dla wartości spoza łańcucha. (10 9 1 8
)+/12-
: odejmij je wszystkie od 12, a następnie dodaj je razem. (2 + 3 + 11 + 4 = 20
)źródło
Ruby 1.9, 52 znaki
Wprowadzanie za pomocą argumentów wiersza poleceń. Zakładam, że komunikat o błędzie przy zduplikowanych kartach nie ma znaczenia, więc po prostu narzeka na błąd konwersji eval / type.
Przykładowe użycie:
źródło
Scala,
8782 znakówZgłasza wyjątek na powtarzających się kartach.
źródło
Haskell,
122108107 znakówźródło
error""
jest krótszy niżundefined
. Zaoszczędź jeden znak za pomocąinteract
.interact
niego nie spowoduje wydrukowania nowego wiersza, więc nie jestem pewien, czy jest to dopuszczalne. Byłem jednak w stanie zaoszczędzić znacznie więcej, używając zamiast tego niekompletnego wzorcaundefined
.GolfScript
545352Edycja 1:
Właśnie odkryłem błąd w kodzie. Nie wykrył duplikatów kart, jeśli duplikaty były pierwszymi dwoma na wejściu (ponieważ użyłem
*
operatora składania, a nie/
każdego operatora dla pierwszej pętli).Teraz poprawiłem kod, a także udało mi się usunąć 1 znak w tym procesie. Oto nowa wersja:
Dane wejściowe muszą znajdować się na stosie jako ciąg znaków, w określonym formacie (przykład
'7A UA DA'
:).Jeśli dane wejściowe są prawidłowe, program drukuje całkowitą wartość kart.
W przypadku, gdy istnieje co najmniej jedna zduplikowana karta, program zgłasza następujący wyjątek:
Edycja 2:
Po obejrzeniu tego postu na stronie meta postanowiłem opublikować opis kodu. Pomogło mi to również znaleźć i naprawić błąd. Oto więc:
źródło
Python, 114 znaków
Niestety
index
metoda list w Pythonie wywołuje błąd, jeśli element nie zostanie znaleziony, zamiast zwracać wartość ujemną, a importowaniedefaultdict
wymagałoby więcej znaków niż zaoszczędziłoby.źródło
eTeX, 201 znaków (nie licząc dwóch nieistotnych podziałów linii)
Używany jako
etex filename.tex [UA OB DL KH]
. Umieszczenie argumentu w nawiasach jest konieczne: w przeciwnym razie eTeX nie ma możliwości ustalenia, że osiągnęliśmy koniec listy argumentów.EDYCJA: jak dozwolone w pytaniu pytania, nieprawidłowe dane wejściowe mogą powodować (an) błąd. Na przykład
etex filename.tex [OK]
powoduje awarię okropnie (ponieważK
nie jest prawidłowym kolorem).źródło
etex -v
? Jaki jest komunikat o błędzie (z grubsza)? Kod powinien zostać umieszczony w pliku (z nazwąfilename.tex
lub inną czcionką kończącą się na.tex
) i użyj tej nazwy w wierszu poleceńetex filename.tex [<argument>]
. (przepraszam, że ponownie opublikowałem ten sam komentarz, zapomniałem „@FUZxxl
”)K
nie jest poprawnym kolorem, a zastąpienie goX
w twoich przykładach usuwa błędy (ulega awarii,K
ponieważ litera ma inne znaczenie, King). Mógłbym sprawić, by błąd był mniej okropny, dodając\string
przed każdym##1
, ale to kosztowałoby 12 dodatkowych znaków.PowerShell, 79
80Rzuca »Próba podzielenia przez zero«, jeśli karty pojawią się dwukrotnie.
źródło