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
var QUESTION_ID=71591,OVERRIDE_USER=32014;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Java 7, sebagai fungsi sepenuhnya bernama: 85
Anda bisa lambda ini di Java 8 untuk menghapus beberapa byte, tapi saya tidak benar-benar melakukannya.
sumber
Arrays.fill(a[i],1,a[i].length-1,0);
? Ini hanya 36 byte, bukan 37. =)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. :)Jelly,
1817159 byteCobalah 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
ini menghasilkan
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
sumber
Mathematica, 27 byte
sumber
-2
s menunjukkan kolom atau baris kedua-terakhir.R ,
3348 byteSaya tahu, R tidak dibuat untuk bermain golf. Tetapi ini dibuat untuk pengindeksan posisi ... Memuat sebuah contoh;
Ganti nilai pada posisi apa pun yang bukan di baris atau kolom tepi, dengan 0:
Juga memeriksa tes 2 kolom:
Cucu: upaya sebelumnya
Menguji semua contoh:
sumber
a
ada. Agar sesuai dengan aturan kami, Anda bisa menjadikannya fungsi yang mengambil matriks, sepertifunction(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}
untuk 47 byte.Mathematica
8176 byteBagaimana itu bekerja
Asumsikan bahwa array input disimpan di
m
. Dimensi darim
adalah {4,5} `Setiap sel dalam array berikut,,
a
Benar jika sel berada di baris pertama atau (||
) di baris terakhir atau di kolom pertama atau terakhir; kalau tidak, itu salah.Menerapkan fungsi
Boole
ke array mengkonversi True ke 1 dan False ke 0.Kalikan matriks
m
denganb
. Ini mengalikan setiap sel dalam m dengan sel yang sesuai di b.sumber
||
sebagai ATAU Anda untuk menyimpan beberapa byte, dan saya dapat melihat beberapa byte lain yang dapat Anda simpan juga!GNU Sed, 31
Versi 4.2.2 atau sebelumnya, sebelum komitmen ini (diskusi) .
Skor termasuk +1 untuk
-r
opsi.Baris input dipisahkan baris baru. Elemen pada setiap baris dipisahkan satu baris.
Penjelasan
Cobalah online.
sumber
1n;$n;:;s/ -?\w+ / : /;t;y/:/0/
.Oktaf, 34 byte
Perhatikan bahwa input membutuhkan titik koma untuk memisahkan baris array:
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.setel ke
0
semua elemen yang tidak ada di baris atau kolom pertama atau terakhir:Jika salah satu dimensi kurang dari atau sama dengan 2, kisaran
end-1
adalah 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 denganfor
loop:Kondisi berhenti benar pada iterasi pertama, jadi kami keluar dari loop.
sumber
Jelly , 12 byte
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 denganPenjelasan lengkap
sumber
ES6,
524846 byteSunting: Disimpan 4 byte berkat @ user81655. Menyimpan 2 byte lebih lanjut berkat produk @ETH.
sumber
g
yang menyimpan beberapa byte:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
f=
), tetapi Anda bisa mendapatkannya hingga 46:f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
f=
. Saya juga sedikit terkejut+.5
tapi saya melihat ada penambahan string pada panggilan lainnya.Javascript,
625956 bytePendekatan ini mengharapkan string sebagai argumen. Anda dapat melihat apa yang dilakukan regex di sini: https://regex101.com/r/kC6xA8/3
sumber
Mathematica, 55 byte
Kasus cobaan
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]
petaf
ke setiap elemenlist
dalam radiusr
.Perhatikan bahwa elemen batas digandakan ketika ada tetangga yang tidak cukup. Kapan
list
2-dimensi, fitur ini bekerja dengan baik bersama-samaDet
untuk memberikan hasil yang diinginkan, karena kolom atau baris yang diduplikasi pada empat batas menghilangkan penentu.dimana
Power~Array~{4,4}
jaminan penentu pada posisi dalam menjadi tidak nol. Danmemberikan matriks topeng.
sumber
Python, 50 byte
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.
sumber
Julia,
5035 byteIni 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!
sumber
C, 62 byte
Harap tidak apa-apa untuk mengambil panjang / lebar array sebagai parameter. Saya bermain-main dengan memset / bzero sedikit, tetapi mengalikan dengan
sizeof(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.
EDIT: Terima kasih Washington Guedes untuk tipnya!
sumber
sizeof(int)
? Anda bisa menggunakan4
...sizeof(int) != 4
pada mesin saya: P-->
operator menyendiri ;)Perl 6 , 28 byte
Ini memodifikasi input di tempat
Pemakaian
sumber
{.[1..*-2]»[1..*-2]X=0}
menghemat 2 byteJavaScript ES6,
696657 byteBagaimana itu bekerja
Solusi ini memetakan melalui setiap indeks-y
y
dan indeks -xx
dalam input dan memutuskan apakah akan membuangnya berdasarkan dua indeks ini. Ada empat kasus yang perlu kita pertahankan:x
adalah 0y
adalah 0x
sama dengan panjang array bagian dalam, minus 1y
sama dengan panjang array luar, minus 1Kita dapat menangani dua yang pertama dengan sedikit perkalian:
x*y
mengembalikan0
iff salah satux
atauy
0, dan bilangan bulat positif sebaliknya. Sekarang untuk yang ketiga: kita bisa memeriksa apakahX.length>x+1
, tetapi itu membutuhkan banyak byte. Cara lain untuk melakukan ini adalah untuk memeriksa apakah item di depan adalah palsu, yaituundefined
, yang Anda dapatkan ketika mencoba mengakses item yang tidak ada. Namun, ini juga cocok jika item berikutnya0
, jadi kami menambahkan 0,5 untuk memastikan itu tidak terjadi: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 menjadi0
jika semua di atas ternyata benar;N
jika tidak. Dan itu dia!sumber
Retina ,
31 2422Disimpan 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.
sumber
Java 8, sebagai fungsi lambda:
828395 karakter / byteLambda Signature:
int[][] -> (void)
(yaituConsumer<int[][]>
)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. : /
sumber
Haskell,
5958 byteDiperluas
sumber
++[last y]
menjadi:(last y)
atau:last y
x : map f (…)
sudah tipe[a]
, danlast y
memiliki tipea
, sedangkan(:) :: a -> [a] -> [a]
. Menambahkan elemen pada akhir daftar dalam jenis Haskell menyebalkan, karena daftar tersebut adalah daftar forward yang terhubung satu arah.k
menjadi operator infiks, katakanlah#
dan flip argumen untuk menyimpan satu byte:[x]#_=...
,(x:y)#f=...
,f=(#(# \_->0))
dan Anda dapat menjatuhkan nama fungsi utama Anda, yaituf=
selama dua byte.Pyth, 18 byte
Penjelasan
Array input dipisahkan oleh baris baru
Coba di sini
sumber
Groovy, 70 byte
Ini tidak terlalu kreatif, tetapi singkat!
Penjelasan
Penutupan dengan satu arg
Iterate di atas array batin, lewati elemen pertama dan terakhir
Iterasi item tengah di array dalam
Setel elemen ke
0
dan kembalia
Tes
sumber
R,
716457 Bytessunting -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
sumber
C ++,
8079 byteHarapkan array
int**
dengan ukuran yang diberikann
dank
:Alternatif yang berfungsi untuk semua jenis yang memiliki
size()
danvalue_type & operator[](int)
(98 byte):Versi yang diperluas
sumber
PHP,
82818071 byteJalankan seperti ini:
count
, yang merupakan nama yang terlalu panjang untuk codegolfsumber
for
aman untuk selalu beralih hinggacount($z[0])-1
cadangan 1 karakter.APL,
17 byte15 byteBagaimana 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.sumber
Perl, 34 + 2 = 36 byte
Membutuhkan
-p
bendera:Bagaimana itu bekerja:
sumber
Lua, 69 byte
Kalau saja aku punya kurung kurawal bukannya dos dan ujung ...
sumber
SmileBASIC,
6951 byteMengisi 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.)
sumber
APL (Dyalog Classic) , 12 byte
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 aslisumber