Wprowadzenie
Zauważmy następujący kwadrat, składający się tylko z cyfr 0 - 9
:
1034
4167
8414
3542
Zewnętrzna powłoka tego kwadratu to:
1034
4 7
8 4
3542
Zawiera ona zera, więc musimy obrać z zewnętrznej powłoki, pozostawiając:
16
41
Zewnętrzna powłoka tego kwadratu to:
16
41
To ma nie zawierać żadnych zera, a zatem jest nieskażone kwadratowy. Zasadniczo definicja niezanieczyszczonego kwadratu jest taka, że zewnętrzna powłoka kwadratu nie zawiera zer.
Zadanie
Biorąc pod uwagę kwadrat cyfr (zawierający tylko nieujemne liczby całkowite) w dowolnym rozsądnym formacie, wyprowadzaj największy niezanieczyszczony kwadrat , stale odrywając zewnętrzną powłokę, w dowolnym rozsądnym formacie.
Przypadki testowe
Przypadek testowy 1:
Input Output
1234 1234
2345 2345
3456 3456
4567 4567
Przypadek testowy 2:
Input Output
123 123
204 204
346 346
Przypadek testowy 3:
Input Output
101 1
010
101
Przypadek testowy 4:
Input Output
000 (none)
000
000
To jest golf golfowy , więc wygrywanie z najmniejszą ilością bajtów wygrywa!
416\n841\n354\n
(lewy dolny róg)?0
lub coś takiego.Odpowiedzi:
Galaretka ,
1916 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
JavaScript,
10597 bajtówZaoszczędź 8 bajtów dzięki @Patrick Roberts!
Definiuje funkcję
s
, która zwraca tablicę liczb całkowitych 2D, gdy podana jest tablica liczb całkowitych 2D.Jak to działa
funkcja
l
: podana tablicaa
zwraca kopię bez pierwszego i ostatniego indeksu.funkcja
p
: biorąc pod uwagę tablicę 2Da
, wezwanial
do usunięcia pierwszego i ostatniego wiersza, a następnie dla każdego pozostałego wywołania wierszal
do usunięcia pięści i ostatniej kolumny. To wykonuje obieranie cebuli.funkcja
c
: biorąc pod uwagę tablicę 2Da
, zwraca ciąg znaków, który zawiera tylko0
s w postaci łańcuchaa
.funkcja
s
: biorąc pod uwagę tablicę 2Da
, wywołujec
obraną formę tablicy podaną przezp
i samą tablicę. Porównuje te ciągi leksykograficzne, aby ustalić, czy obrana forma ma mniej0
s niż oryginał. Jeśli tak, to oryginał jest zanieczyszczony, więc zadzwońs
rekurencyjnie na obraną formę. W przeciwnym razie zwróć oryginał.źródło
a.length
zend
argumentuarray.slice
inl
i zapisać 8 bajtów.end
może być indeksem ujemnym.Siatkówka ,
6057 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1. Końcowe podawanie linii jest znaczące.
Wypróbuj online!
Wyjaśnienie
Ze względu na końcowe podawanie wiersza, wyszukuje wszystkie dopasowania wyrażenia regularnego po
`
i usuwa je z danych wejściowych. Ze względu na wiodącą+
czynność robi się to wielokrotnie, aż wyjście przestanie się zmieniać (co będzie, ponieważ regex przestanie pasować).Jeśli chodzi o sam regex, składa się z dwóch części:
Ta część sprawdza, czy jest
0
gdzieś w zewnętrznej powłoce. Odbywa się to poprzez przesunięcie „kursora” silnika regex na początek ciągu za pomocą lookbehind (używamy[^_]
do dopasowania zarówno cyfr, jak i linii):A następnie z tej pozycji używamy lookahead, aby znaleźć
0
albo w pierwszej linii, w sąsiedztwie linii, albo w ostatniej linii:Wtedy rzeczywiste dopasowanie będzie się składało z pierwszego wiersza (w tym jego końcowego wiersza), ostatniego wiersza (w tym wiodącego wiersza) lub pierwszego lub ostatniego znaku linii, w którym nadużywamy granicy słowa
\b
jako początku / końca linii Kotwica:źródło
MATL ,
2621 bajtówDane wejściowe mają następujący format
Tak więc pozostałe cztery przypadki testowe są
Błędy programu w ostatnim przypadku testowym, ale generują prawidłowe dane wyjściowe (co jest niczym). Dzięki @Dennis za zauważenie!
Wypróbuj online!. Lub sprawdź wszystkie przypadki testowe (w tym kod opakowania).
Wyjaśnienie
Powtarza to tyle razy ile kolumn w macierzy wejściowej, co jest więcej niż wystarczające. Przy każdej iteracji powłoka jest usuwana lub przechowywana w zależności od jej wartości.
źródło
Pyth, 19 bajtów
Zestaw testowy
źródło
JavaScript (ES6), 74 bajty
Pobiera dane wejściowe w postaci ciągu z znakami oddzielającymi każdy wiersz (ale bez znaku wiodącego lub końcowego). Objaśnienie:
/^.*0|0\n|\n0|0.*$/
to wyrażenie regularne, które pasuje do zanieczyszczonych kwadratów, a jednocześnie do/^.*\n?|.(.*).|\n.*$/
tych części kwadratu, które należy usunąć, z wyjątkiem tych,(.*)
które należy zachować. (Jest to krótsze niż patrzenie w przód lub w tył w poszukiwaniu znaku nowej linii).źródło
Perl 5, 63 + 3 = 66 bajtów
Wymaga
-0
flagi. Dane wejściowe nie powinny zawierać końcowego znaku nowej linii.źródło
Pyke, 29 bajtów
Wypróbuj tutaj!
Również 29 bajtów
Wypróbuj tutaj!
źródło
Pyth ,
3130 bajtówZestaw testowy.(Ostatnie błędy w testach)
Ulepszenie: uczyniono część ekstraktora pętli zewnętrznej funkcją (
L+hbeb
).Poprzednia 31-bajtowa wersja:
Jak to działa:
Kod jest w zasadzie: podczas gdy iloczyn skorupy zewnętrznej wynosi zero, oderwij ją.
Przeanalizujmy główny kod (Q jest tutaj domyślny):
Zacznij od
Q
(wejście),while
pierwsza lambda, wykonaj drugą lambda.Pierwszą częścią będzie lambda w
H
:Druga część to lambda w
Z
:Pierwsza część
Przeanalizujmy to:
Ponieważ Pyth używa notacji przedrostkowej , zostanie to ocenione:
Druga część
źródło
Mathematica, 78 bajtów
Funkcja anonimowa przyjmuje dane wejściowe jako macierz. Zignoruj wszelkie błędy, które mogą wystąpić podczas wykonywania.
źródło