Zanieczyszczone kwadraty

17

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 , więc wygrywanie z najmniejszą ilością bajtów wygrywa!

Adnan
źródło
Czy nie mogę podać przykładu 416\n841\n354\n(lewy dolny róg)?
Leaky Nun
Cóż, powiedziałeś „ największy niezanieczyszczony kwadrat
Leaky Nun
Czy błąd jest dozwolony?
Leaky Nun
@KennyLau Masz na myśli ostatni przypadek testowy? Tak, pod warunkiem, że się nie wyświetla 0lub coś takiego.
Adnan
2
„Kwadrat liczb” lepiej byłoby określić jako „kwadrat cyfr”
Mego

Odpowiedzi:

6

Galaretka , 19 16 bajtów

Fœ^F}P
ḊṖZµ⁺⁸ßç?

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

ḊṖZµ⁺⁸ßç?  Main link. Argument: M (2D list)

Ḋ          Dequeue; remove the first row.
 Ṗ         Pop; remove the last row.
  Z        Zip; transpose rows with columns.
   µ       Combine the chain to the left into a link.
    ⁺      Copy the link, executing it twice.
           The copy removes the first and last column and restores the orientation.
       ç?  If the helper link returns a non-zero integer:
     ⁸       Return M unmodified.
      ß      Else, recursively call the main link on the "peeled" M.


Fœ^F}P     Helper link. Arguments: P ("peeled" M), M (unmodified)

F          Flatten P.
   F}      Flatten M.
 œ^        Perform multiset symmetric difference, removing the elements of P from
           the elements of M, respecting multiplicities, leaving precisely the
           elements of the outer shell.
     P     Return the product of the remaining elements.
Dennis
źródło
8

JavaScript, 105 97 bajtów

Zaoszczędź 8 bajtów dzięki @Patrick Roberts!

l=a=>a.slice(1,-1)
p=a=>l(a).map(l)
c=a=>a.join``.replace(/[^0]/g,"")
s=a=>c(p(a))<c(a)?s(p(a)):a

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ę 2D a, wezwania ldo 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ę 2D a, zwraca ciąg znaków, który zawiera tylko 0s w postaci łańcuchaa .

  • funkcja s: biorąc pod uwagę tablicę 2D a, wywołuje cobraną formę tablicy podaną przez pi samą tablicę. Porównuje te ciągi leksykograficzne, aby ustalić, czy obrana forma ma mniej 0s niż oryginał. Jeśli tak, to oryginał jest zanieczyszczony, więc zadzwoń srekurencyjnie na obraną formę. W przeciwnym razie zwróć oryginał.

jrich
źródło
2
Możesz usunąć a.lengthz endargumentu array.slicein li zapisać 8 bajtów. endmoże być indeksem ujemnym.
Patrick Roberts
7

Siatkówka , 60 57 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1. Końcowe podawanie linii jest znaczące.

