Uwaga: jest to związane z odmianą gry Rummikub
Tło i zasady
Rummikub to gra oparta na kafelkach. Istnieją cztery kolory: czerwony, pomarańczowy, niebieski i czarny. Na każdy kolor przypada 13 kafelków (oznaczonych od 1 do 13), a także 2 Jokery, które są niezależne od koloru, dlatego w sumie jest ich 54. W tej odmianie Rummikub każdy gracz otrzymuje 14 płytek i musi zdobyć jeszcze jeden kafelek i upuszczać kolejne w każdej rundzie, aby liczba płytek była stała. Gracze nie widzą siebie nawzajem. Celem jest zgrupowanie płytek, tak aby wszystkie elementy należały do co najmniej jednej grupy (patrz poniżej). Kiedy gracz zgrupuje wszystkie pionki, upuszcza swoją płytkę i odsłania swoje pionki. Inni następnie sprawdzają, czy wszystkie kombinacje są prawidłowe, a jeśli tak, to gracz wygrywa rundę.
Jak można grupować kafelki?
Istnieją tylko dwa typy grup:
Grupy wielokolorowe :
- Składają się z 3 lub 4 płytek.
- Zawierają tylko płytki z tym samym numerem na nich.
- Wszystkie płytki są w różnych kolorach.
- Przykład:
RED 9, BLUE 9, BLACK 9
.
Grupy jednobarwne :
- Składają się z co najmniej 3 płytek.
- Nie mogą zawierać więcej niż 13 płytek.
- Zawierają tylko kafelki z różnymi kolejnymi liczbami w porządku rosnącym.
- Wszystkie płytki mają ten sam kolor.
- Płytki oznaczone etykietą
1
nie mogą być miejscami po płytkach oznaczonych etykietą13
. - Przykład:
RED 5, RED 6, RED 7
.
Zaraz, co robią Jokery?
Jokery mogą zastąpić dowolny element w grze. Na przykład naszym pierwszym przykładem może być JOKER, BLUE 9, BLACK 9
, RED 9, JOKER, BLACK 9
lub RED 9, BLUE 9, JOKER
. To samo dotyczy naszego drugiego przykładu. Jednak nie można umieszczać dwóch Jokerów w tej samej grupie, więc takie rzeczy JOKER, ORANGE 8, JOKER
są zabronione.
Zadanie
Biorąc pod uwagę grupę kafelków Rummikub, sprawdź, czy jest poprawna. Masz gwarancję, że nie pojawią się duplikaty kafelków, z wyjątkiem 2 jokerów i że kafelki otrzymane jako dane wejściowe są prawidłowe (np. Rzeczy takie jak 60
nie pojawią się).
Wejście wyjście
Możesz wziąć dane wejściowe i dostarczyć dane wyjściowe dowolną standardową metodą.
Niektóre prawidłowe formaty wejściowe: lista ciągów, lista krotek, zagnieżdżone listy, ciągi lub cokolwiek innego, co uważasz za odpowiednie. Kolory mogą być traktowane jako ciągi znaków (np . "Blue","Red", etc.
:), skróty ciągów znaków (należy wyróżnić niebieskie i czarne kafelki) lub jako liczby całkowite odpowiadające kolorowi. Jeśli chodzi o Jokery, powinieneś wspomnieć o tym, jak twój program odbiera je jako dane wejściowe. Jeśli wybierzesz Strings, możesz mieć coś takiego RED 9, JOKER, ...
, jeśli wybierzesz krotki, które możesz mieć (9,"RED"), ("JOKER")
lub coś równoważnego. Jeśli to pomoże, możesz otrzymać kolor dla tego Jokera (co nie powinno wpływać na wynik twojego programu). Na przykład możesz mieć ("JOKER","RED")
lub ("JOKER","BLUE")
, ale nie powinno to w żaden sposób wpływać na wynik.
Jeśli chodzi o wynik, zastosowanie mają standardowe zasady dotyczące problemu decyzyjnego .
Sprawdzone przykłady
Weźmy przykład, który, miejmy nadzieję, ułatwiłby zrozumienie. Biorąc pod uwagę grupę w następujący sposób, gdzie każda krotka reprezentuje kafelek:
[(9, „RED”), (9, „ORANGE”), („JOKER”), (9, „BLACK”)]
Powinno to zwrócić prawdziwą wartość, ponieważ dane wejściowe są prawidłowe. W tym przypadku Joker zastępuje (9, "BLUE")
i tworzą grupę wielokolorową.
Jeśli otrzymasz następującą grupę:
[(9, „NIEBIESKI”), (9, „POMARAŃCZOWY”), (9, „CZERWONY”), (9, „CZARNY”), („JOKER”)]
Byłoby to nieprawidłowe, dlatego program powinien zwrócić wartość falsy, ponieważ joker nie ma już nic do zastąpienia, ponieważ maksymalna liczba kart w grupie wielokolorowej wynosi 4.
Dodatkowe przypadki testowe
Są to dla rozszerzonego zestawu testów, który obejmuje prawie wszystkie możliwe sytuacje:
Wejście -> Wyjście [(1, „NIEBIESKI”), (2, „NIEBIESKI”), (3, „NIEBIESKI”), (4, „NIEBIESKI”), (5, „NIEBIESKI”), (6, „NIEBIESKI”)] - > prawda [(6, „NIEBIESKI”), (6, „CZERWONY”), (6, „CZARNY)] -> truey [(5, „CZARNY”), (6, „CZARNY”), (7, „CZARNY”), (8, „CZARNY”), (9, „CZARNY”), (10, „CZARNY”), ( „JOKER”), (12, „BLACK”)] -> truey [(„JOKER”), (3, „NIEBIESKI”), (3, „CZERWONY”)] -> truey [(8, „CZARNY”), (2, „CZERWONY”), (13, „NIEBIESKI”)] -> falsy [(4, „RED”), (3, „RED”), (5, „RED”)] -> falsy [(5, „CZARNY”), (6, „CZARNY)] -> falsy [(„JOKER”), (5, „RED”), („JOKER”)] -> falsy [(4, „RED”), (5, „RED”), (6, BLUE ”)] -> falsy [(4, „RED”), („JOKER”), (5, „RED”)] -> falsy [(12, „CZARNY”), (13, „CZARNY), (1,„ CZARNY ”)] -> falsy
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach w każdym języku!
źródło
Odpowiedzi:
APL (Dyalog) , 58 bajtów
Pobiera listę kolorów (1-4) jako prawy argument i listę liczb jako lewy argument. Oznaczono liczbę Jokera,
(⍳4)
która jest równoważna(1 2 3 4)
z informacją, że może to być dowolny z nich. Podobnie, jego kolor jest oznaczony,(⍳13)
aby wskazać, że może to być dowolna z liczb od 1 do 13.Wypróbuj online!
Algorytm
Istnieją trzy warunki, z których dwa ostatnie mają dwa warunki:
I JESZCZE
pojedynczy numer ORAZ
unikalne kolory
LUB
aby przebieg był ważny.
Kolejność czytania
3≤
3 jest mniejsza lub równa≢⍺
liczbie płytek∧
is⍵
wszystkie liczby są takie same∧
i⍺≡∪⍺
kolory są wyjątkowe∨
lub1∊
1 należy≢∘∪¨
do liczby unikatowych⊃,¨/
rozszerzonych⍺
kolorów∧
i∨/
istnieje co najmniej jeden∊
spośród wszystkich⊃,¨/⍵
rozszerzeń numerów⍷¨⊂
jeden, który znajduje się w punktach od⍳13
1 do 13Pełne wyjaśnienie kodu
{
…}
Anonimowa funkcja, w której⍺
argument jest lewy, a⍵
argument prawy3.2
⍳13
liczby od 1 do 13(
…)⍷¨
Znajdź pozycje początkowe każdego z następujących przebiegów:,¨/⍵
dołącz każdy element liczb (tworzy przebieg dla każdej wartości Jokera)⊃
ujawnić (ponieważ/
zmniejsza rangę)∊
ε nlist (spłaszczyć)∨/
LUB redukcja (tj. Czy są jakieś prawdziwe?)(
…)∧
I:3.1
(
…)⍺
Wynik zastosowania następującej funkcji na liście kolorów:s←{
...}
s (dla s ame), która jest następująca funkcja anonimowa (⍵
jest jego argument):,¨/⍵
połącz każdy element w poprzek (tworzy przebieg dla każdej wartości Jokera)⊃
ujawnić (ponieważ/
zmniejsza rangę)≢∘∪¨
liczba unikalnych elementów na każdej liście1∊
jest członkiem? (tj. czy są jakieś takie same listy?)(
…)∨
LUB:2.2
∪⍺
unikalne kolory⍺≡
są identyczne z kolorami (tzn. są niepowtarzalne)(
…)∧
I:2.1
s⍵
liczby są takie same(
…)∧
I1.
≢⍺
liczba kolorów (tj. liczba płytek)3≤
trzy jest mniejsze lub równe temuźródło
Galaretka ,
41403836 bajtówWypróbuj online! (zawiera stopkę zestawu testów)
Pobiera dane wejściowe jako tablicę
(color, value)
dla zwykłych kafelków i0
dla jokerów. Kolory są reprezentowane jako liczby całkowite (chociaż nie jestem pewien, czy to w ogóle ma znaczenie dla bieżącego kodu).Wyjścia
1
(prawda) lub0
(fałsz).Wyjaśnienie
źródło
Python 2 ,
371 370 362 341 329325 bajtówstr.split()
zamiastlist literal
len(x)-1
J O BK B R
naJoker, Orange, Black, Blue, Red
literałyWypróbuj online!
źródło
BK
zeb
aby zapisać 1 bajt (Tio z przypadków testowych do aktualizowanychb
.JavaScript (ES6), 286 bajtów
(Zauważ, że powyższe przypadki testowe zawierają 2 dodatkowe przypadki testowe, których nie ma w pytaniu: są one odpowiednio prawdziwe i fałszywe: zobacz czytelność wersji bez golfisty).
Szorstki proces:
Jokery są oznaczone jako mające
0
wartość liczbową (działałaby również liczba ujemna); dzięki temu struktura danych wejściowych jest spójna (ma zarówno Kolor, jak i Wartość) i nie polega na sprawdzaniu, czyc=="JOKER"
oszczędzając 7 bajtów.Możliwe, że niektóre nawiasy zostaną usunięte, może nie być pola
q
jako tablicy (próbowałem, a wartość pozostała 0 lub spowodowała demony nosowe ).Nie golfowany:
Wersja, nad którą pracowałem, aby uzyskać prawidłową logikę. Lambdas jednorazowego użytku są wbudowane; oto ich odpowiednia funkcja:
źródło
C # (.NET Core) , 198 bajtów
Pobiera na nich kolory kafelków i liczb jako osobne listy liczb całkowitych. Specyfika tego odwzorowania nie ma znaczenia, dopóki każdy kolor ma inną liczbę całkowitą, a Jokery są reprezentowane jako 0.
Format wprowadzania liczb jest jednak wyjątkowy. Liczba, którą należy wprowadzić dla liczby,
n
to 2 ^ n, podczas gdy liczba używana do reprezentowania jokera powinna wynosić (2 ^ 14) -1. Umożliwia to bitowe iu&x
ocenę u, jeśli kafelek x ma wartość równą u lub jest jokerem.C # (.NET Core) , 200 bajtów
2 bajtowe rozwiązanie dłuższe, które nie jest eklektyczne w kwestii wprowadzania. Okazuje się, że używam specjalnego etui dla żartownic w jednym miejscu, z którym trudno było sobie poradzić, nie było dużo dłuższe niż sprytna bitowa operacja, z której byłem tak dumny. Tutaj Jokery są (0,0), inne liczby są zgodne z oczekiwaniami, a kolory są reprezentowane 4 dowolnymi wartościami, które różnią się od siebie w domyślnym porównaniu C # (konkretnie,
Distinct()
operacja Linq musi brać pod uwagę wartości dla tego samego koloru jako „nierozróżnialne” oraz wartości dla różnych kolorów jako „wyraźne”).Coś, co mogłoby być przydatne w innych językach,
u*=!u++^x*x
byłoby równoważneu=u==x|x<1?u+1:0
w niektórych językach; u ^ x wynosi 0 iff u == x, a 0 razy dowolny int jest równy 0, więc u ^ x * x będzie 0 dla u == x lub x == 0, jeśli C # nie sprawi, że operacje bitowe będą miały niższy priorytet niż matematyczne. C # nie może również interpretować ints jako bools bez jawnego rzutowania. Język, który próbuje trudniej zrobić typy praca może konwertować wartości0
inot 0
celufalse
, atrue
przed nałożeniem!
na nich, choć i wtedy, gdy wracając do int interpretować!false
jako 1 i!true
jako 0. Wszystkie powiedział, że nie mogę zagwarantować, inny język faktycznie skorzystaj z reszty algorytmu, więc może nawet nie powstać.źródło
Scala
491477 chars,491477 bajtówTo wyzwanie było zabawne; dzięki.
Więc
f
na linii 4 jest rekurencyjne wywołanie, w którym próbuję zastąpić „JOKER” każdą inną płytką. Zobacz tio, aby uzyskać wyraźniejszy widok kodu. Jako wejście wybrałem sekwencję 2-krotek (Int, String) - wywoływanycht
w moim kodzie, patrz tio - więc „JOKER” jest reprezentowany przez 2-krotkę (0, „JOKER”).EDYCJA: 14 bajtów zapisanych dzięki komentarzom, biorę OB b R za POMARAŃCZOWY CZARNY NIEBIESKI CZERWONY.
Wypróbuj online!
EDYCJA: -2 bajty, usunięty bezużyteczny
(
wokół warunkówcase _ if
sźródło
O,B,b,R
zamiastORANGE,BLUE,BLACK,RED
oszczędzać bajty? Nie mam pojęcia, jak działa Scala, ale myślę, że możesz.var (O,B,b,R)=("ORANGE","BLACK","BLUE","RED")
i wywołujeO
B
b
R
łącznie 49 bajtów; gdzievar c=Seq("ORANGE","BLACK","BLUE","RED")
i wywołaniac(...)
sumują 58 bajtów. ALE pierwszy przypadek pozwalafor(u<-c)
na tofor(u<-Seq(O,B,b,R))
, więc koszt nie wynosi -9, ale +2. Dzięki za próbę.var c=Seq("O","B","b","R")
i przyjmowanie tych znaków jako danych wejściowych zamiast pełnych ciągów kolorów. Jak wspomniano w oryginalnym poście, „Kolory można traktować jako ... Skróty ciągów”.