Kotak Terkontaminasi

17

pengantar

Mari kita amati kotak berikut, yang hanya terdiri dari digit 0 - 9:

1034
4167
8414
3542

Kulit terluar dari bujur sangkar ini adalah:

1034
4  7
8  4
3542

Ini mengandung nol, jadi kita perlu melepas kulit terluarnya, meninggalkan:

16
41

Kulit terluar dari bujur sangkar ini adalah:

16
41

Ini tidak mengandung nol dan karena itu kotak tidak terkontaminasi . Jadi pada dasarnya, definisi dari kotak yang tidak terkontaminasi adalah ketika kulit luar kotak tidak mengandung nol.

Tugas

Diberi kuadrat digit (hanya berisi bilangan bulat non-negatif) dalam format apa pun yang masuk akal, menghasilkan kuadrat terbesar yang tidak terkontaminasi dengan terus-menerus mengelupas kulit luar, dalam format apa pun yang masuk akal.

Uji kasus

Uji kasus 1:

Input         Output

1234          1234
2345          2345
3456          3456
4567          4567

Uji kasus 2:

Input         Output

123           123
204           204
346           346

Uji kasus 3:

Input         Output

101           1
010           
101           

Uji kasus 4:

Input         Output

000           (none)
000
000

Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

Adnan
sumber
Tidak bisakah saya membuat contoh 416\n841\n354\n(sudut kiri bawah)?
Leaky Nun
Nah, Anda mengatakan "kotak non-terkontaminasi terbesar "
Leaky Nun
Apakah kesalahan diizinkan?
Leaky Nun
@ KennyLau Maksud Anda pada test case terakhir? Ya, selama tidak menghasilkan 0atau semacamnya.
Adnan
2
"Kuadrat angka" akan lebih baik dinyatakan sebagai "kuadrat angka"
Mego

Jawaban:

6

Jelly , 19 16 byte

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

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ḊṖ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
sumber
8

JavaScript, 105 97 byte

Disimpan 8 byte berkat @ Patrickrick!

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

Menentukan fungsi s , yang mengembalikan array bilangan bulat 2D ketika disediakan bilangan bulat bilangan bulat 2D sebagai input.

Bagaimana itu bekerja

  • fungsi l: diberi array a, mengembalikan salinan tanpa indeks pertama dan terakhirnya.

  • fungsi p: diberikan array 2D a, panggilan luntuk menghapus baris pertama dan terakhir, lalu untuk setiap panggilan baris yang tersisa luntuk menghapus tinju dan kolom terakhir. Ini melakukan pengelupasan bawang.

  • function c: diberikan array 2D a, mengembalikan string yang hanya berisi 0s dalam bentuk string a.

  • fungsi s: diberikan array 2D a, memanggil cbentuk array yang diberikan oleh p, dan pada array itu sendiri. Bandingkan string ini secara leksikografis untuk menentukan apakah bentuk yang dikupas memiliki kurang 0dari yang asli. Jika ya, maka dokumen asli terkontaminasi, jadi hubungi ssecara rekursif pada formulir yang sudah dikupas. Kalau tidak, kembalikan yang asli.

Jrich
sumber
2
Anda dapat menghapus a.lengthdari endargumen array.slicein ldan menyimpan 8 byte. enddiizinkan menjadi indeks negatif.
Patrick Roberts
7

Retina , 60 57 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1. Linefeed tambahan sangat penting.

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

Cobalah online!

Penjelasan