+`(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)(^.+¶|¶.+$|.?\b.?)

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:

(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)

Ta część sprawdza, czy jest 0gdzieś 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źć 0albo w pierwszej linii, w sąsiedztwie linii, albo w ostatniej linii:

(?=.*0|[^_]+(¶0|0¶|0.*$))

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 \bjako początku / końca linii Kotwica:

(^.+¶|¶.+$|.?\b.?)
Martin Ender
źródło
6

MATL , 26 21 bajtów

t"t5LY)y5LZ)h?}6Lt3$)

Dane wejściowe mają następujący format

[1 0 3 4; 4 1 6 7; 8 4 1 4; 3 5 4 2]

Tak więc pozostałe cztery przypadki testowe są

[1 2 3 4; 2 3 4 5; 3 4 5 6; 4 5 6 7]
[1 0 1; 0 1 0; 1 0 1]
[1 2 3; 2 0 4; 3 4 6]
[0 0 0; 0 0 0; 0 0 0]

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.

t            % Take a matrix as input. Duplicate
"            % For each column (i.e. repeat that many times)
  t5LY)      %   Duplicate top of the stack. Extract first and last rows
  y5LZ)      %   Duplicate the element below the top. Extract first and last columns
  h          %   Concatenate the two arrays into a row vector
  ?          %   If all its entries are non-zero: do nothing
  }          %   Else
    6Lt3$)   %     Get the central part
             % End if, end for. Implicitly display
Luis Mendo
źródło
5

Pyth, 19 bajtów

.W}\0.-`H`JutCPG2HJ

Zestaw testowy

.W}\0.-`H`JutCPG2HJ
.W                     While the first function returns true, apply the second
                       function, starting with the input.
           u    2H     Apply the following twice to the input:
              PG       Remove the last row
             C         Transpose
            t          Remove the first row
                       This removes the outermost shell.
          J            Save it to J
         `             Stringify the matrix
       `H              Stringify the input
     .-                Multiset difference
  }\0                  Check if there is a '0' in the resulting string.
                  J    If that succeeds, update the current value to J.
                       When it fails, return the current value.
isaacg
źródło
4

JavaScript (ES6), 74 bajty

f=s=>/^.*0|0\n|\n0|0.*$/.test(s)?f(s.replace(/^.*\n?|.(.*).|\n.*$/g,"$1")):s

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).

Neil
źródło
4

Perl 5, 63 + 3 = 66 bajtów

$_=<>;s/\A.*\n?|^.|.$|\n.*\Z//mg while/\A.*0|0$|^0|0.*\Z/;print

Wymaga -0flagi. Dane wejściowe nie powinny zawierać końcowego znaku nowej linii.

Neil
źródło
3

Pyke, 29 bajtów

"D3lt%sBR,"2*ER3*I
/)tOmtmOr;

Wypróbuj tutaj!

Również 29 bajtów

QeQhQmhQme]4sBI
/)QtOmtmO=Qr;

Wypróbuj tutaj!

niebieski
źródło
2
Pojawiają się błędy w obu linkach. Czy musimy coś zrobić przed naciśnięciem przycisku „Uruchom”!
Luis Mendo
Powinienem chyba wspomnieć, że po uruchomieniu zawsze wystąpi błąd. Dane wyjściowe znajdują się gdzieś w drugim wierszu (w rzeczywistości są drukowane i nie stanowią części komunikatu o błędzie)
niebieski,
2

Pyth , 31 30 bajtów

L+hbeb.W!*F+1iRTs+yHyMHPtmPtdZ

Zestaw testowy.(Ostatnie błędy w testach)

Ulepszenie: uczyniono część ekstraktora pętli zewnętrznej funkcją (L+hbeb ).

Poprzednia 31-bajtowa wersja:

.W!*F+1iRTs++hHm+hdedHeHPtmPtdZ

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):

.W<lambda:H><lambda:Z>Q

Zacznij od Q(wejście), whilepierwsza lambda, wykonaj drugą lambda.

Pierwszą częścią będzie lambda w H:

!*F+1iRTs++hHm+hdedHeH

Druga część to lambda w Z:

PtmPtdZ

Pierwsza część

!*F+1iRTs++hHm+hdedHeH

Przeanalizujmy to:

s++hHm+hdedHeH

s++             Concatenate:
   hH              1. the first row
     m+hdedH       2. the first and last item of each row
            eH     3. the last row

Ponieważ Pyth używa notacji przedrostkowej , zostanie to ocenione:

!*F+1iRT

     iRT  Convert each to integer
 *F+1     Product
!         Negate. If any element of the outer shell is zero, this would return 1.

Druga część

PtmPtdZ
  mPtdZ   the inner of each row
Pt        the inner rows
Leaky Nun
źródło
2

Mathematica, 78 bajtów

NestWhile[#[[a=2;;-2,a]]&,#,Count[{#[[b={1,-1}]],#[[;;,b]]},0,3]>0&]~Check~{}&

Funkcja anonimowa przyjmuje dane wejściowe jako macierz. Zignoruj ​​wszelkie błędy, które mogą wystąpić podczas wykonywania.

LegionMammal978
źródło