Wkład
Tablica: Kontener 2D (matryca, lista list itp.) Z literami takimi jak:
["B", "C", "C", "C", "C", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "B", "B", "A", "C", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
Jeśli wybierzesz listę list, możesz założyć, że wszystkie listy podrzędne są tej samej długości.
Zasady
- Aby utworzyć prawidłowy prostokąt, potrzebujesz wszystkich rogów prostokąta z tą samą „literą”.
- Przykład, spójrz na przykładową tablicę z X poniżej. Możesz zobaczyć „X” na (1,0) również na (4,0) również na (1,3) i na (4,3), wtedy masz prostokąt [1,0,4,3], co oznacza, że z (1,0) do (4,3):
Przykładowa tablica z X :
["B", "X", "C", "C", "X", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "X", "B", "A", "X", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
- Celem jest znalezienie prostokąta lub jednego z prostokątów o największej powierzchni obliczonej przez (prawo-lewo + 1) * (dół-góra + 1)
- Jeśli istnieje wiele prostokątów o tym samym maksymalnym obszarze, wyślij dowolny. Opcjonalnie ten z leksykograficznie najmniejszą (współrzędną górną, lewą współrzędną, prawą współrzędną, współrzędną dolną).
- Prostokąty muszą mieć krawędzie równoległe do krawędzi planszy.
- Każda litera jest drukowalnym znakiem ASCII od A do Z (oba w zestawie).
Wydajność
Dane wyjściowe powinny być pozycjami w lewo iw prawo w rogach największego obszaru prostokątnego. Dla pierwszej przykładowej „planszy” duży kwadrat jest żółty:
Odpowiedź powinna brzmieć:
[1, 1, 8, 4]
Drugi przykładowy przypadek testowy
Dane wejściowe:
["C", "D", "D", "D", "A", "A"],
["B", "D", "C", "D", "A", "A"],
["B", "D", "D", "C", "A", "C"],
["B", "D", "B", "C", "A", "C"]
Powinien dać jedną z tych trzech list współrzędnych identyfikujących obszar sześciu prostokątów:
[1, 0, 2, 2]
[1, 0, 3, 1]
[3, 2, 5, 3]
To pytanie jest zamieszczone na stronie Przepełnienie stosu z tytułem: Jak znaleźć największy prostokąt w tablicy 2D utworzonej z czterech identycznych narożników? i z tym niegrzecznym rozwiązaniem JS (mogę powiedzieć „niegrzeczny”, ponieważ to mój kod;):
Ok, to mój pierwszy post, bądź dla mnie tolerancyjny. Zmienię wszystko, co powiesz, aby poprawić quiz.
((left,top),(right,bottom))
powinno być w porządku. Usunąłem swoją odpowiedź i odpowiedz ponownie, gdy pytanie zostanie całkowicie dopracowane.Odpowiedzi:
Python 2 ,
148130 bajtówWypróbuj online!
źródło
Siatkówka ,
163162 bajtyWypróbuj online! Edycja: Zapisano 1 bajt, ponieważ końcowe
)
dopasowanie do$.(
niejawnego. Wyjaśnienie:To wyrażenie regularne pasuje do prostokątów. Grupy są następujące: 1) Górny rząd (jako liczba przechwytywania) 2) Lewa kolumna (jako długość) 3) Równoważenie w celu zapewnienia wyrównania lewych narożników 4) Litera dla narożników 5) Szerokość + 1 (jako długość) 6) Równoważenie aby zapewnić wyrównanie prawych narożników 7) Prawa kolumna (jako długość) 8) nieużywana 9) Wysokość (jako liczba przechwytywania). Ta
w
opcja zapewnia dopasowanie wszystkich możliwych szerokości prostokątów do każdego lewego górnego rogu. Do$
listy Opcje te wyniki, stosując następujący wzór zastąpienia.Podstawienia są następujące: prawa kolumna, górny rząd, lewa kolumna, negacja obszaru prostokąta (dosłownie obliczona jako długość powtórzenia ciągu szerokości jeden raz więcej niż wysokość razy), lewa kolumna , górny wiersz, prawa kolumna, a następnie wyrażenie, które zwraca wartość do dolnego wiersza (przechwytywanie kosztowałoby 12 bajtów plus zabrakło jednocyfrowych zmiennych). Pierwsze cztery przechwytywania reprezentują porządek sortowania w kolejności pierwszeństwa. Gdy Retina sortuje stabilnie, można ustalić sortowanie wielokolumnowe, sortując kolejno każdą kolumnę sortowania od najmniejszego do największego priorytetu. (Obszar musi być posortowany w kolejności malejącej, więc nie można użyć sortowania według pojedynczego łańcucha).
Następnie wykonuje się cztery sortowania numeryczne.
Kolumna sortowania jest następnie usuwana po każdym sortowaniu.
Pierwszy wpis jest zatem pożądanym rezultatem.
Uwaga: Ograniczenie wyboru prostokąta dla danego obszaru zostało odtąd złagodzone, a następująca
144143-bajtowa wersja preferuje szerszy niż wyższy prostokąt:Wypróbuj online!
źródło
Galaretka , (27?)
2928 bajtów27 jeśli indeksowanie na podstawie 1 jest dozwolone - usuń końcowe
’
Pełny program.
Wypróbuj online! (lub zobacz inny przypadek testowy )
W jaki sposób?
źródło
Perl 6 ,
8373 bajtyWypróbuj online!
Zwraca listę list
((x0 y0) (x1 y1))
.Wyjaśnienie
źródło
Haskell , 144 bajty
Wypróbuj online!
źródło
b<=d
tak długo, jak będziesz to robića<=c
.Galaretka , 24 bajty
Wypróbuj online!
⁺
okazuje się przydatny.Format wyjściowy: [góra, dół], [lewo, prawo] . 1-indeksowanie.
źródło
JavaScript (ES6), 121 bajtów
-1 bajt dzięki @ l4m2
-1 bajt dzięki @tsh
+2 bajty, aby zachować zgodność z nową regułą punktacji prostokąta
Pobiera dane wejściowe jako macierz ciągów znaków. Zwraca współrzędne 0-indeksowane: [x0, y0, x1, y1] .
Wypróbuj online!
źródło
a=>a.map(b=(r,y)=>r.map((v,x)=>a.map((R,Y)=>R.map((V,X)=>V+R[x]+r[X]!=v+v+v|(A=(X-x)*(Y-y))<=b||(o=[x,y,X,Y],b=A)))))&&o
(A=...)<=b
->(A=...)<b
?APL (Dyalog Classic) , 38 bajtów
Wypróbuj online!
źródło
Java 8,
208205 bajtówZdecydowanie można grać w golfa .. Teraz używam najbardziej oczywistego podejścia, używając
czterechtrzech zagnieżdżonych pętli for.-3 bajty dzięki @ceilingcat łącząc wewnętrzne pętle wierszy i kolumn w jedną pętlę.
Wyjaśnienie:
Wypróbuj online.
źródło