(Ada pertanyaan terkait tentang tumpukan pasir tak terbatas , dan menemukan elemen identitas tumpukan pasir .)
Diberikan matriks bilangan bulat non-negatif, kembalikan matriks dengan dimensi yang sama, tetapi dijatuhkan :
- Jika matriks tidak mengandung nilai lebih dari 4, kembalikan.
- Setiap "sel" yang lebih besar dari 3 akan berkurang sebesar 4, dan semua sel yang bertetangga secara langsung (di atas, di bawah, kiri, dan kanan) bertambah, jika ada.
- GOTO 1.
Contoh:
0 1 0 0 2 0
2 4 0 -> 3 0 1
0 0 3 0 1 3
1 2 3 2 3 4 2 5 1 4 1 2 0 3 3 0 3 3 0 3 3
4 5 6 -> 2 4 4 -> 4 2 3 -> 0 5 4 -> 3 2 1 -> 3 3 1 -> 3 3 2
7 8 9 5 7 7 2 6 5 4 3 2 0 5 3 1 1 4 1 2 0
(Anda hanya perlu mengembalikan hasil akhir. Jalur yang Anda capai mungkin berbeda dari yang ditunjukkan di sini: tidak masalah dalam urutan mana Anda melakukan operasi penggulingan, semuanya mengarah ke hasil yang sama.)
Untuk penjelasan yang lebih dalam dan motivasi, lihat video Numberphile ini atau artikel Wikipedia tentang model pasir Abelian .
Aturan:
- Anda dapat mengambil input dan output dengan salah satu cara standar
- Celah dilarang
- Input dan output mungkin:
- daftar bersarang:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- daftar sederhana:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
dan bentuknya - semacam jenis matriks asli
- sebuah string, mis
1 2 3\n4 5 6\n7 8 9
- atau apa pun yang berfungsi dalam bahasa Anda.
- daftar bersarang:
- Input dan output harus dalam bentuk yang sama
- Input mungkin berisi angka yang lebih besar daripada yang ditunjukkan di sini, tetapi ukurannya mungkin dibatasi oleh batas bahasa Anda (setara MAXINT, jika ada)
- Matriks dapat memiliki bentuk apa pun (mis. 1x1, 2x2, 3x3, 4x4, 2x7, 11x3, ...)
- Anda tidak perlu menangani case di mana bentuknya 0xN atau Nx0.
Testcases
[[2, 5, 4], [8, 6, 4], [1, 2, 3]] -> [[3, 3, 0], [1, 2, 2], [1, 3, 2]]
[[0, 0, 2], [1, 3, 3], [0, 0, 0]] -> [[0, 0, 2], [1, 3, 3], [0, 0, 0]]
[[9, 9, 9], [9, 9, 9], [9, 9, 9]] -> [[1, 3, 1], [3, 1, 3], [1, 3, 1]]
[[4, 5], [2, 3]] -> [[2, 3], [0, 1]]
[[2, 3, 5], [2, 2, 0]] -> [[3, 0, 2], [2, 3, 1]]
[[7]] -> [[3]]
Ini codegolf , kode terpendek (per bahasa) menang.
code-golf
array-manipulation
cellular-automata
L3viathan
sumber
sumber
Jawaban:
MATL , 17 byte
Cobalah di MATL Online! Atau verifikasi semua kasus uji .
Penjelasan
Program ini berulang sebanyak jumlah input. Ini adalah batas atas yang longgar pada jumlah iterasi yang diperlukan.
Untuk setiap iterasi, entri dalam matriks sandpile melebihi
3
terdeteksi, memberikan matriks1
dan0
, yang berbelit-belit dengan topeng 4-tetangga. Entri yang melebihi3
dalam matriks pasir dikurangi oleh4
, dan hasil konvolusi ditambahkan.Untuk iterasi terakhir, di mana matriks sandpile tidak memiliki angka melebihi
3
, nol dikurangi dan ditambahkan ke dalamnya, sehingga tidak terpengaruh.sumber
Mathematica, 65 byte
Penjelasan
Mengubah input berulang kali dengan menjatuhkan semua tumpukan lebih besar dari 3. Proses ini berhenti secara otomatis ketika transformasi gagal mengubah matriks (yaitu ketika tidak ada tumpukan besar lagi). Dalam ekspresi berikut, matriks disebut
s
.Buat matriks yang memiliki
1
setiap kali matriks saat ini memiliki4
atau lebih besar, dan nol sebaliknya. Ini pada dasarnya adalah topeng yang menunjukkan tumpukan mana yang harus digulingkan. Panggil topengnyax
.Pertama-tama kita menghitung jumlah pasir yang ditambahkan ke setiap tumpukan karena tumpukan tetangga yang jatuh. Ini dilakukan dengan konvolusi dari matriks berikut atas
x
:Pada dasarnya, ia menambahkan satu ke sel saat ini untuk masing-masing tetangga von-Neumann di topeng.
Kami menambahkan hasil sebelumnya
s
dan kemudian kami mengurangi empat kali topeng dari itu untuk mengurangi tumpukan yang dijatuhkan.sumber
Oktaf, 65 byte
Ini sepertinya tidak terlalu bagus, saya pasti melewatkan beberapa trik ...
sumber
input(0)
?>> version ans = 4.0.1
JavaScript (ES6),
10195 byteMengambil lebar matriks
w
dan array nilaia
dalam sintaks currying(w)(a)
. Mengembalikan array nilai.Diformat dan dikomentari
Uji kasus
Tampilkan cuplikan kode
sumber
JavaScript (ES6),
118114104 byteDisimpan 2 byte berkat @Neil
sumber
(i-=x)|y-j?i*i+
membantu?a.find(...b.find(...c>3&&a.map(...)))&&f(a)
..map
tidak bermutasi ...f=a=>a.find((b,x)=>b.find((c,y)=>c>3&&a.map(b=>b.map((_,j)=>b[j]+=x|(j-=y)?x*x+j*j==1:-4)&x--)))&&f(a)
C ++,
261258250 byteMengambil input sebagai referensi ke vektor vektor dan memodifikasinya secara langsung.
Cobalah online!
sumber