Gra planszowa
W grze planszowej „ Carcassonne ” gracze umieszczają płytki, dopasowując ich krawędzie i zdobywając najwyższe wyniki, tworząc duże, ciągłe obszary terenu. Oto (z grubsza) rodzaje i ilości płytek zawartych w grze:
#01
x4
#02
x5
#03
x8
#04
x2
#05
x9
#06
x4
#07
x1
#08
x3
#09
x3
#10
x3
#11
x4
#12
x5
#13
x3
#14
x3
#15
x2
#16
x5
#17
x5
#18
x2
#19
x3
#20
x1
#21
x5
#22
x2
#23
x1
#24
x1
#25
x1
Zadanie
Musisz umieścić kafelek, dopasowując krawędzie, jednocześnie starając się utrzymać możliwie największe ciągłe obszary terenu.
Umieszczenie
- Płytki można umieszczać tylko na jednym (maksymalnie 4) pustych polach sąsiadujących z dowolnymi istniejącymi płytkami (lub płytkami) w obszarze gry.
- Płytki można obracać o 90, 180 lub 270 stopni.
Dopasowywanie krawędzi
- Krawędzie umieszczonej płytki muszą pasować do dotykających się krawędzi (do 4) sąsiadujących płytek, tj. Dotykające się piksele mają ten sam kolor.
Przyległy teren
- „Zamykanie obszaru terenu” odnosi się do umieszczenia płytki w taki sposób, że dalsze sąsiadujące obszary koloru nie mogłyby być kontynuowane przy dalszym umieszczaniu płytek.
- Jeśli możliwe jest alternatywne umieszczenie, należy je wybrać w stosunku do dowolnego położenia płytki, które zamknęłoby obszar terenu.
- Jeśli musisz wybrać jedną z wielu końcowych miejsc docelowych, wybierz dowolne. Jeśli musisz wybierać spośród wielu nie-zamkniętych miejsc docelowych, wybierz dowolne.
- Pomiń # ff00ff (piksele narożne) przy obliczaniu sąsiadujących obszarów. Pomiń także budynki, tj. Obszary koloru już całkowicie zamknięte w kafelku.
Wkład
Dane wejściowe to dwa obrazy:
Plac zabaw.
- Początkowy obszar gry składa się z płytki
#11
(pojedynczej płytki). - Rozszerzony obszar gry utworzony jako wyjście musi być również obsługiwany jako wejście.
- Początkowy obszar gry składa się z płytki
Kafelek do umieszczenia.
- Wszystkie przykładowe kafelki muszą być obsługiwane jako dane wejściowe.
Określ pasujące krawędzie / ciągły teren, używając samych danych obrazu. Bez kodowania.
Wydajność
- Wyjście to obraz przedstawiający wynikowy obszar gry po umieszczeniu kafelka.
- Obraz musi być zgodny z twoim programem, tzn. Może być wykorzystany jako wejście do obszaru odtwarzania.
- Jeśli nie można umieścić kafelka, zwróć błąd.
Możesz to założyć
- Płytki mają zawsze rozmiar 55 na 55 pikseli
- Płytki będą zawsze miały kolory aktualnie używane w przykładowych kafelkach.
Notatki
- Twoja odpowiedź musi zawierać przykładowe wyniki po co najmniej 2 przejściach (zachęca się więcej).
- Jest to częściowe i niedokładne odwzorowanie oryginalnej gry planszowej, nie musisz stosować żadnych zasad i taktyk, które nie zostały tu wymienione.
Wynik
- Twój wynik to liczba bajtów przesłanych danych.
- Dane obrazu nie są uwzględniane w twoim wyniku.
- Najniższy wynik wygrywa.
Granie w pełną grę
Możesz napisać skrypt, który użyje twojego przesłania, aby zagrać w pełną grę, która może składać się z:
- Umieszczanie kafelka wybranego pseudolosowo z pełnego zestawu 85.
- Zwracanie kafelka do zestawu, jeśli nie można go umieścić.
- Powtarzanie do momentu umieszczenia każdego kafelka lub do momentu, gdy nie będzie można umieścić dwóch płytek z rzędu.
Nie zostanie uwzględniony w twojej liczbie bajtów ani nie poprawi twojego wyniku, ale prawdopodobnie zaoferuję nagrodę za tego rodzaju odpowiedź.
Odpowiedzi:
Perl 5 z PerlMagick:
875 789763Nie liczyłem linii zaczynającej się od
sub w
, która służy do sortowania pozycji w odległości od centrum, aby preferować kompaktowe rozwiązania (teraz działające poprawnie). W tej wersji unika się zamykania zgodnie z żądaniem, ale uważam, że przeciwieństwo jest bardziej interesujące i wierne grze. Aby to osiągnąć, zmień linię$s=$t if!grep...
na$s=$t if grep...
.Zastosowanie:
perl car.pl board.png tile.png
. Wynik zapisany wcar.png
. Status wyjścia to 1, jeśli nie można umieścić kafelka.Skrypt do uruchomienia kompletnej gry. Zakłada ona, powyższy kod znajduje się w pliku
car.pl
i płytki są przechowywane wtiles
katalogu o nazwie01.png
do25.png
.Teraz działa to dość wolno. 8-12 minut na moim komputerze. Preferowane przy zamykaniu: przy unikaniu zamykania (uwaga: nic nie jest zamknięte).
źródło
Common Lisp,
26502221199211861111 bajtówAktualizacja: „Łatwe” granie w golfa już wykonane, dalsze korzyści będą wymagać większych zmian.Aktualizacja 2: Ponieważ konkurencja staje się coraz ostrzejsza, nowa wersja nie faworyzuje pozycji wewnątrz bieżącego prostokąta boiska (byłoby to dodatkowe 57 bajtów). Ta opcja, podobnie jak prosta optymalizacja prędkości, jest domyślnie włączona w wersji do pobrania z symulatorem, ale nie w oficjalnej odpowiedzi poniżej.Aktualizacja 3: Niewielkie zmiany interfejsu dla zwiększenia liczby bajtów.
Stworzyłem również prosty internetowy interfejs użytkownika. Pełny pakiet (pojedynczy plik LISP i obrazy kafelków) można pobrać tutaj . Aby spróbować go zainstalować
hunchentoot
,zpng
apng-read
z quiclisp, obciążenie wcarcassonne.lisp
, i połączyć sięlocalhost:8080
. Kod został przetestowany na CCL / Windows i SBCL / Linux. Wyżej wymienione biblioteki są potrzebne tylko dla części interfejsu użytkownika / symulatora; samo rozwiązanie to zwykła ANSI Common Lisp.Wszystkie linie i odstępy między wierszami dotyczą wyłącznie kosmetyków, aby zapewnić czytelność, i nie są liczone do łącznej sumy.
Powinieneś wywołać funkcję
c
z dwoma argumentami: bieżącym polem gry i kafelkiem do umieszczenia. Oba powinny być tablicami 2D; kafelek 55x55 i pole wielokrotność tego. Dodatkowo pole pola musi być regulowane. Funkcja zwraca dwuelementową listę z nowym polem jako pierwszym argumentem. Drugi element dotyczy sytuacji,NIL
gdy kafelek nie może zostać umieszczony, lub w przeciwnym razie lista zawierająca współrzędne po lewej u góry i obrót najnowszego kafelka w tej tablicy oraz wynik dla tego kafelka. Informacje te można wykorzystać do celów wizualizacji.Zauważ, że w kolejnych wywołaniach musisz użyć nowego pola zwróconego przez,
c
nawet jeśli drugim elementem listy jestNIL
(oryginalna tablica mogła zostaćadjust-array
edytowana, a tym samym unieważniona).Kod jest teraz nieco wolniejszy, optymalizacja liczby bajtów skutkuje zbędnymi obliczeniami. Poniższy przykład został ukończony w moim systemie za około trzy minuty.
Przykładowy przebieg dla wszystkich 85 kafelków:
Zrzut ekranu interfejsu sieciowego:
źródło
DarkBASIC Pro:
207819321744 bajtówAKTUALIZACJA: Jeszcze więcej wysiłku w golfa
AKTUALIZACJA: Teraz w pełni spełnia specyfikację, w tym preferowanie opcji nie zamykających.
Wybrałem DarkBASIC, ponieważ chociaż jest dość szczegółowy, zapewnia niezwykle prosty i prosty zestaw poleceń do manipulowania obrazami.
Przesłałem plik EXE dla osób, które nie mają kompilatora DarkBASIC ( Windows ).
źródło