Chcę tutaj wypróbować nową formę golfa kodowego. Podobnie jak w przypadku bonusów, nie wszystkie części wyzwania muszą zostać ukończone, ale każda odpowiedź musi implementować podzbiór o określonej wielkości (i istnieje rdzeń, który każda odpowiedź musi wdrożyć). Tak więc oprócz gry w golfa wyzwanie polega również na wybraniu zestawu funkcji, które dobrze do siebie pasują.
Zasady
Kingdom Builder to gra planszowa, rozgrywana na siatce heksów (spiczastych). Plansza składa się z czterech (losowych) ćwiartek, z których każda ma 10x10 komórek heksadecymalnych (więc pełna plansza będzie miała wymiary 20 x 20). Na potrzeby tego wyzwania każda komórka heksadecymalna zawiera albo wodę ( W
), albo górę ( M
) miasto (T
), zamek ( C
) lub jest pusta ( .
). Tak mógłby wyglądać kwadrant
. . W . . . . . . .
. M W W . . . . . .
. M . . W . . . T .
M M . W . . . . . .
. . M . W W . . . .
. . . . . W W W W W
. T . . . . . . . .
. . W . . C . . . .
. . W W . . . . M .
. . . . . . . M M .
Drugi rząd będzie zawsze przesunięty w prawo od pierwszego rzędu. Gracze1
do 4
można umieścić do 40 osiedli każdy na pustych komórek (po pewnych zasad, które będziemy ignorować do tego wyzwania). Możliwa plansza na końcu gry jest następująca:
3 3 W . . . 4 . 4 . . 2 W . 4 . . 4 . 4
3 M W W . 1 1 . . 4 2 W . 3 C 4 4 . . 4
3 M 2 2 W 1 1 1 T 3 2 W 4 3 . 1 4 . 4 .
M M . W 2 2 . . . 2 2 W 3 . 1 1 1 . . .
. 4 M . W W 2 2 2 2 W W 3 . 1 4 . T . .
. . . . . W W W W W . 3 C 1 . . 2 2 2 2
. T 1 1 1 1 . . 2 . . 4 . . . 2 2 M M M
4 . W 4 . C 4 4 . . . . . . 2 M M M M M
. 4 W W . . . 4 M . . W . W . 2 2 2 M M
. . . . . . . M M . . W W . . . . 2 M .
. . . 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 . 1
M 3 3 . . . . . . . . 4 . T 2 . 2 4 1 .
M M . C . 4 . 4 . . . . . 1 2 4 2 1 1 .
M . . 1 . 4 . . . . M M 1 2 . . 2 1 . .
. . . W 1 1 4 1 1 . . . 1 2 . . 2 W W W
. . 1 1 W 1 T . 1 1 1 1 T . . 2 W . 4 .
. 1 1 W . 3 3 . . . . . . . . 2 W 4 C 3
C 1 3 3 3 . 3 . 4 . 4 . 4 . . 2 W 1 1 M
4 3 3 4 . M 4 3 . . . . . . . 2 W . . .
. . . 4 . M M 3 . . 4 4 . 4 . 2 W W . .
Będziemy nazywać ćwiartki jak
1 2
3 4
Twoim zadaniem będzie zdobycie takiej tablicy. Jest jeden wynik podstawowy, który jest zawsze używany, i 8 wyników opcjonalnych, z których 3 są wybierane dla każdej gry. † Poniżej opiszę wszystkie 9 wyników i wykorzystam powyższą konfigurację jako przykład, ile punktów zdobędzie każdy gracz.
† W tej grze jest 10 punktów, ale pominę dwa, ponieważ nikt nie chce grać w golfa.
Podstawowy wynik. Gracz otrzymuje 3 punkty za każdy C
astle, obok którego znajduje się osada.Przykładowe wyniki: 18, 0, 15, 12.
Opcjonalne wyniki.
Gracz otrzymuje 1 punkt za każdy poziomy rząd, w którym ma co najmniej jedną osadę.
Przykładowe wyniki: 14, 20, 12, 16.
Dla każdego gracza znajdź poziomy rząd, w którym znajduje się większość jego osiedli (wybierz dowolny w przypadku remisu). Gracz otrzymuje 2 punkty za każdą osadę w tym rzędzie.
Przykładowe wyniki: 14 (wiersz 16), 8 (wiersz 4, 5 lub 6), 28 (wiersz 11), 10 (wiersz 1).
Gracz otrzymuje 1 punkt za każdą osadę budowaną obok
W
.Przykładowe wyniki: 13, 21, 10, 5.
Gracz otrzymuje 1 punkt za każdą osadę obok
M
góry.Przykładowe wyniki: 4, 12, 8, 4.
Policz osadę każdego gracza w każdej ćwiartce. Na kwadrant gracze z największą liczbą osad otrzymują po 12 punktów , gracze z drugą co do wielkości liczbą osad otrzymują po 6 punktów .
Przykładowe wyniki: 18 (6 + 0 + 6 + 6), 36 (12 + 12 + 0 + 12), 12 (0 + 0 + 12 + 0), 18 (12 + 6 + 0 + 0).
Dla każdego gracza określ kwadrant, w którym mają najmniejszą liczbę osad. Gracz otrzymuje 3 punkty za każdą osadę w tej ćwiartce.
Przykładowe wyniki: 18 (kwadrant 2), 0 (kwadrant 3), 15 (kwadrant 1 lub 2), 27 (kwadrant 3).
Gracz otrzymuje 1 punkt za każdą połączoną grupę osad.
Przykładowe wyniki: 7, 5, 6, 29.
Gracz otrzymuje 1 punkt za każde 2 osady w największej grupie połączonych osad.
Przykładowe wyniki: 4, 10, 8, 2.
Wyzwanie
Podobnie jak w grze , wybierzesz 3 opcjonalne wyniki i zdobędziesz planszę na podstawie wyniku podstawowego i tych trzech wyników. Twój kod powinien wygenerować listę 4 wyników. Istnieje jedno ograniczenie wyboru: pogrupowałem wyniki na 3 grupy, a ty musisz wdrożyć po jednej z każdej grupy:
- Zaimplementuj jeden z 1 i 2 .
- Zaimplementuj jeden z 3, 4, 5 i 6 .
- Zaimplementuj jeden z 7 i 8 .
Możesz napisać program lub funkcję, przyjmując dane wejściowe przez STDIN, argument wiersza poleceń, monit lub parametr funkcji. Możesz zwrócić wynik lub wydrukować go do STDOUT.
Możesz wybrać dowolny dogodny format listy / łańcucha 1D lub 2D dla danych wejściowych. Być może nie używać wykres z pełną informacją przylegania. Oto kilka dobrych lektur na siatkach heksadecymalnych, jeśli potrzebujesz inspiracji.
Dane wyjściowe mogą być również w dowolnym wygodnym, jednoznacznym formacie listy lub ciągu.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Dalsze założenia
Możesz założyć, że ...
- ... każdy gracz ma co najmniej 1 osadę i nie ma więcej niż 40 osad każdego gracza.
- ... każdy kwadrant zawiera albo jedno miasto i dwa zamki, albo dwa miasta i jeden zamek.
- ... miasta i zamki są wystarczająco daleko od siebie, tak że żadna osada nie może przylegać do dwóch z nich.
Przypadki testowe
Nadal korzystając z powyższej planszy, oto poszczególne wyniki dla wszystkich możliwych wyborów mechanizmów oceniania:
Chosen Scores Total Player Scores
1 3 7 52 46 43 62
1 3 8 49 51 45 35
1 4 7 43 37 41 61
1 4 8 40 42 43 34
1 5 7 57 61 45 75
1 5 8 54 66 47 48
1 6 7 57 25 48 84
1 6 8 54 30 50 57
2 3 7 52 34 59 56
2 3 8 49 39 61 29
2 4 7 43 25 57 55
2 4 8 40 30 59 28
2 5 7 57 49 61 69
2 5 8 54 54 63 42
2 6 7 57 13 64 78
2 6 8 54 18 66 51
źródło
Odpowiedzi:
Python 2, 367 bajtów
Program wykorzystuje wyniki 1, 3, 7. Dane wejściowe to lista list znaków reprezentujących każdą komórkę. Aby łatwo przetestować przykładową tablicę, możemy:
Obsługa siatki heksadecymalnej
Ponieważ znajdujemy się na siatce heksadecymalnej, musimy nieco inaczej traktować sąsiadów. Jeśli użyjemy tradycyjnej siatki 2D jako naszej reprezentacji, wówczas
(1, 1)
mamy:Przy bliższej inspekcji zdajemy sobie sprawę, że przesunięcia zależą od parzystości wiersza, w którym jesteś. Powyższy przykład dotyczy wierszy nieparzystych, ale w wierszach parzystych przesunięcia są
Jedyne, co się zmieniło, to to, że pierwsza, druga, piąta i szósta para miały drugą współrzędną zmniejszoną o 1.
Funkcja lambda
N
przyjmuje parę współrzędnych(row, col)
i zwraca wszystkich sąsiadów komórki w siatce. Wewnętrzne zrozumienie generuje powyższe przesunięcia, wyodrębniając je z prostego kodowania podstawowego 3, zwiększając drugą współrzędną, jeśli rząd jest nieparzysty, i dodaje przesunięcia do danej komórki, aby dać sąsiadom. Zewnętrzne zrozumienie następnie filtruje, pozostawiając tylko sąsiadów, którzy znajdują się w granicach siatki.Nie golfił
źródło
def F
być funkcją oddzielną, a nie wewnętrzną? Nie możnak
go usunąćdef F:
?F
jest funkcją wypełniania zalania i potrzebuje dostępuJ
, więc jest w środku, aby zaoszczędzić na przekazywaniuJ
jako parametrze (eksperymentuję trochę, aby sprawdzić, czy uda mi się obejść głębokie kopiowanie).k
Ale masz rację , dziękuję :) (nowy kod wygląda jednak nieco funky, z powodu polegającego na zwarciu)Programowanie zestawu odpowiedzi, 629 bajtów
ASP należy do rodziny logicznych języków programowania, tutaj wcielonej przez framework Potassco , w szczególności Clingo (grounder Gringo + solver Clasp). Ze względu na ograniczenie paradygmatu nie może brać podanej płyty bezpośrednio jako wyjścia, dlatego konieczne jest wstępne przetwarzanie danych (tutaj wykonywane w pythonie). To przetwarzanie wstępne nie jest liczone w całkowitej liczbie bajtów.
To mój pierwszy golf golfowy, a celem jest raczej pokazanie języka, którego kocham, którego nigdy wcześniej nie widziałem w golfie, niż wygrywanie gry. Co więcej, nie jestem ekspertem od ASP, więc z pewnością można przeprowadzić wiele optymalizacji kodu, aby uzyskać wyniki w mniejszej liczbie bajtów.
Reprezentacja wiedzy
Istnieje kod python, który przekształca płytkę w atomy:
Na przykład atomy b (dla __b__oard) podane w pierwszym wierszu przykładowej planszy są następujące:
Gdzie b (0,0,3) jest atomem, który opisuje, że gracz 3 ma osadę na współrzędnych (0; 0).
Rozwiązywanie ASP
Istnieje kod ASP z zaimplementowanymi wieloma opcjonalnymi wynikami:
Ten program można uruchomić za pomocą polecenia:
I znajdzie tylko jedno rozwiązanie (jest to dowód, że istnieje tylko jeden sposób na rozłożenie punktów):
Gdzie s (7,3,6) mówi, że gracz 3 zyskuje 6 punktów z opcjonalnym wynikiem 7, a s (t, 4,62) mówi, że gracz 4 zyskuje w sumie 62 punkty (rdzeń + 1 + 3 + 7).
Łatwo parsować, aby mieć fantazyjny stół!
źródło