Matriks piramidal adalah matriks persegi di mana semua angka bertambah atau berkurang dari titik pusat, seperti dua matriks di bawah ini:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
Atau:
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3
Diberikan integer non-nol n
, buat matriks piramidal di mana angka berubah dari baik 1
ke n
dalam urutan yang meningkat (jika n <0), atau urutan menurun (jika n> 0) dari pusat. Jika n
genap, maka akan ada 4 angka pusat (lihat contoh).
Seperti biasa:
- Input dan format output opsional
- Jumlah spasi, pembatas, dll. Bersifat opsional
Kasus uji:
1
1
-1
1
5
1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1
-5
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5
2
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
-2
2 2 2 2
2 1 1 2
2 1 1 2
2 2 2 2
-4
4 4 4 4 4 4 4 4
4 3 3 3 3 3 3 4
4 3 2 2 2 2 3 4
4 3 2 1 1 2 3 4
4 3 2 1 1 2 3 4
4 3 2 2 2 2 3 4
4 3 3 3 3 3 3 4
4 4 4 4 4 4 4 4
-10 < n < 10
?Jawaban:
Jelly ,
1817 byteCobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
EXCEL: 126 byte
=MAX(MIN(MIN(CELL("row",RC)-1,CELL("col",RC)-1),MIN(((ABS(R1C1)-1)*2+3)-CELL("row",RC),((ABS(R1C1)-1)*2+3)-CELL("col",RC))),0)
Cobalah online *
Catatan: jawaban ini menggunakan Notasi R1C1. Jika Anda akan mencoba ini sendiri. Anda perlu mengaktifkannya di opsi Excel.
rumus yang diberikan harus ada di setiap sel yang ada di luar (2,2). Masukkan ukuran piramida yang Anda inginkan ke dalam (1,1).
tutup layar cepat dari rumus yang sedang beraksi:
Berikut ini adalah gambar tambahan yang menyenangkan dengan pemformatan bersyarat!
* Butuh waktu sangat lama untuk memperbarui, saat ini.
sumber
=MAX(MIN(MIN(ROW()-1,COLUMN()-1),MIN(((ABS(A1)-1)*2+3)-ROW(),((ABS(A1)-1)*2+3)-COLUMN())),0)
yang 92 byte. Itu masih tidak menangani kasus dan rumus tidak dapat diseret karena referensi sel tidak dikunci.=MEDIAN(MIN(ROW()-1,COLUMN()-1),ABS(A1)*2+1-MAX(ROW(),COLUMN()),0)
Range
atau membutuhkan lebih dari 126 byte.Python 2,
1099998Buat daftar
dan bermain dengannya sedikit.
sunting: cara baru membuat daftar + thx Lynn untuk dua byte
sumber
If n is even, then there will be 4 center numbers
MATL ,
2624 byteCobalah online! Atau verifikasi semua test case (kode yang sedikit dimodifikasi untuk dijadikan sebagai test suite).
Penjelasan
Kode pertama membangun array output dengan asumsi input positif
n
. Array diinisialisasi1
untuk input ganjil atau sebagai array kosong untuk input genap (ini dibuat sebagai matriks identitas dengan ukuran sama dengan paritas input). Kemudian berikut ini adalahn
waktu yang diulang untuk input genap, dann-1
waktu untuk input ganjil: perpanjang array dengan bingkai yang berisi0
, dan tambahkan1
ke semua elemen.Sebagai contoh, langkah-langkah untuk input
n
adalah:Array awal:
Perpanjang dengan bingkai:
Tambahkan
1
:Perpanjang dengan bingkai:
Tambahkan
1
:Ini memberikan output yang benar untuk input positif. Jika input negatif, array perlu dimodifikasi dengan menambahkan minus input
1
dan mengambil nilai absolut:Anda dapat menyaksikan peningkatan array (kode yang dimodifikasi untuk menampilkan langkah-langkah lanjutan) di MATL Online! Penerjemahnya masih versi beta. Jika tidak berhasil tekan "Jalankan" lagi atau muat ulang halaman.
Kode yang dikomentari
sumber
.2
detikPython 2.7:
123122120 Bytesprobs masih dapat menyimpan beberapa byte ...
sunting1:
N=abs(n)
untuk menyimpan 1 bytesunting2:
(i+1)*(n>0)or-n-i
untuk menyimpan 2 bytesumber
Haskell,
119113110104102101 byteMengembalikan matriks sebagai daftar daftar bilangan bulat, misalnya:
f 2
->[[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]]
.Bagaimana itu bekerja:
sumber
Perl, 175 byte
Termasuk 1 byte untuk
-p
.(Ada baris baru tambahan yang saya tidak tahu bagaimana menunjukkannya dengan penurunan harga, tetapi Anda membutuhkannya).
Kebutuhan
-p
serta-M5.010
atau-E
untuk menjalankan:Sial, ini terlalu lama ... Saya akan mencoba beberapa pendekatan lain ketika saya punya waktu.
sumber
eval
?y///
tidak menginterpolasi, jadi gunakan tanda kutip ganda untuk menginterpolasi$w
dan$k
, kemudianeval
untuk mengeksekusiy///
.Python 2, 109 byte
sumber
J,
2926 bytePemakaian
Penjelasan
i.
Output kata kerja range[0, 1, ..., n-1]
untuk positifn
dan[n-1, n-2, ..., 0]
negatifn
yang berguna di sini.sumber
Mathematica, 78 byte
Penjelasan
Buat matriks awal: 1x1 jika aneh, 2x2 jika genap.
Buat daftar dari 1 hingga abs (input) - 1.
Pad array awal menggunakan daftar tersebut di atas.
Tambahkan 1 atau -input, mana yang lebih kecil.
Terapkan nilai absolut ke seluruh matriks.
sumber
PHP,
177157 bytejalankan bersama
php -r '<code>
loop melalui baris dan kolom, mencetak nilai tergantung pada jarak mereka ke pusat.
$n=abs($z)+1
:+1
Menyimpan beberapa+1
dan-1
dalam ekspresi selanjutnya-$n+1
(pra-kenaikan dalam kondisi!) ke$n-1
(-abs($z)
keabs($z)
)$n
: 1) dilewati(
$n&1
apakah berlaku untuk kolom genap di sini! Ingat+1
?)+1
.sumber
Haskell,
191183173169168 bytePemakaian:
Terima kasih kepada nimi untuk
2102024 byte!sumber
negate
is(0-)
f
ke[id!id,tail!init]!!mod n 2
dan kemudian inline keg
dan menggunakan1<2
penjaga untuk mengikat hasil tengah cabang:g n| ... |q<-r<$>a n=([id!id,tail!init]!!mod n 2)q$a n
. Anda tidak perlu nama untuk fungsi utama.a
juga (dan beralih kembali ke1<2
penjaga):g n| ... |1<2=[id!id,tail!init]!!mod n 2=<<map r$r$(\x->(x<$[1..x])++[x+1..n])<$>[1..n]
.m=map
, di!
:...(++).m y
dang
:g n|n<0=m(m(abs.((n-1)+)))$g$abs n|1<2=[id!id,tail!init]!!mod n 2=<<m r$r$m(\x->(x<$[1..x])++[x+1..n])[1..n]
.JavaScript (ES6), 107 byte
l
adalah ukuran array. Then<0?-n-j:j+1
tampaknya canggung tapi saya tidak dapat menemukan sesuatu yang lebih baik.sumber
Vim,
152143 byteSaya yakin ini bisa lebih banyak bermain golf, terutama dua baris terakhir, tetapi otak saya digoreng.
Cobalah online!
Ini dia dalam format xxd dengan karakter yang tidak patut dicetak:
Penjelasan
Itu membangun piramida dari pusat ke luar, mengelilingi nomor pusat dengan
x
es:Kemudian ia mengganti
x
es dengan angka berikutnya dan mengelilinginya denganx
es lagi:...dan seterusnya. Untuk bilangan genap ia melakukan hal yang sama tetapi dimulai dengan basis 2x2.
Ini kodenya "ungolfed." Ini agak tidak konvensional di mana saya "merekam" makro dengan mengetikkannya ke dalam buffer (karenanya semuanya
<C-v>
) dan kemudian menghapusnya ke dalam register, yang merupakan cara terbaik yang saya temukan untuk membuat makro tanpa benar-benar mengeksekusi penekanan tombol.sumber
PHP, 215 Bytes
sumber
R, 112 byte
Membutuhkan integer
n
di ruang kerja, jika tidak dijalankann=scan()
untuk 8 byte tambahan.sumber