Mari kita mendefinisikan matriks 9s sebagai:
Mari kita mendefinisikan nomor meledak sebagai angka pada posisi yang dapat didekomposisi menjadi bilangan bulat yang sama antara semua tetangga yang berdekatan (termasuk itu sendiri) dan nilai absolut dari setiap bagian lebih besar dari 0.
Dari matriks sebelumnya, mari kita meledak angka pada posisi (0 diindeks)
Terkadang, hasil penguraian menjadi bilangan rasional lebih besar dari 1. Ini adalah sesuatu yang perlu kita hindari saat meledak bilangan. Dalam hal ini sisanya akan ditugaskan ke nomor yang meledak.
Untuk mendemonstrasikannya, mari lanjutkan bekerja dengan matriks kami sebelumnya. Kali ini kita akan meledakkan angka pada posisi
Di sini kita memiliki 3 neightbors dan jumlahnya sendiri. Di sini persamaannya adalah sekitar yang memberi kita 2 untuk masing-masing dan 2 sebagai sisanya.
Juga, kadang-kadang angka tidak akan cukup besar untuk didekomposisi dalam bagian yang sama (di mana abs lebih besar dari 0) antara tetangganya (| angka rasional | <1). Dalam hal ini kita perlu "meminjam" dari nomor yang meledak untuk mempertahankan kondisi "lebih besar dari 0" . Mari kita lanjutkan dengan contoh kita sebelumnya dan meledak nomor di posisi .
Tantangannya adalah, mengingat daftar posisi dan susunan bilangan asli non-kosong yang terbatas, mengembalikan formulir yang meledak setelah setiap nomor dari daftar posisi diledakkan.
Uji kasus
Memasukkan: initial matrix: [[3, 3, 3], [3, 3, 3], [3, 3, 3]], numbers: [[0,0],[0,1],[0,2]]
Keluaran: [[1, 0, 1], [5, 6, 5], [3, 3, 3]]
Memasukkan: Initial matrix: [[9, 8, 7], [8, 9, 7], [8, 7, 9]], numbers: [[0,0],[1,1],[2,2]]
Keluaran: [[4, 11, 8],[11, 5, 10],[9, 10, 4]]
Memasukkan: Initial matrix: [[0, 0], [0, 0]], numbers: [[0,0],[0,0],[0,0]]
Keluaran: [[-9, 3],[3, 3]]
Memasukkan: Initial Matrix: [[10, 20, 30],[30, 20, 10],[40, 50, 60]], numbers: [[0,2],[2,0],[1,1],[1,0]]
Keluaran: [[21, 38, 13], [9, 12, 21], [21, 71, 64]]
Memasukkan: Initial Matrix: [[1]], numbers: [[0,0]]
Keluaran: [[1]]
Memasukkan: Initial Matrix: [[1, 2, 3]], numbers: [[0,0], [0, 1]]
Keluaran: [[1, 1, 4]]
Catatan
Aturan Input / Output berlaku
Anda dapat mengasumsikan input matriks tidak akan pernah kosong
Anda dapat menganggap koordinat selalu valid
Input coord dalam test case diberikan sebagai (baris, kolom). Jika Anda membutuhkannya (x, y) Anda bisa menukar nilainya. Jika demikian, sebutkan itu dalam jawaban Anda
Jawaban:
C (GCC)
220216214212 bytekredit ke @ceilingcat untuk 2 byte
Jalankan di sini
versi yang sedikit kurang golf
Kode panggilan dengan sebuah contoh
dan hasilnya
sumber
JavaScript (ES7),
126 125 123121 byteDisimpan 2 byte berkat @Shaggy
Mengambil input sebagai
(matrix)(list)
. Keluaran dengan memodifikasi matriks.Cobalah online!
Bagaimana?
Alih-alih itu, kami menggunakan fungsi rekursif yang mengeksekusi aliran operasi yang lebih sederhana, diulang sebanyak yang diperlukan:
Manfaat utama adalah bahwa kita hanya perlu satu loop di atas matriks. Manfaat kedua adalah kita tidak harus menghitung hasil bagi sama sekali.
Contoh
Setelah langkah 1 dari iterasi pertama , kami memiliki:
Dan setelah langkah 2 dari iterasi pertama :
Setelah langkah 1 dari iterasi kedua , kami memiliki:
Dan setelah langkah 2 dari iterasi kedua :
Kami sekarang menambah sel referensi dua kali ( langkah 4 dari kedua iterasi ), yang mengarah ke hasil akhir:
Berkomentar
sumber
(0)
dengan 2 backticks.R ,
163162161159155146 byteCobalah online!
Penjelasan
(Sesuai dengan versi kode sebelumnya)
sumber
Bersih ,
181167 byteCobalah online!
Dalam bentuk fungsi literal yang diterapkan sebagian.
Diperluas (versi pertama):
sumber
Karat - 295 byte
Ini cukup lama karena Rust memerlukan pengindeksan bilangan bulat vektor yang tidak ditandatangani, tetapi mengharuskan bilangan bulat yang ditandatangani untuk melakukan pengurangan yang menghasilkan negatif. Namun saya percaya algoritma saya adalah "algoritma terpendek" sejauh ini. Sebenarnya tidak perlu berurusan dengan mendeteksi tepi, bawah, dll.
Perhatikan tiga hal: Satu, jumlah semua sel selalu konstan. Dua, ini adalah situasi pembagian / sisa, sehingga kita dapat menerapkan pemikiran gaya algoritma Bresenham. Tiga, pertanyaannya selalu menambahkan angka yang sama untuk semua sel dalam jarak tertentu dari sel posisi khusus, sebelum berurusan dengan hal-hal "ekstra" di posisi khusus.
Algoritma:
Simpan nilai sel asli pada posisi P ke dalam M.
Mulai Loop:
Iterasi setiap sel I dalam matriks. Jika posisi sel I berada dalam 3 Kuadrat (jarak kuadrat) dari posisi P, maka kurangi 1 dari sel P dan tambahkan 1 ke sel I. Hitung berapa kali ini dilakukan dalam satu iterasi melalui matriks.
Jika nilai sisa dalam sel pada posisi P kurang dari atau sama dengan M / Count + M modulo Count, maka pecahkan loop. Kalau tidak, lakukan loop lagi.
Matriks yang dihasilkan akan menjadi versi yang meledak. Count pada dasarnya adalah cara menghitung tetangga tanpa berurusan dengan edge. Looping adalah cara untuk memecah divisi / penambahan barang menjadi penambahan / pengurangan tunggal berulang. Pemeriksaan modulo memastikan kita akan memiliki sisa yang tepat di posisi P untuk menangani 'ledakan' yang tidak terbagi rata di antara tetangga. Struktur loop do / while memungkinkan P <0 untuk bekerja dengan baik.
Versi tidak dikoleksi di Rust Playground
sumber
f
akan melakukannya. Tetapi Anda mungkin bisa menyimpan lebih banyak byte, dengan menggunakan fungsi anonim:|p:(i8,i8),v:&mut Vec<Vec<i8>>|{...}
Java 10,
194193191190184182171 bytePort berulang dari jawaban JavaScript @Arnauld .
-17 byte terima kasih kepada @Arnauld .
Memodifikasi input-matriks alih-alih mengembalikan yang baru untuk menghemat byte.
Cobalah online.
Penjelasan:
sumber
m[y]
m[y][x]
undefined[x]
akan gagal. Lagi pula,(x-X)**2+(y-Y)**2<3
cek Anda cukup cerdas. Perlu diingat bahwa ketika saya ingin memeriksa nilai dalam matriks dalam blok 3x3 (dan dalam batas) di sekitarnya. Saya pikir saya sebenarnya punya beberapa jawaban seperti itu, di mana saya sekarang menggunakan try-catch, dan dalam satu kasus try-akhirnya .. Akan melihat mereka ketika saya punya waktu.Common Lisp , 498 byte
Cobalah online!
Gunakan fungsi ini sebagai
(print (c #2A((3 3 3) (3 3 3) (3 3 3)) '((0 0)(0 1)(0 2))))
Versi lebih mudah dibaca:
Contoh keluaran:
sumber
Python 2 , 171 byte
Cobalah online!
sumber