Farmer Jack jest bardzo biedny. Chce zapalić całą farmę, ale przy minimalnych kosztach. Lampa może oświetlić własną komórkę, a także ośmiu sąsiadów. Ustawił lampy na swoim polu, ale potrzebuje twojej pomocy w ustaleniu, czy zachował jakieś dodatkowe lampy.
Dodatkowe lampy: lampy, które po wyjęciu z gospodarstwa nie będą miały znaczenia dla liczby zapalonych komórek Ponadto lampy, które wskażesz, nie będą usuwane jeden po drugim, ale będą usuwane jednocześnie.
Uwaga: Jedyną czynnością, którą możesz wykonać, jest usunięcie niektórych lamp. Nie można zmieniać kolejności ani wstawiać lamp. Twoim ostatecznym celem jest usunięcie maksymalnej liczby lamp, tak aby każda komórka, która była wcześniej zapalona, była nadal zapalona.
Pomóż farmerowi Jackowi wykryć maksymalną liczbę bezużytecznych lamp, aby mógł z nich korzystać w innym miejscu.
Wejście
Zostanie wyświetlony wymiar w pierwszym wierszu pola M i N. Kolejne linie M zawierają N znaków, z których każdy reprezentuje pole.
„1” oznacza komórkę, w której trzymana jest lampa.
„0” oznacza pustą komórkę.
Wynik
Musisz podać liczbę całkowitą zawierającą liczbę bezużytecznych lamp.
Przykładowe dane wejściowe:
3 3
100
010
001
Przykładowe dane wyjściowe:
2
Zwycięzca:
Ponieważ jest to golf golfowy, zwycięzcą będzie ten, który pomyślnie wykona zadanie w co najmniej liczbie znaków
Odpowiedzi:
Mathematica 186 (chciwy) i 224 (wszystkie kombinacje)
Chciwe rozwiązanie
To wyłącza zbędne światła jeden po drugim. Jeśli zasięg światła nie zmniejsza się, gdy światło gaśnie, światło to można wyeliminować. Chciwe podejście jest bardzo szybkie i może z łatwością obsługiwać matryce 15 x 15 i znacznie większe (patrz poniżej). Zwraca pojedyncze rozwiązania, ale nie wiadomo, czy jest to optymalne, czy nie. Oba podejścia, w wersjach golfowych, zwracają liczbę nieużywanych świateł. Podejścia bez golfa również wyświetlają siatki, jak poniżej.
Przed:
Po:
Optymalne rozwiązania wykorzystujące wszystkie kombinacje świateł (224 znaki)
Dzięki dzięki @ Clément.
Wersja bez golfa wykorzystująca wszystkie kombinacje świateł
f Funkcja transformacji morfologicznej stosowana w
sameCoverageQ
traktowanych jako oświetlonych (wartość = 1 zamiast zera) kwadracie 3 x 3, w którym znajduje się każde światło. Kiedy światło znajduje się w pobliżu krawędzi farmy, tylko kwadraty (mniej niż 9) w granicach farma jest liczona. Nie ma liczenia; kwadrat oświetlony przez więcej niż jedną lampę jest po prostu zapalony. Program wyłącza każde światło i sprawdza, czy całkowite pokrycie oświetlenia w gospodarstwie jest zmniejszone. Jeśli tak nie jest, światło to jest eliminowane.nOnes[matrix]
zlicza liczbę oznaczonych komórek. Służy do zliczania świateł, a także do zliczania zapalonych komóreksameCoverageQ[mat1, mat2]
sprawdza, czy zapalone komórki w macie1 są równe liczbie zapalonych komórek w macie2.MorphologicalTransform [[mat] pobiera macierz świateł i zwraca macierz` komórek, które zapalają.c[m1]
pobiera wszystkie kombinacje świateł z m1 i testuje je pod kątem zasięgu. Spośród tych, które mają maksymalny zasięg, wybiera te, które mają najmniej żarówek. Każdy z nich jest optymalnym rozwiązaniem.Przykład 1:
Konfiguracja 6x6
Wszystkie optymalne rozwiązania.
Wersja golfowa wykorzystująca wszystkie kombinacje świateł.
Ta wersja oblicza liczbę nieużywanych świateł. Nie wyświetla siatek.
c
zwraca liczbę nieużywanych świateł.n[matrix]
zlicza liczbę oznaczonych komórek. Służy do zliczania świateł, a także do zliczania zapalonych komóreks[mat1, mat2]
sprawdza, czy zapalone komórki w macie1 są równe liczbie zapalonych komórek w macie2.t [[mat] pobiera macierz świateł i zwraca macierz` komórek, które zapalają.c[j]
pobiera wszystkie kombinacje świateł z j i testuje je pod kątem zasięgu. Spośród tych, które mają maksymalny zasięg, wybiera te, które mają najmniej żarówek. Każdy z nich jest optymalnym rozwiązaniem.Przykład 2
Dwa światła można zapisać, zachowując taki sam zasięg oświetlenia. cm]
źródło
Python, 309 znaków
Działa przy użyciu masek bitowych.
L
to lista świateł, gdzie każde światło jest reprezentowane przez liczbę całkowitą z (maksymalnie) 9 bitami ustawionymi dla jego wzorca światła. Następnie wyczerpująco wyszukujemy podzbiory tej listy, których bitowe - lub jest takie samo jak bitowe - lub całej listy. Najkrótszy podzbiór jest zwycięzcą.m
to maska, która zapobiega zawijaniu się bitów podczas zmiany biegów.źródło
Java 6-509 bajtów
Podjąłem pewne założenia dotyczące limitów i rozwiązałem problem, jak stwierdzono w tym czasie.
Uruchom tak:
java F <inputfile 2>/dev/null
źródło
java F <inputfile 2>nul
, jeśli to się nie powiedzie,java F <inputfile
zignoruj wyjątek. Również nie będzie działać z java 7.c ++ - 477 bajtów
źródło
Ruby, 303
[zostało to zakodowane, aby odpowiedzieć na poprzednią wersję pytania; przeczytaj notatkę poniżej]
Konwertowanie na tablice logiczne, a następnie porównywanie dzielnic pod kątem zmian.
Ograniczenie (?): Maksymalna wielkość pola gospodarstwa wynosi 1000 x 1000. Problem mówi „Farmer Jack jest bardzo biedny”, więc zakładam, że jego farma nie jest większa. ;-) Ograniczenie można usunąć, dodając 2 znaki.
UWAGA: odkąd zacząłem to kodować, wydaje się, że wymagania dotyczące pytań uległy zmianie. Dodano następujące wyjaśnienie „lampy, które wskażesz, nie będą usuwane jeden po drugim, ale będą usuwane jednocześnie” . Niejasność pierwotnego pytania pozwoliła mi zaoszczędzić trochę kodu, testując usuwanie pojedynczych lamp. Dlatego moje rozwiązanie nie będzie działać dla wielu przypadków testowych w nowych wymaganiach. Jeśli będę miał czas, naprawię to. Nie mogę. Proszę nie głosować za tą odpowiedzią, ponieważ inne odpowiedzi tutaj mogą być w pełni zgodne.
źródło
APL, 97 znaków / bajtów *
Przyjmuje środowisko A
⎕IO←1
i⎕ML←3
APL.Wersja bez golfa:
Zgadzam się, że więcej przypadków testowych byłoby lepszych. Oto losowy:
Wejście:
Wyjście (lampy bezużyteczne):
Układ z lampami min (brak w wersji golfowej):
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL może być zapisany we własnym (starszym) jednobajtowym zestawie znaków, który odwzorowuje symbole APL na górne 128 bajtów. Dlatego do celów oceniania program N znaków, który używa tylko znaków ASCII i symboli APL, można uznać za N-bajtowy.
źródło
C ++ 5.806 bajtów
Nie jest to jeszcze zoptymalizowane pod kątem rozmiaru. Ale ponieważ jest niewielu uczestników, na razie zostawię to.
FarmersField Header:
FarmersField CPP:
I zestaw testów pokazujących, że kod robi to, co został zbudowany:
źródło
3420 bajtów Perla
Nie jest to rozwiązanie dla golfistów, ale ten problem był dla mnie interesujący:
(I / O został wyjęty, abym mógł pokazać konkretne testy)
źródło
Python - 305 bajtów
źródło