Scenariusz
Jadę samochodem samochodem i zaczyna padać deszcz. Krople deszczu spadają losowo na moje okno, a teraz zadaję sobie pytanie, gdzie jest największy połączony mokry teren?
Zadanie
Aby to ułatwić, okno jest podzielone na macierz 10 * 10 kwadratów. Twoim zadaniem jest znalezienie największego połączonego obszaru zrzutu wody w oknie.
Wejście
Istnieją dwa możliwe dane wejściowe, możesz użyć macierzy dwuwymiarowej lub jednowymiarowej. Możesz wybierać między dowolnymi danymi wejściowymi, takimi jak stdin itp.
Przykład:
// 2-dimensional:
[[0,1,0,0,0,0,1,0,0,0],
[0,1,1,0,0,0,0,1,1,0],
[0,1,1,0,0,0,0,1,0,0],
[0,1,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,0,0,0,0,0]]
// 1-dimensional
[0,1,0,0,0,0,1,0,0,0,
0,1,1,0,0,0,0,1,1,0,
0,1,1,0,0,0,0,1,0,0,
0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,0,0,0,0,0]
Wynik
Twój kod musi podawać rozmiar największego połączonego obszaru oraz współrzędne x i y kropli wody należących do tego obszaru w formacie
„Rozmiar: Współrzędne Z: (X1, Y1) (X2, Y2) .. . "
Przykład dla poprzedniego wejścia:
Size: 6 Coordinates: (1,0) (1,1) (2,1) (1,2) (2,2) (1,3)
Kolejność współrzędnych nie ma znaczenia.
Zasady
- Krople wody są połączone, jeśli dotykają się one ortogonalnie
- Połączenia ukośne się nie liczą
- Może być wiele obszarów, a Twój kod musi znaleźć największy
- Puste pole jest reprezentowane jako „0”, a mokre pole jako „1”
- Zamieść swoje rozwiązanie z krótkim objaśnieniem i wynikiem poprzednich danych wejściowych
- Zwycięży najkrótszy kod w ciągu najbliższych 7 dni
- Jeśli są dwa obszary o tym samym rozmiarze, możesz wybrać jeden
Odpowiedzi:
Ruby, 171 znaków
Wprowadź za pomocą parametru wiersza polecenia jako tablicę jednowymiarową.
Dane wyjściowe dla przykładowego wejścia:
Size: 6 Coordinates: (1,0) (1,1) (1,2) (1,3) (2,2) (2,1)
W tej odpowiedzi zastosowano proste podejście do wypełniania zalewem, tworząc listę współrzędnych dla każdej grupy kropel deszczu. Większość kodu jest faktycznie używana do sprawdzania granic i we / wy.
źródło
Python - 192
Dane wejściowe (wklej przed kodem):
Dzięki za hobby Calvina za sugerowane zmiany!
źródło
map(f,range(100))
zamiast[f(i)for i in range(100)]
zapisać 8 znaków. Również uważam, że twoje współrzędne nie są (y, x) nie (x, y).C # -
548523522511503476(poniżej 500 ... tak)
Jestem pewien, że jest wiele miejsca na ulepszenia.
Sposób, w jaki wprowadziłem dane, to zainicjowanie tablicy. Nie uwzględniłem tej tablicy w partyturze (jeśli uważasz, że to oszustwo, mogę zmienić kod, ale doda on stosunkowo dużo kodu, ponieważ C # nie jest dobry w analizowaniu tablic)
Przetestuj na stronie http://ideone.com/UCVCPM
Uwaga: bieżąca wersja nie działa w ideone, ponieważ się nie podoba
using l=System.Collections...
, więc wersja ideone jest nieco nieaktualna (i dłuższa)Jak to działa
Zasadniczo sprawdza, czy istnieje
1
. Jeżeli stwierdzi jedną, używa algorytmu Wypełnienia zastąpić wszystkie sąsiadujące1
„sz0
i dodaje zastąpionych współrzędne do listy tymczasowego. Następnie porównuje górną listę (m
) z listą tymczasową (t
) i ustawiam
nat
if, jeślit
zawiera więcej elementów.źródło
Mathematica - 180 bajtów
Ta funkcja przyjmuje tablicę dwuwymiarową.
Grał w golfa
Ładny
Przykład
Wyjście jest nieco anomalne. Mathematica rozpoczyna indeksowanie od 1 zamiast 0 i używa
{}
do wskazania pozycji. Dodaj 2 bajty (-1
), jeśli pozycje muszą być indeksowane 0. Dodaj dużo bajtów, jeśli trzeba ich użyć()
zamiast{}
:(Wyjaśnienie
f
jest funkcjąx
. Definiuje onc
jako transformację tegox
, gdzie każdy (i, j) jest teraz liczbą całkowitą odpowiadającą, do którego podłączonego komponentu należy. Obejmuje główną pracę:Następnie
m
oblicza, ile elementów jest w każdym komponencie, sortuje je według tej liczby i przyjmuje ostatni wynik (czyli najwięcej elementów). Ostatni wiersz wypisuje liczbę i pozycjec
indeksu zawarte wm
.źródło
Haskell, 246
Wejście
Dwuwymiarowy i wklej przed kodem
g
, na przykład:Nie golfił
źródło
Funkcja C # 374 bajtów
To jest mocno zmodyfikowana wersja mojej odpowiedzi na pytanie Czy jesteś w największym pokoju? . Pobiera jednowymiarową tablicę liczb całkowitych i zwraca ciąg znaków w wymaganym stylu. Działa poprzez budowanie rozłącznych zestawów z danych wejściowych (pierwsza pętla), obliczanie wielkości każdego zestawu i znajdowanie największego zestawu (druga pętla), a następnie dołączanie dowolnych komórek w tym zestawie do ciągu wyjściowego (trzecia pętla), który jest następnie zwracany .
Mniej golfa (z kodem testowym):
źródło
JavaScript (EcmaScript 6) 183
189Funkcja z wejściem tablicowym i zwracaną wartością ciągu. Jeśli potrzebne jest wyjście (nie jest to dla mnie jasne), dodaj 7 bajtów dla „alert ()”.
Wyjście testowe
Bardziej czytelny
Wyjaśnienie
Uzyskaj tablicę jednowymiarową i opcjonalny parametr o wielkości wiersza. Funkcja działa również z różnymi wymiarami tablicy, nawet x! = Y.
Pseudo kod:
źródło
JavaScript, 273
Funkcja przyjmuje tablicę i zwraca ciąg znaków. Moja pierwsza próba to ~ 500 znaków i nie użyłem Flood Fill. Ten robi. Uczę się JavaScript, więc wszelkie sugestie będą mile widziane.
Ta funkcja przechodzi przez tablicę wejściową i dla każdego znalezionego 1 zaczyna się tam i zmienia wszystkie połączone na 1s na 0 za pomocą funkcji Fill. Robiąc to, pamięta kroplę z największą liczbą 1. Funkcja Wypełnienie zmienia bieżącą pozycję na 0, a następnie wywołuje się w pozycji powyżej, w prawo, poniżej i w lewo.
Przetestuj tutaj: http://goo.gl/9Hz5OH
Kod czytelny
źródło
Scala, 420
Cześć, mój wpis przyjmuje tablicę 2d jako a
List[List[Int]]
, zwraca aString
Wyjaśnienie
Biorąc pod uwagę okno jako
List[List[Int]]
, najpierw znajdujemy każde „1” i zapisujemy współrzędne na liście. Następnie zamieniamy tę listę naMap
współrzędną każdego „1” na listę współrzędnych każdego sąsiedniego „1”. Następnie użyj mapy sąsiedztwa, aby przejściowo połączyć podpobloki w obiekty BLOB, a na koniec zwracamy największy obiekt BLOB (i ignorujemy zduplikowane obiekty BLOB, ponieważ kolejność zwracanych współrzędnych nie ma znaczenia).Bardziej czytelny
Krytyka jest bardzo ceniona.
źródło