Dikarenakan trafeed linefeed, ini menemukan semua kecocokan regex setelah `dan menghapusnya dari input. Karena memimpin +ini dilakukan berulang-ulang sampai output berhenti berubah (yang akan karena regex akan berhenti mencocokkan).

Adapun regex itu sendiri, terdiri dari dua bagian:

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

Bagian ini memeriksa apakah ada 0tempat di kulit luar. Hal ini dilakukan dengan memindahkan "kursor" mesin regex ke awal string dengan melihat ke belakang (kita gunakan [^_]untuk mencocokkan kedua digit dan garis baris):

(?<=...^[^_]*)

Dan kemudian dari posisi itu kami menggunakan lookahead untuk menemukan 0apakah di baris pertama, berdekatan dengan linefeed, atau di baris terakhir:

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

Maka kecocokan yang sebenarnya akan terdiri dari baris pertama (termasuk linefeed trailing-nya), baris terakhir (termasuk linefeed-nya yang terkemuka) atau karakter pertama atau terakhir dari sebuah baris, di mana kita menyalahgunakan batas kata \bsebagai awal / akhir baris jangkar:

(^.+¶|¶.+$|.?\b.?)
Martin Ender
sumber
6

MATL , 26 21 byte

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

Input dalam format berikut

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

Jadi empat kasus uji lainnya adalah

[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]

Kesalahan program dalam kasus uji terakhir, tetapi menghasilkan output yang benar (yang bukan apa-apa). Terima kasih kepada @Dennis karena memperhatikan!

Cobalah online! . Atau verifikasi semua kasus uji (ini termasuk kode pembungkus).

Penjelasan

Ini berulang sebanyak jumlah kolom dalam matriks input, yang lebih dari cukup. Pada setiap iterasi, shell dihapus atau disimpan tergantung pada nilainya.

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
sumber
5

Pyth, 19 byte

.W}\0.-`H`JutCPG2HJ

Suite uji

.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
sumber
4

JavaScript (ES6), 74 byte

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

Mengambil input dalam bentuk string dengan baris baru yang memisahkan setiap baris (tetapi tidak ada baris baru yang mengarah atau tertinggal). Penjelasan: /^.*0|0\n|\n0|0.*$/adalah regexp yang cocok dengan kotak yang terkontaminasi, sedangkan /^.*\n?|.(.*).|\n.*$/cocok dengan bagian-bagian dari alun-alun yang perlu dihapus, kecuali (.*)yang perlu disimpan. (Ini lebih pendek daripada melihat ke depan atau ke belakang untuk karakter baris baru.)

Neil
sumber
4

Perl 5, 63 + 3 = 66 byte

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

Membutuhkan -0bendera. Input tidak boleh mengandung karakter baris baru yang tertinggal.

Neil
sumber
3

Pyke, 29 byte

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

Coba di sini!

Juga 29 byte

QeQhQmhQme]4sBI
/)QtOmtmO=Qr;

Coba di sini!

Biru
sumber
2
Saya mendapatkan kesalahan di kedua tautan. Apakah kita perlu melakukan sesuatu sebelum menekan "jalankan"!
Luis Mendo
Saya mungkin harus menyebutkan bahwa akan selalu ada kesalahan ketika dijalankan. Outputnya ada di baris kedua di suatu tempat (Ini sebenarnya dicetak dan bukan bagian dari pesan kesalahan)
Biru
2

Pyth , 31 30 byte

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

Suite uji. (Kesalahan testcase terakhir)

Penyempurnaan: menjadikan sebagian ekstraktor luar-loop berfungsi ( L+hbeb).

Versi 31 byte sebelumnya:

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

Bagaimana itu bekerja:

Kode dasarnya: sementara produk outershell nol, kupas.

Mari kita menganalisis kode utama (Q tersirat di sini):

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

Mulai dari Q(input), whilelambda pertama, lakukan lambda kedua.

Bagian pertama adalah lambda di H:

!*F+1iRTs++hHm+hdedHeH

Bagian kedua adalah lambda di Z:

PtmPtdZ

Bagian pertama

!*F+1iRTs++hHm+hdedHeH

Mari kita analisis ini:

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

Karena Pyth menggunakan notasi awalan , ini kemudian akan dievaluasi:

!*F+1iRT

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

Bagian kedua

PtmPtdZ
  mPtdZ   the inner of each row
Pt        the inner rows
Biarawati Bocor
sumber
2

Mathematica, 78 byte

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

Fungsi anonim, mengambil input sebagai matriks. Abaikan kesalahan yang mungkin terjadi selama eksekusi.

LegionMammal978
sumber