Melubangi array

35

Tugas

Tantangan ini sangat sederhana. Input Anda adalah bilangan bulat 2D persegi panjang, berukuran setidaknya 1 × 1. Itu dapat diambil dalam format apa pun yang wajar. Output Anda akan menjadi array input, tetapi dengan semua entri tidak pada baris atau kolom pertama atau terakhir diatur ke 0. Itu harus dalam format yang sama dengan input.

Misalnya, jika array inputnya adalah

67  4 -8  5 13
 9 13 42  4 -7
 1  1  3 -9 29
16 99  8 77  0

maka output yang benar adalah

67  4 -8  5 13
 9  0  0  0 -7
 1  0  0  0 29
16 99  8 77  0

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap, dan fungsi-fungsi diizinkan untuk mengubah input yang ada alih-alih mengembalikannya. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Uji kasus

Ini diformat sebagai daftar bersarang untuk membuat copy paste lebih mudah.

[[3]] -> [[3]]
[[7,2,8]] -> [[7,2,8]]
[[3],[5],[12],[-6]] -> [[3],[5],[12],[-6]]
[[99,98,97],[88,87,86]] -> [[99,98,97],[88,87,86]]
[[6,7],[8,9],[10,11]] -> [[6,7],[8,9],[10,11]]
[[-1,-2,-3],[1,2,3],[5,5,5]] -> [[-1,-2,-3],[1,0,3],[5,5,5]]
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] -> [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]]
[[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] -> [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]]

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa. Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

Jika Anda ingin memasukkan beberapa angka (misalnya karena Anda telah meningkatkan skor Anda atau Anda ingin membuat daftar penterjemah secara terpisah), pastikan skor aktual adalah angka terakhir di header:

## Perl, <s>50</s> 43 + 2 (-p flag) = 45 bytes

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

Zgarb
sumber

Jawaban:

13

MATL , 9 byte

0HJ_ht4$(

Input dalam format

[67  4 -8  5 13;  9 13 42  4 -7;  1  1  3 -9 29; 16 99  8 77  0]

EDIT (12 Juni 2016): untuk beradaptasi dengan perubahan bahasa, tautan di bawah ini telah _diganti olehq .

Cobalah online !

0           % Push a 0: value that will be assigned into the array
HJ_h        % Vector [2, -1j]: this corresponds to index 2:end-1 for rows
t           % Duplicate: same index for columns
4$(         % Assignment indexing with 4 inputs: array, new value, row and col indices
            % Since the first input (array) to this function is currently missing, it's
            % implicitly taken at this point from stdin
            % Implicitly display stack contents, which is the modified array
Luis Mendo
sumber
2
Bagus! Saya tahu MATL akan dalam menjalankan. : D
gelas kimia
12

Java 7, sebagai fungsi sepenuhnya bernama: 85

void f(int[][]a){for(int i=0,j;++i<a.length-1;)for(j=1;j<a[i].length-1;)a[i][j++]=0;}

Anda bisa lambda ini di Java 8 untuk menghapus beberapa byte, tapi saya tidak benar-benar melakukannya.

Geobit
sumber
Bisakah Anda menghemat ruang dengan menggunakan Arrays.fill(a[i],1,a[i].length-1,0);? Ini hanya 36 byte, bukan 37. =)
corsiKa
@corsiKa Akan menyenangkan, tapi saya harus mengimpor atau sepenuhnya memenuhi syarat: /
Geobits
Hanya karena penasaran, mengapa Anda memiliki kedua loop yang berbeda? Mengapa tidak for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;? Itu tidak menyimpan byte, tetapi lebih konsisten dengan kedua loop yang sama. :)
Kevin Cruijssen
12

Jelly, 18 17 15 9 byte

0W&ṖZ
ÇÇ^

Cobalah online! atau verifikasi semua kasus uji .

Latar Belakang

Pendekatan ini didasarkan pada jawaban Jelly @ Sp3000 , khususnya pada idenya untuk memanfaatkan operasi vektor antara daftar dengan panjang yang berbeda.

Kita mulai dengan mengambil bitwise AND dari 0 dan setiap integer di baris pertama input. Karena vektorisasi otomatis, ini dapat dicapai dengan mengambil bitwise AND dari [0] dan input tanpa baris terakhirnya. 0 dipasangkan dengan baris pertama, menghasilkan deretan nol. Karena baris yang tersisa tidak memiliki padanan dalam [0] , mereka tidak tersentuh.

