To pytanie jest podobne do największego kwadratu w siatce .
Wyzwanie
Biorąc pod uwagę macierz 1
iw 0
formacie łańcuchowym "xxxx,xxxxx,xxxx,xx.."
lub tablicowym ["xxxx","xxxx","xxxx",...]
, utworzysz funkcję, która określa obszar największej kwadratowej submatrix zawierającej wszystko 1
.
Kwadratowa submatrix ma taką samą szerokość i wysokość, a twoja funkcja powinna zwrócić obszar największej submatrix, który zawiera tylko 1
.
Na przykład:
Biorąc pod uwagę "10100,10111,11111,10010"
, wygląda to następująco:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Możesz zobaczyć pogrubioną czcionkę, która 1
tworzy największą kwadratową submatrix o rozmiarze 2x2, więc twój program powinien zwrócić obszar o wartości 4.
Zasady
- Submatrix musi mieć taką samą szerokość i wysokość
- Podmacierz musi zawierać tylko wartości
1
- Twoja funkcja musi zwrócić obszar największej submatrix
- Jeśli nie zostanie znaleziona submatrix, zwróć
1
- Możesz obliczyć obszar submatrix, licząc liczbę
1
w submatrix
Przypadki testowe
Wejście: "10100,10111,11111,10010"
Wyjście: 4
Wejście: "0111,1111,1111,1111"
Wyjście: 9
Dane "0111,1101,0111"
wyjściowe: 1
To jest golf-golf, więc wygrywa najkrótsza odpowiedź w bajtach.
Odpowiedzi:
Galaretka , 18 bajtów
+2 do obsługi wyjścia wyjściowego podlisty „nie wszystko”
Wypróbuj online! Lub zobacz pakiet testowy
W jaki sposób?
źródło
Haskell ,
113 121 118117 bajtówWypróbuj online!
-3 bajty dzięki Laikoni !
-1 bajt dzięki Lynn !
+8 bajtów za absurdalny wymóg zwrócenia 1 dla podmacierzy all-1s.
Wyjaśnienie / Niegolfowany
Następująca funkcja pomocnicza tworzy po prostu przesunięcia
x
umożliwiające ich zmniejszenies
:x#y
usuniey
elementy z listy, a następnie weźmiex
:Funkcja
f
zapętla wszystkie możliwe rozmiary podmacierzy w kolejności, generuje każdą podmacierz o odpowiednim rozmiarze, sprawdza, czy zawiera tylko'1'
s i zapisuje rozmiar. Tak więc rozwiązaniem będzie ostatni wpis na liście:źródło
Haskell ,
9997 bajtówSprawdza, czy dane wejściowe są macierzą kwadratową tylko tych z
s==('1'<$s<$s)
, jeśli tak, odpowiedź ma długość ^ 2, w przeciwnym razie 0. Następnie rekurencyjnie przecina pierwszą / ostatnią kolumnę / wiersz i przyjmuje maksymalną wartość, jaką znajdzie gdziekolwiek.Wypróbuj online!
źródło
K (ngn / k) ,
3328 bajtówWypróbuj online!
źródło
J ,
3327 bajtów-6 bajtów dzięki FrownyFrog!
Wypróbuj online!
Wyjaśnienie:
W wyjaśnieniu użyję pierwszego przypadku testowego:
Generuję wszystkie możliwe kwadratowe submatrice o rozmiarze od 1 do liczby rzędów danych wejściowych.
,~@#\
tworzy listę par dla rozmiarów podmacierzy,,.
łącząc je, aby długość kolejnych prefiksów#\
danych wejściowych:Następnie używam ich do cięcia
x u ;. _3 y
danych wejściowych na podmacierze. Mam jużx
(listę rozmiarów);y
jest właściwym argumentem]
(dane wejściowe).Dla każdej submatrix sprawdzam, czy składa się ona w całości z 1:
(#**/)@,
- spłaszcz macierz i mnoż liczbę przedmiotów według ich produktu. Jeśli wszystkie elementy mają wartość 1, wynikiem będzie ich suma, w przeciwnym razie - 0:Na koniec spłaszczam listę wyników dla każdej submatrix i znajduję maksimum:
>./@,
źródło
,~@#\
i"1 2
->"$
"$
#
jest krótszy niż suma 1.APL (Dyalog Unicode) ,
353432 bajtyWypróbuj online!
SBCS Adáma ma wszystkie znaki w kodzie
Wyjaśnienie nadchodzi w końcu!
źródło
Siatkówka , 143 bajty
Wypróbuj online! Link zawiera przypadki testowe. Pobiera dane wejściowe jako ciągi rozdzielone przecinkami. Wyjaśnienie:
Dodaj a,
,
aby zakończyć ostatni ciąg, a,;
aby oddzielić ciągi od#
si#
jako a jako licznik.Powtarzaj blok, aż nie dojdzie już do żadnych zmian (ponieważ każdy ciąg ma teraz tylko jedną cyfrę).
Potrój trzykrotnie linię, ustawiając licznik na 1 w pierwszym wierszu i zwiększając go w ostatnim wierszu.
W pierwszym wierszu usuń pierwszą cyfrę każdego ciągu, a w drugim wierszu usuń wszystkie cyfry oprócz pierwszej.
W trzeciej linii bitowo i pierwsze dwie cyfry razem.
W tym momencie każda linia składa się z dwóch wartości: a) licznika szerokości poziomej ib) bitowego oraz tylu bitów pobranych z każdego łańcucha. Konwertuj pozostałe
1
s na#
s, aby można je było porównać z licznikiem.Znajdź dowolne przebiegi bitów (pionowo), które pasują do licznika (poziomo), odpowiadające kwadratom
1
s na oryginalnym wejściu, i wyprostuj długość.Sortuj numerycznie.
Weź największy.
Specjalny przypadek macierzy zerowej.
źródło
JavaScript, 92 bajty
Pokaż fragment kodu
źródło
APL (Dyalog Classic) ,
2120 bajtówWypróbuj online!
źródło
Python 2 ,
117109 bajtówPodziękowania dla @etene za wskazanie nieefektywności, która kosztowała mnie dodatkowy bajt.
Wypróbuj online!
Pobiera dane wejściowe jako ciąg rozdzielany przecinkami. Jest to podejście oparte na wyrażeniach regularnych, które próbuje dopasować ciąg wejściowy do wzorców formularza
111.....111.....111
dla wszystkich możliwych rozmiarów kwadratu.W moich obliczeniach robienie tego z anonimową lambda jest tylko odrobinę krótsze niż zdefiniowana funkcja lub pełny program.
or 1
Część w końcu jest tylko niezbędne do obsługi dziwny przypadek krawędzi, gdzie musimy wyjście1
, jeżeli nie ma w nich wejścia.źródło
Python 2 ,
116115117109 bajtówPodziękowania dla @Kirill za to, że pomógł mi jeszcze bardziej w golfa i za jego sprytne i wczesne rozwiązanie
Edycja : 1-bajtowy golf za pomocą lambda, nie wiedziałem, że przypisanie go do zmiennej nie wlicza się do liczby bajtów.
Edycja 2 : Kirill wskazał, że moje rozwiązanie nie działa w przypadkach, w których dane wejściowe zawierają tylko
1
s, musiałem to naprawić i straciłem dwa cenne bajty ...Edycja 3 : więcej golfa dzięki Kirill
Bierze ciąg oddzielony przecinkami, zwraca liczbę całkowitą.
Wypróbuj online!
Niezależnie znalazłem odpowiedź, która jest zbliżona do odpowiedzi Kirila, tj. Oparta na wyrażeniach regularnych, z wyjątkiem tego, że używam
re.search
i a.def
Używa wyrażenia regularnego zbudowanego podczas każdej pętli, aby dopasować przyrostowo większy kwadrat i zwraca największy, lub 1.
źródło
if
podejście jako „na pewno za długo”, ale potem musiałem wymyślić inny sposób, aby uzyskać wartość boolową z meczu. Niestety, w Twoim rozwiązaniu brakuje jednego punktu - nie możesz tego miećrange(l)
- pominiesz przypadek, gdy nie będzie żadnych zer. Np. Weź drugi przypadek testowy i zrób wszystkie 1 - powinno być 16, a nie 9.find
. Teraz, gdy nasze kody nie są już identyczne, sugeruję, abyśmy przynajmniej naprawili od siebie oczywiste błędy - w twoim przypadku dodatkowy bajt pochodzi z użycia krotki("1"*i,)
zamiast listy.find
, to było sprytne z twojej strony.Rubinowy
-n
, 63 bajtyWypróbuj online!
Wersja Ruby mojej odpowiedzi w języku Python . Golfier jako pełny program. Alternatywnie, anonimowa lambda:
Rubinowy ,
7068 bajtówWypróbuj online!
źródło
Perl 6 ,
616058 bajtówWypróbuj online!
źródło
Python 2 ,
138128 bajtówWypróbuj online!
Zapisano
źródło
Clojure, 193 bajtów
Wow, rzeczy się eskalowały: o
Mniej golfa:
źródło