W grze planszowej The Settlers of Catan istnieje pięć rodzajów zasobów: cegła, kłoda, ruda, pszenica i owca. Budowa osady kosztuje cegłę, kłodę, pszenicę i owcę. Możesz jednak także wymienić cztery identyczne zasoby, aby uzyskać zasób innego typu. Na przykład, jeśli masz w ręku cztery rudy, możesz wymienić je wszystkie i zdobyć jedną owcę.
Twoim zadaniem jest ustalenie, czy mogę zbudować osadę, biorąc pod uwagę moją rękę.
Twoje zadanie
Wejście będzie ciągiem liter B
, L
, O
, W
, i S
, podjęte w dowolnym rozsądnym formacie. Litery te odpowiadają pięciu typom zasobów podanym powyżej. Powinieneś wypisać, czy mam zasoby niezbędne do zbudowania ugody, biorąc pod uwagę możliwość handlu tego rodzaju.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Notatki
- Nie musisz generować, jakie transakcje muszę wykonać ani ile rozliczeń mogę zbudować. Wystarczy proste „tak” lub „nie”.
- Być może nie przyjąć, że wejście jest w dowolnej kolejności określonej. W szczególności nie można zakładać, że zasoby tego samego typu są pogrupowane razem, więc
OBLSO
jest to prawidłowe dane wejściowe. - Jest to problem decyzyjny , więc możesz użyć dowolnej wartości, którą chcesz oznaczać „tak” i „nie”, o ile dwie wybrane wartości są różne i spójne.
- Jedyne zasady, którymi się tu zajmujemy, to te wymienione powyżej. Bardziej skomplikowane zasady Osadników z Catanu, takie jak handel z innymi graczami lub w portach, nie są tutaj istotne.
- Znaki wejściowe (
B
,L
,O
,W
,S
) można zastąpić innymi wartościami, jeśli jest to łatwiejsze dla danego języka wyboru, tak długo, jak istnieje pięć odrębnych wejść. Jeśli używasz innych wartości wejściowych, podaj je w swojej odpowiedzi.
Przykłady
BLWS -> Yes
OOOOWLB -> Yes (trade four O for a S)
OOW -> No
BBBO -> No
(empty input) -> No
BBBBLW -> No
BBBBBLW -> Yes (trade four B for a S)
OOOOOOOOOOOOOOOO -> Yes (sixteen O; trade for B, L, W, S)
BLBLBLBLBL -> Yes (trade L for W and B for S)
BLSWBLSWBLSW -> Yes (extra, unused resources are ignored)
code-golf
decision-problem
board-game
Silvio Mayolo
źródło
źródło
Odpowiedzi:
Python 2 , 54 bajty
Wypróbuj online!
Dla każdego z naszych zasobów liczymy liczbę „swobód” podanych przez posiadanie n tego zasobu. Wolność stanowi okazję do wypełnienia jednego z miejsc na cegły z kłody pszenicy i owiec, które musimy wypełnić, aby się osiedlić, biorąc pod uwagę fakt, że możemy przekształcić nasze zasoby.
Dla wszystkich BLSW posiadanie jednego z zasobów daje nam taką swobodę, a każdy dodatkowy nadmiar 4 daje nam inną. Reguła liczenia wolności wygląda następująco:
Tak więc n cegieł / kłód / pszenicy / owiec daje ⌊ (n + 3) / 4⌋ wolności.
W przypadku rud liczy się tylko nadmiar czwórki. Reguła liczenia wolności wygląda następująco:
Więc n rudy dać ⌊n / 4⌋ wolności.
Twierdzenie: możemy rozstrzygnąć wtedy i tylko wtedy, gdy mamy ≥ 4 takie „wolności”.
Dlatego liczymy nasze wolności i sprawdzamy, czy jest ich ≥ 4. Aby obsłużyć liczenie rud jako ⌊n / 4⌋, ale innych zasobów ⌊ (n + 3) / 4⌋, sztucznie zwiększamy liczbę pozostałych zasobów o 3, a następnie liczymy ⌊n / 4⌋ dla wszystkich z nich. Robimy to poprzez mapowanie
(s+"BLSW"*3).count
zamiasts.count
.Dowód :
Załóżmy, że możemy się osiedlić. Następnie dla każdego z [B, L, S, W] albo (a) wykorzystaliśmy 1 z tego zasobu, który już mieliśmy, lub (b) poświęciliśmy 4 inne zasoby (w tym rudy), aby je utworzyć. W obu przypadkach liczymy co najmniej 1 wolność według powyższych zasad. Mamy więc 4 swobody.
Załóżmy, że mamy 4 swobód, z których k spowodowane są „ekscesy” (co wolność od rud jest nadmiar, a każda wolność od innych zasobów przeszłość pierwszy jest również) i 4-k, które są świadectwem posiadania co najmniej jednego cegła / kłoda / pszenica / owca (ta, która dała „pierwszą wolność”). Następnie wypełniamy 4-k szczeliny cegłą / kłodą / pszenicą / owcą, które dały nam pierwszą swobodę, i wypełniamy pozostałe k szczelin, przekształcając nasze ekscesy. Wszystkie 4 miejsca są zajęte i możemy się rozstrzygnąć. Oczywiście nadal możemy to zrobić, jeśli mamy więcej niż 4 swobody.
Ten dowód jest do kitu, ale jestem śpiący. Jestem pewien, że jest lepsze wytłumaczenie.
źródło
s
toOOOOBLW
, skończyć się corazsum(n/4for n in map(("OOOOBLWBBBLLLSSSWWW").count,"BLSWO"))>3
... więc dla każdego zBLOWS
was liczyć, ile razy pojawia się w tym ciąg startowej"BLWS"*3
, a następnie Podsumowując."OOOOBLWBLSWBLSWBLSW"
w rzeczywistości, ale liczby są oczywiście takie same.)in"BLSWO"
jest potrzebna w Pythonie, prawda? Wydaje się pracować w TIO przynajmniej ..Python 2 ,
5251 bajtów-1 bajt dzięki Łuk (zastępuje
>=0
się<0
, odwracającFalse
/True
wyników)Nienazwana funkcja pobierająca ciąg znaków B , O , W , L i S (jak w OP) i zwracająca,
False
jeśli możesz się ustatkować, aTrue
jeśli nie.Wypróbuj online! (wymusza wyjście
yes/no
na OP).W jaki sposób?
To jest port mojej odpowiedzi na żelki. Musimy uzupełnić brakujące B , W , L lub S z pozostałej części po użyciu jednego z nich. W związku z tym możemy dodać dodatkowe O do naszej ręki, następnie zmniejszyć wszystkie zliczenia o jeden, następnie liczbę całkowitą podzielić wszystkie zliczenia na cztery, a następnie zsumować - jeśli wynik wynosi zero lub więcej, możemy ustalić (albo dlatego, że nie brakowało wymaganych zasobów) lub ponieważ możemy handlować, aby zdobyć brakujący (e)).
źródło
False
dla'yes'
iTrue
dla'no'
? Następnie możesz zmienić>=
na<
, oszczędzając 1 bajt.Pyth , 14 bajtów
Wypróbuj tutaj! lub Zweryfikuj wszystkie przypadki testowe.
Pyth ,
31 27 1716 bajtówSprawdź przypadki testowe.
Jak to działa?
Wyjaśnienie nr 1
Wyjaśnienie nr 2
Oto kody używane przez mój program:
źródło
+%ld4/ld4
->s.Dld4
//Q4 4
tak,/Q16
ale nie jestem do końca pewien ...BBBO
, na przykład4
i podział4
.Galaretka ,
1312 bajtówMonadyczny link przyjmujący listę liczb reprezentujących posiadane zasoby i zwracający,
1
jeśli możesz się ustatkować, a0
jeśli nie.Zasoby są
1, 2, 3, 4, 5
tam, gdzie5
reprezentuje rudę .Wypróbuj online! lub zobacz pakiet testowy (używając OP IO).
W jaki sposób?
Chodzi o to, aby najpierw policzyć zasoby według typu, a następnie zmniejszyć wszystkie liczby B , L , W i S o jeden - jeśli nie policzymy żadnych dla żadnej z tych czterech, będą one miały teraz wpisy -1 - musimy zdobyć je z naszych pozostałych zasobów (w rzeczywistości osiąga się to poprzez dodanie dodatkowego O (
5
) i zmniejszenie wszystkich pięciu liczb o 1 ). Następnie dzielimy liczby całkowite przez wszystkie te wartości przez cztery, aby zobaczyć, za ile jednostek możemy handlować przy każdej z naszych pozostałych liczb według typu zasobu, nie wpływając jednocześnie na liczby -1 i 0 (zauważ, że -1 podzielona przez liczbę całkowitą przez cztery to-1 , nie 0 ). Na koniec dodajemy wartości i sprawdzamy, czy wynik jest większy lub równy zero (tutaj można użyć wartości większej niż -1, ponieważ zawsze mamy liczby całkowite).źródło
Java 8, 101 bajtów
Lambda od
int[]
doboolean
. Przypisz doFunction<int[], Boolean>
.Wypróbuj online
Wejście i wyjście
Dane wejściowe to tablica liczb całkowitych od 0 do 4 włącznie. 4 oznacza Rudę, a inne odwzorowania są nieistotne. Moje przypadki testowe są bezpośrednimi tłumaczeniami tych, o których mowa, z 0 jako cegła, 1 jako kłoda, 2 jako pszenica i 3 jako owca.
Dane wyjściowe określają, czy można zbudować osadę.
Bez golfa
Wyjaśnienie
h
to liczba poczwórnych zasobów dostępnych do handlu. Wykonujemy iterację nad każdym typem zasobów (z wyjątkiem Rudy), zwiększająch
dla każdej czterokrotności dodatkowych zasobów, które mamy, i zmniejszając, gdy nie ma żadnych zasobów. Zatem naszym wynikiem jest to, czyh
jest nieujemne.Linia
dostosowuje
h
odpowiednio, niezależnie od tego, czy nie ma zasobów (niedobór), czy jest przynajmniej jeden zasób (nadwyżka).f[i]
jest zmniejszany w celu uwzględnienia wymaganego zasobu w przypadku nadwyżki, dając -1 w przypadku niedoboru. Podpisane przesunięcie w prawo zmniejsza wyrażenie do 0 (przypadek nadwyżki) lub -1 (przypadek niedoboru), tak że bitowo LUB z liczbąf[i++] / 4
poczwórnych nadwyżek (w przypadku nadwyżki) nie ma wpływu w przypadku niedoboru, ale skutkuje liczbą sama w przypadku nadwyżki.Podziękowanie
źródło
...for(h=f[4]/4;i<4;h+=f[i++]/4)n+=--f[i]>>-1;return~h<n;
.a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;h+=f[i++]/4)h+=--f[i]>>-1;return~h<0;}
a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;)h+=--f[i]>>-1|f[i++]/4;return~h<0;}
Retina , 34 bajty
Wypróbuj online! Objaśnienie: Budowa osady wymaga 4 zasobów, które są albo twoimi pierwszymi B, L, W lub S, lub dowolnymi 4 innymi zasobami tego samego typu. Jest to równoważne z dodaniem trzech z każdego z tych czterech rodzajów zasobów, a następnie zliczeniem, aby sprawdzić, czy masz cztery zestawy czterech.
źródło
Galaretka , 23 bajty
Wypróbuj online!
Wartości znajdują się w poniższej tabeli:
źródło
Siatkówka , 43 bajty
Wypróbuj online!
źródło
Python 3 ,
7978 bajtówEdycja: -1 bajt dzięki @ Mr.Xcoder
Wypróbuj online!
źródło
MATL , 19 bajtów
Dane wejściowe to numeryczny wektor wiersza, w którym litery są przedstawione w następujący sposób:
Wyjście jest
1
na prawdę,0
na fałsz.Wypróbuj online!: Sprawdź wszystkie przypadki testowe .
Jak to działa
BLWS
) jest niezerowych. Daje to liczbę c .Skomentowany kod
źródło
> <> , 61 bajtów
Wypróbuj online!
Wykorzystuje następujące mapowanie zasobów:
To naprawdę nie ma znaczenia, co wykorzystywane jest odwzorowanie, tak długo, jak są one w przedziale
0-4
, a0
służy do O. Wykorzystuje fakt, że szuka kombinacjiBLWS
jest taka sama jak szuka kombinacjiOBLWS
natomiast już posiadająceO
in dłoń.źródło
05AB1E , 19 bajtów
0 -> Ruda
1 -> Cegła
2 -> Dziennik
3 -> Pszenica
4 -> Owca
Zwraca 0, gdy jest fałszem, a 1 w przeciwnym razie.
Wypróbuj online!
Wyjaśnienie:
Rozwiązanie niekonkurencyjne: 17 bajtów
Wystąpił błąd w 05AB1E, kiedy po raz pierwszy przesłałem to rozwiązanie, w którym niektórzy operatorzy źle traktowali puste dane wejściowe. Spowodowało to odpowiedź tego rozwiązania
1
na puste wejście. Zostało to już naprawione, więc to rozwiązanie działa dobrze.Różnica polega na tym, że dodajemy rudę przed usunięciem każdego z zasobów, bez rozróżnienia, licząc liczbę zasobów usuniętych w ten sposób. Następnie zmniejszamy licznik o 1, aby uzyskać prawidłową liczbę B, L, W i S.
Wypróbuj online!
źródło
JavaScript (SpiderMonkey) , 116 bajtów
Wypróbuj online!
Super Clunky zła odpowiedź. Jestem pewien, że można by to bardziej wyczyścić. Metoda inspirowana odpowiedzią Lynn w tym wątku.
źródło
Kotlin ,
131129 bajtówUległość
Test
Nie działa na TryItOnline, ale działa na try.kotlinlang.org
źródło