Sekarang kita transpos hasilnya, terapkan transformasi di atas sekali lagi (secara efektif menghapus kolom terakhir dan nolkan yang pertama), dan transpos lagi.

Untuk input

 67   4  -8   5  13
  9  13  42   4  -7
  1   1   3  -9  29
 16  99   8  77   0

ini menghasilkan

  0   0   0   0
  0  13  42   4
  0   1   3  -9

Sekarang, kita ambil XOR bitwise dari hasil ini dan matriks asli. XOR dengan integer dengan sendirinya menghasilkan 0 . XOR sebuah integer dengan 0 (atau tidak XOR sama sekali) menghasilkan integer yang sama. Ini menutup matriks.

Bagaimana itu bekerja

0W&ṖZ    Helper link. Argument: M (matrix)

0W       Yield [0].
   Ṗ     Yield M, without its last row.
  &      Take the bitwise AND of both.
    Z    Zip the result.

ÇÇ^      Main link. Input: A (matrix)

Ç        Call the helper link on A.
 Ç       Call the helper link on the result.
  ^      Take the bitwise XOR of the result and A.
Dennis
sumber
8

Mathematica, 27 byte

(a=#;a[[2;;-2,2;;-2]]=0;a)&
alephalpha
sumber
2
Impresif. Sekarang, tolong jelaskan? Sepertinya Anda menetapkan ulang sel-sel bagian dalam menjadi nol dan -2s menunjukkan kolom atau baris kedua-terakhir.
DavidC
Betapa sederhananya!
njpipeorgan
7

R , 33 48 byte

Saya tahu, R tidak dibuat untuk bermain golf. Tetapi ini dibuat untuk pengindeksan posisi ... Memuat sebuah contoh;

a <- matrix(c(67,4,-8,5,13,9,13,42,4,-7,1,1,3,-9,29,16,99,8,77,0), ncol=5, byrow=TRUE)
a
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   67    4   -8    5   13
# [2,]    9   13   42    4   -7
# [3,]    1    1    3   -9   29
# [4,]   16   99    8   77    0

Ganti nilai pada posisi apa pun yang bukan di baris atau kolom tepi, dengan 0:

x <- function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]<-0;a}

x(a)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   67    4   -8    5   13
# [2,]    9    0    0    0   -7
# [3,]    1    0    0    0   29
# [4,]   16   99    8   77    0

Juga memeriksa tes 2 kolom:

b <- matrix(c(99,98,97,88,87,86), ncol=2, byrow=TRUE)
b
#     [,1] [,2]
#[1,]   99   98
#[2,]   97   88
#[3,]   87   86

x(b)
#     [,1] [,2]
#[1,]   99   98
#[2,]   97   88
#[3,]   87   86

Cucu: upaya sebelumnya

# a[2:(nrow(a)-1),2:(ncol(a)-1)]<-0 # previous attempt

Menguji semua contoh:

tests <- read.table(text="[[3]] -> [[3]]
                          [[7,2,8]] -> [[7,2,8]]
                          [[3],[5],[12],[-6]] -> [[3],[5],[12],[-6]]
                          [[99,98,97],[88,87,86]] -> [[99,98,97],[88,87,86]]
                          [[6,7],[8,9],[10,11]] -> [[6,7],[8,9],[10,11]]
                          [[-1,-2,-3],[1,2,3],[5,5,5]] -> [[-1,-2,-3],[1,0,3],[5,5,5]]
                          [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] -> [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]]
                          [[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] -> [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]]")
tests$cols <- c(1,3,1,3,2,3,5,5)
tests$V1 <- gsub("\\[|\\]","",tests$V1)
tests$V1 <- paste0("c(",tests$V1,")")
tests$V3 <- gsub("\\[|\\]","",tests$V3)
tests$V3 <- paste0("c(",tests$V3,")")

testfn <- function(testno) {
  intest <- matrix(eval(parse(text=tests$V1[testno])), ncol=tests$cols[testno], byrow=TRUE)
  intest <- x(intest)
  outtest <- matrix(eval(parse(text=tests$V3[testno])), ncol=tests$cols[testno], byrow=TRUE)
  return(identical(intest, outtest))
}

sapply(seq_len(nrow(tests)), testfn)
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Jonathan Carroll
sumber
Apa yang terjadi dengan matriks baris atau kolom 1 atau 2?
Terowongan
Poin bagus, percobaan pertama gagal dalam tes 2 kolom dan menghapus baris tengah. Saya akan memperbarui.
Jonathan Carroll
1
Selamat Datang di Programming Puzzles & Code Golf! Kami meminta semua pengiriman menjadi program atau fungsi lengkap. Dalam hal ini, kode skor Anda hanya cuplikan, karena mengasumsikan variabel tersebut aada. Agar sesuai dengan aturan kami, Anda bisa menjadikannya fungsi yang mengambil matriks, seperti function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}untuk 47 byte.
Alex A.
6

Mathematica 81 76 byte

(d=Dimensions@m;q=MemberQ;m Boole@Array[{1,d[[1]]}~q~#||{1,d[[2]]}~q~#2&,d])&

Bagaimana itu bekerja

Asumsikan bahwa array input disimpan di m. Dimensi dari madalah {4,5} `

(m={{67,4,-8,5,13}, {9,13,42,4,-7}, {1,1,3,-9,29}, {16,99,8,77,0}})//MatrixForm

m


Setiap sel dalam array berikut,, aBenar jika sel berada di baris pertama atau ( ||) di baris terakhir atau di kolom pertama atau terakhir; kalau tidak, itu salah.

(d=Dimensions@m;a=Array[MemberQ[{1,d[[1]]},#]||MemberQ[{1,d[[2]]},#2]&,d])&[m]//MatrixForm

benar


Menerapkan fungsi Booleke array mengkonversi True ke 1 dan False ke 0.

b = Boole[a]

boole


Kalikan matriks mdengan b. Ini mengalikan setiap sel dalam m dengan sel yang sesuai di b.

m b

matriks berlubang

DavidC
sumber
Anda dapat menggunakan ||sebagai ATAU Anda untuk menyimpan beberapa byte, dan saya dapat melihat beberapa byte lain yang dapat Anda simpan juga!
A Simmons
A Simmons, Terima kasih atas sarannya.
DavidC
# -Unitize @ ArrayFilter [Det, Array [Norm @ * List, Dimensions @ #], 1] # &
njpipeorgan
@ njpipeorgan, saya sarankan Anda mengirimkannya. (Dan mudah-mudahan menjelaskan cara kerjanya!)
DavidC
@ DavidvidC Saya telah memposting jawaban saya
njpipeorgan
6

GNU Sed, 31

  • Terima kasih kepada @manatwork karena telah menghemat 4 byte.

Versi 4.2.2 atau sebelumnya, sebelum komitmen ini (diskusi) .

Skor termasuk +1 untuk -ropsi.

Baris input dipisahkan baris baru. Elemen pada setiap baris dipisahkan satu baris.

1n
$n
:
s/ -?\w+ / : /
t
y/:/0/

Penjelasan

1n                   # 1st line: print unchanged, then load next line
$n                   # last line: print unchanged, then load next line (i.e. EOF and stop)
:                    # unnamed label
s/ -?\w+ / : /       # substitute a number in spaces with a `:` in spaces
t                    # If the above matched, jump back to the label and try again
y/:/0/;              # transliterate `:` to `0`

Cobalah online.

Trauma Digital
sumber
1
Oh begitu, ini cara "mewah" untuk berkeliling tanpa melihat-lihat, dan terima kasih!
andlrc
1
Terlalu banyak kawat gigi: 1n;$n;:;s/ -?\w+ / : /;t;y/:/0/.
manatwork
1
Bisakah Anda memasukkan informasi tentang komit yang membuat jawaban Anda berfungsi dalam blok kutipan, situs ini sangat lambat dan butuh 1 menit untuk memuat sepenuhnya
Ferrybig
@manatwork Terima kasih - menyimpan 4 byte!
Trauma Digital
@Ferrybig Menambahkan tautan lain ke diskusi dev tentang topik ini .
Trauma Digital
5

Oktaf, 34 byte

function h(M) M(2:end-1,2:end-1)=0

Perhatikan bahwa input membutuhkan titik koma untuk memisahkan baris array:

h([[3];[5];[12];[-6]])

Penjelasan:

Indeks array oktaf (dan MATLAB) berbasis 1. Menentukan rentang Array(1:end)akan memberi Anda semua elemen array (satu dimensi, dalam contoh ini). Array(2:end-1)akan memberi Anda semua elemen kecuali yang pertama dan terakhir.

M(2:end-1,2:end-1)=0

setel ke 0semua elemen yang tidak ada di baris atau kolom pertama atau terakhir:

>> A = [[-1,-2,-3];[1,2,3];[5,5,5]]
A =

  -1  -2  -3
   1   2   3
   5   5   5

>> h(A)
M =

  -1  -2  -3
   1   0   3
   5   5   5

Jika salah satu dimensi kurang dari atau sama dengan 2, kisaran end-1adalah kurang dari 2, oleh karena itu akhir rentang (2:end-1)kurang dari awal. Dalam hal ini, Oktaf mengabaikan jangkauan dan tidak melakukan apa pun. Ini analog dengan forloop:

for (int i=2; i < 2; i++) {...}

Kondisi berhenti benar pada iterasi pertama, jadi kami keluar dari loop.

>> A = [[6,7];[8,9];[10,11]]
A =

    6    7
    8    9
   10   11

>> h(A)
M =

    6    7
    8    9
   10   11
gelas kimia
sumber
5

Jelly , 12 byte

ZṖṖ1;¥€
¬ÇÇ×

Saya pikir ini berhasil, masih membungkus kepala saya di sekitar Jelly. Cobalah online!

(Terima kasih kepada @ Dennis untuk -2 byte)

Bekerja dengan mengalikan array input dengan array 1s dan 0s satu dimensi lebih kecil setiap jalan. Misalnya, untuk [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]kita gandakan elemen-bijaksana dengan

1 1 1 1
1 0 0 0
1 0 0 0

Penjelasan lengkap

[Helper link - argument is a matrix]
Z           Zip
 ṖṖ         Pop last two elements, or [:-2]
   1;¥€     Append a 1 in front of every row

[Main link]
¬           Not, turning 0s to 1s and everything else to 0s. Even though some zeroes
            turn into 1s, it's fine because we multiply element-wise at the end,
            and 0*1 = 0
 ÇÇ         Perform helper link twice
   ×        Multiply element-wise
Sp3000
sumber
5

ES6, 52 48 46 byte

f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)

Sunting: Disimpan 4 byte berkat @ user81655. Menyimpan 2 byte lebih lanjut berkat produk @ETH.

Neil
sumber
Pintar! Berikut adalah pendekatan yang sangat mirip tanpa gyang menyimpan beberapa byte:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
user81655
Pekerjaan yang baik! Saya menghitung 48 byte (mungkin Anda lupa menghitungf= ), tetapi Anda bisa mendapatkannya hingga 46:f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
ETHproduksi
1
@ ETHproductions Ya, saya lupa menghitung f= . Saya juga sedikit terkejut +.5tapi saya melihat ada penambahan string pada panggilan lainnya.
Neil
4

Javascript, 62 59 56 byte

s=>s.replace(/(^.*|\n\s*\S+)|\S+(?= .*\n)/g,(a,b)=>b||0)

Pendekatan ini mengharapkan string sebagai argumen. Anda dapat melihat apa yang dilakukan regex di sini: https://regex101.com/r/kC6xA8/3

dihapus
sumber
4

Mathematica, 55 byte

#-Unitize@ArrayFilter[Det,Power~Array~Dimensions@#,1]#&

Kasus cobaan

%[RandomInteger[9,{5,5}]]
(*
  {{8,8,3,6,5},
   {7,0,0,0,4},
   {2,0,0,0,7},
   {3,0,0,0,5},
   {8,6,1,0,8}}
*)

Penjelasan

Gagasan utama dari jawaban ini adalah sama dengan jawaban DavidC (pertama membangun matriks topeng, dan kemudian mengalikannya dengan matriks asli), tetapi konstruksi matriks topeng berbeda.

ArrayFilter[f,list,r]peta fke setiap elemenlist dalam radius r.

ArrayFilter[f,{1,2,3,4,5},1]
(* { f[{1,1,2}], f[{1,2,3}], f[{2,3,4}], f[{3,4,5}], f[{4,5,5}] } *)

Perhatikan bahwa elemen batas digandakan ketika ada tetangga yang tidak cukup. Kapanlist 2-dimensi, fitur ini bekerja dengan baik bersama-sama Detuntuk memberikan hasil yang diinginkan, karena kolom atau baris yang diduplikasi pada empat batas menghilangkan penentu.

ArrayFilter[Det,Power~Array~{4,4},1]
(*
  {{0, 0,  0,    0},
   {0, 12, 72,   0},
   {0, 48, 1152, 0},
   {0, 0,  0,    0}}
*)

dimana Power~Array~{4,4} jaminan penentu pada posisi dalam menjadi tidak nol. Dan

1-Unitize@%
(*
  {{1,1,1,1},
   {1,0,0,1},
   {1,0,0,1},
   {1,1,1,1}}
*)

memberikan matriks topeng.

njpipeorgan
sumber
4

Python, 50 byte

def f(a):
 for l in a[1:-1]:l[1:-1]=[0]*(len(l)-2)

Menerima daftar daftar, dan memodifikasinya. Sintaks slice Python tidak merepotkan untuk tugas ini.

Saya belajar bahwa mengalikan daftar dengan angka negatif menghasilkan daftar kosong, yang memungkinkan kode di atas bekerja pada input kecil.

mathmandan
sumber
4

Julia, 50 35 byte

A->A[2:size(A,1)-1,2:size(A,2)-1]=0

Ini adalah fungsi anonim yang menerima array dan memodifikasinya. Untuk menyebutnya, tetapkan ke variabel.

Pendekatan di sini adalah cukup sederhana: Untuk n oleh m masukan berbagai A , kami menetapkan A ij = 0 untuk semua i = 2, ..., n -1 dan j = 2, ..., m -1 dengan membangun rentang indeks. Rentang mungkin kosong, seperti jika n atau m = 1, dalam hal ini tidak ada penggantian yang dilakukan.

Cobalah online

Disimpan 15 byte berkat Dennis!

Alex A.
sumber
4

C, 62 byte

y;f(a,b,c)int **a;{for(b--;b-->1;)for(y=1;y<c-1;)a[b][y++]=0;}

Harap tidak apa-apa untuk mengambil panjang / lebar array sebagai parameter. Saya bermain-main dengan memset / bzero sedikit, tetapi mengalikan dengansizeof(int) secara drastis meningkatkan ukuran kode.

EDIT: 55 byte jika kita dapat membengkokkan aturan lebih lanjut dan menyimpan array kita sebagai karakter karena masing-masing input hanya satu digit.

x;
#define f(a,b,c) for(x=1;x<b-1;)bzero(a[x++]+1,c-2);

EDIT: Terima kasih Washington Guedes untuk tipnya!

Josh
sumber
Apakah Anda benar-benar mencoba memperbanyak dengan sizeof(int)? Anda bisa menggunakan 4...
anatolyg
sizeof(int) != 4pada mesin saya: P
Josh
Saya yakin itu masih nomor satu digit, yang dapat Anda gunakan.
anatolyg
Maksud saya pada saat itu saya hanya bisa memutuskan itu array karakter daripada int, karena masalahnya hanya menggunakan angka satu digit. Tergantung seberapa jauh kita ingin membengkokkan aturan.
Josh
Terima kasih! Sekarang saya juga bisa menggunakan -->operator menyendiri ;)
Josh
3

Perl 6 , 28 byte

{.[1..*-2]»[1..*-2] »=»0}

Ini memodifikasi input di tempat

Pemakaian

my @test-cases = (
  [[3],] => [[3],],
  [[7,2,8],] => [[7,2,8],],
  [[3],[5],[12],[-6]] => [[3],[5],[12],[-6]],
  [[99,98,97],[88,87,86]] => [[99,98,97],[88,87,86]],
  [[6,7],[8,9],[10,11]] => [[6,7],[8,9],[10,11]],
  [[ -1,-2,-3],[1,2,3],[5,5,5]] => [[ -1,-2,-3],[1,0,3],[5,5,5]],
  [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] => [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]],
  [[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] => [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]],
);

use Test;
plan +@test-cases;

for @test-cases {
  my $k = .key;
  {.[1..*-2]»[1..*-2] »=»0}( $k ); # <==
  ok $k eqv .value
}
1..8
ok 1 - 
ok 2 - 
ok 3 - 
ok 4 - 
ok 5 - 
ok 6 - 
ok 7 - 
ok 8 - 
Brad Gilbert b2gills
sumber
{.[1..*-2]»[1..*-2]X=0}menghemat 2 byte
raiph
@raiph tampaknya tidak berfungsi untuk dua kasus terakhir
Brad Gilbert b2gills
3

JavaScript ES6, 69 66 57 byte

Y=>Y.map((X,y)=>X.map((N,x)=>x*y&&X[x+1]+.5&&Y[y+1]?0:N))

Bagaimana itu bekerja

Solusi ini memetakan melalui setiap indeks-y ydan indeks -x xdalam input dan memutuskan apakah akan membuangnya berdasarkan dua indeks ini. Ada empat kasus yang perlu kita pertahankan:

  • x adalah 0
  • y adalah 0
  • x sama dengan panjang array bagian dalam, minus 1
  • y sama dengan panjang array luar, minus 1

Kita dapat menangani dua yang pertama dengan sedikit perkalian: x*ymengembalikan 0iff salah satu xatau y0, dan bilangan bulat positif sebaliknya. Sekarang untuk yang ketiga: kita bisa memeriksa apakah X.length>x+1, tetapi itu membutuhkan banyak byte. Cara lain untuk melakukan ini adalah untuk memeriksa apakah item di depan adalah palsu, yaitu undefined, yang Anda dapatkan ketika mencoba mengakses item yang tidak ada. Namun, ini juga cocok jika item berikutnya 0, jadi kami menambahkan 0,5 untuk memastikan itu tidak terjadi:

1 + 0.5 = 1.5 (truthy)
0 + 0.5 = 0.5 (truthy)
-1 + 0.5 = -0.5 (truthy)
undefined + 0.5 = NaN (falsy)

Akhirnya, poin keempat: karena array luar hanya memiliki array di dalamnya, dan array apa pun adalah benar, kita bisa memeriksa Y[y+1]. Sekarang dengan ?0:N, kami mengubahnya menjadi 0jika semua di atas ternyata benar; Njika tidak. Dan itu dia!

Produksi ETH
sumber
3

Retina ,31 24 22

(?<=¶.+ )\S+(?= .*¶)
0

Disimpan 2 byte berkat randomra

Cobalah online!

Mungkin ada cara yang lebih baik untuk melakukannya, karena ini hanya pengganti multi-line yang cukup mendasar. Pada dasarnya kami menemukan setiap angka yang didahului oleh baris baru, sejumlah karakter dan spasi, dan segera diikuti oleh spasi dan kemudian dan akhirnya diikuti oleh baris baru. Angka-angka ini kemudian diganti 0.

Ini tidak akan mempertahankan bantalan kolom, tapi saya rasa itu bukan masalah.

FryAmTheEggman
sumber
3

Java 8, sebagai fungsi lambda: 82 83 95 karakter / byte

Lambda Signature: int[][] -> (void)(yaitu Consumer<int[][]>)

(a)->{int[]v={1,1};while(++v[0]<a.length){while(++v[1]<a[0].length)a[v[0]-1][v[1]-1]=0;v[1]=1}}

EDIT melakukan kesalahan, saya berpikir bahwa [x, y] adalah baris ke-x dan ke-ke-4. Jelas itu seharusnya [x] [y]!

EDIT Saya lupa menguji kode, dan saya perlu mengatur kolom kembali ke nol setiap kali di dalam loop, +12 byte. : /

HyperNeutrino
sumber
3

Haskell, 59 58 byte

k _[x]=[x]
k f(x:y)=x:(f<$>init y)++[last y]
f=k(k(\_->0))

Diperluas

onInner :: (a -> a) -> [a] -> [a]
onInner _ [x]    = [x]
onInner f (x:xs) = x : map f (init xs) ++ [last xs]

hollowOut :: [[Int]] -> [[Int]]
hollowOut = 
   onInner       -- leave first and last line alone 
     (onInner    -- leave first and last entry per line 
       (const 0) -- replace entries by 0
     )
Zeta
sumber
Anda harus dapat berubah ++[last y]menjadi :(last y)atau:last y
HEGX64
@ HEGX64: Tidak, tipe yang salah. x : map f (…)sudah tipe [a], dan last ymemiliki tipe a, sedangkan (:) :: a -> [a] -> [a]. Menambahkan elemen pada akhir daftar dalam jenis Haskell menyebalkan, karena daftar tersebut adalah daftar forward yang terhubung satu arah.
Zeta
Opps. Saya tahu saya harus mencobanya sendiri sebelum memposting :)
HEGX64
1
Anda dapat mengubah kmenjadi operator infiks, katakanlah #dan flip argumen untuk menyimpan satu byte: [x]#_=..., (x:y)#f=..., f=(#(# \_->0))dan Anda dapat menjatuhkan nama fungsi utama Anda, yaitu f=selama dua byte.
nimi
2

Pyth, 18 byte

Qjbm:dSttld0P.Qe.Q

Penjelasan

                   - autoassign Q=eval(input())
                   - autoassign .Q = map(eval, rest_of_input)
Q                  - imp_print(Q)
   m        P.Q    -  [V for d in .Q[:-1]]
      Sttld        -     range(1, len(d)-2+1)
    :d     0       -    assign_indexes(d, ^, 0)
 jb                - "\n".join(^)
               e.Q - imp_print(.Q[-1])

Array input dipisahkan oleh baris baru

Coba di sini

Biru
sumber
2

Groovy, 70 byte

Ini tidak terlalu kreatif, tetapi singkat!

g={a->for(i=1;i<a.size()-1;i++)for(j=1;j<a[i].size()-1;)a[i][j++]=0;a}

Penjelasan

Penutupan dengan satu arg

g={a-> 

Iterate di atas array batin, lewati elemen pertama dan terakhir

for(i=1;i<a.size()-1;i++)

Iterasi item tengah di array dalam

for(j=1;j<a[i].size()-1;)

Setel elemen ke 0dan kembalia

a[i][j++]=0;a}

Tes

assert g([[3]]) == [[3]]
assert g([[7, 2, 8]]) == [[7, 2, 8]]
assert g([[3], [5], [12], [-6]]) == [[3], [5], [12], [-6]]
assert g([[99, 98, 97], [88, 87, 86]]) == [[99, 98, 97], [88, 87, 86]]
assert g([[6, 7], [8, 9], [10, 11]]) == [[6, 7], [8, 9], [10, 11]]
assert g([[-1, -2, -3], [1, 2, 3], [5, 5, 5]]) == [[-1, -2, -3], [1, 0, 3], [5, 5, 5]]
assert g([[67, 4, -8, 5, 13], [9, 13, 42, 4, -7], [1, 1, 3, -9, 29], [16, 99, 8, 77, 0]]) == [[67, 4, -8, 5, 13], [9, 0, 0, 0, -7], [1, 0, 0, 0, 29], [16, 99, 8, 77, 0]]
assert g([[0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0]]) == [[0, 1, 0, 1, 0], [1, 0, 0, 0, 1], [0, 0, 0, 0, 0], [1, 0, 0, 0, 1], [0, 1, 0, 1, 0]]
J Atkin
sumber
2

R, 71 64 57 Bytes

function(m){if(all((y<-dim(m)-1)>1))m[2:y[1],2:y[2]]=0;m}

sunting -7 byte dengan secara eksplisit berurusan dengan matriks <2-baris atau <2 kolom secara eksplisit edit2 -7 byte dengan menetapkan dimensi matriks sambil memeriksa ukuran

mnel
sumber
1

C ++, 80 79 byte

Harapkan array int**dengan ukuran yang diberikan ndan k:

void p(int**c,int n,int k){for(int j,i=1;1+i<n;++i)for(j=1;j+1<k;)c[i][j++]=0;}

Alternatif yang berfungsi untuk semua jenis yang memiliki size()dan value_type & operator[](int)(98 byte):

template<class C>void p(C&c){for(int j,i=1;1+i<c.size();++i)for(j=1;j+1<c[i].size();)c[i][j++]=0;}

Versi yang diperluas

template <class Container>
void hollowOut(Container & ctn){
    const auto size = ctn.size();

    for(typename Container::size_type i = 1; i + 1 < size; ++i) {
        const auto inner_size = ctn[i].size();

        for(decltype(inner_size) j = 1; j + 1 < inner_size; ++j) {
            ctn[i][j] = 0;
        }
    }
}
Zeta
sumber
Sepertinya menambahkan dimensi matriks ke input adalah celah standar
aross
1

PHP, 82 81 80 71 byte

function(&$z){for(;$z[++$i+1];)for(;0 .$z[0][++$$i+1];)$z[$i][$$i]=0;};

Jalankan seperti ini:

php -r '$f = function(&$z){for(;$z[++$i+1];)for(;0 .$z[0][++$$i+1];)$z[$i][$$i]=0;};   $z=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]; $f($z); print_r($z);'
  • Menyimpan byte dengan mengasumsikan baris ukuran konstan (thx to manatwork)
  • Menyimpan byte dengan menjadikannya fungsi anonim
  • Disimpan 7 byte dengan menggunakan kebenaran item array berikutnya, mencegah panggilan count, yang merupakan nama yang terlalu panjang untuk codegolf
aross
sumber
Saat memproses sebuah matriks, semua sub-array harus memiliki panjang yang sama. Jadi di bagian dalam foraman untuk selalu beralih hingga count($z[0])-1cadangan 1 karakter.
manatwork
1

APL, 17 byte 15 byte

{⍵×(⌽∨⊖)1∊¨⍳⍴⍵}

Bagaimana itu bekerja

  • ⍳⍴⍵ menghasilkan array 2D di mana semua sel berisi koordinat semua sel argumen.
  • 1∊¨mencari di setiap sel tersebut jika ada 1 dan mengembalikan 1 jika demikian, atau 0 sebaliknya. Ini membangun sebuah matriks di mana baris pertama dan kolom pertama adalah 1s dan sisanya adalah 0.
  • (⌽∨⊖) menggabungkan dengan logis "atau" dua versi dari matriks, satu dibalik sepanjang yang pertama dan satu dibalik sepanjang sumbu terakhir.
  • ⍵× adalah perkalian standar.
lstefano
sumber
Anda dapat mengganti (⊣∨⊖∘⌽) dengan (⊖∨⌽), dua byte lebih sedikit
Moris Zucca
Cemerlang! Biarkan saya melakukan itu!
lstefano
0

Perl, 34 + 2 = 36 byte

next if$.==1||eof;s/ .+?(?= )/ 0/g

Membutuhkan -pbendera:

$ perl -pE'next if$.==1||eof;s/ .+?(?= )/ 0/g' <<< $'1 2 3\n4 5 6\n7 8 9'
1 2 3
4 0 6
7 8 9

Bagaimana itu bekerja:

# '-p' Read each line into `$_` and auto prints
next if$.==1||eof; # `$.` is set to to the current line in file (1, 2, ..., n)
                   # and `eof` is true if its the last line
s/ .+?(?= )/ 0/g
andlrc
sumber
0

Lua, 69 byte

function f(a)for i=2,#a-1 do
for o=2,#a[i]-1 do
a[i][o]=0
end
end end

Kalau saja aku punya kurung kurawal bukannya dos dan ujung ...

Pengobrol
sumber
0

SmileBASIC, 69 51 byte

DEF H A,W,H
FOR I=1TO H-2FILL A,0,W*I+1,W-2NEXT
END

Mengisi area 2D dalam array biasanya akan membutuhkan menggunakan FILL dalam satu lingkaran. Tetapi jauh lebih mudah untuk bekerja dengan data 2D pada halaman grafik, jadi pertama-tama array tersebut disalin di sana.

Aww saya pikir saya sangat pintar menggunakan perintah grafik ... tapi ternyata memanggil FILL beberapa kali sebenarnya lebih pendek.

Pokoknya, input fungsi adalah array dan lebar / tinggi (Ini adalah standar dalam Smilebasic karena tidak ada cara untuk memeriksa dimensi array.)

12Me21
sumber
0

APL (Dyalog Classic) , 12 byte

⊢-(⍉01↓⌽)⍣4

Cobalah online!

⍉⌽⍵ biasanya rotasi (mundur secara horizontal dan transpos)

di sini kita gabungkan dengan 0⍪1↓⍵yang menggantikan baris pertama dengan nol (jatuhkan satu baris, lalu gabungkan 0 di atas) ke dalam satu kereta:⍉0⍪1↓⌽

⍣4 Diulangi 4 kali

⊢- kurangi dari matriks asli

ngn
sumber