pengantar
Dalam matematika, bilangan poligon adalah bilangan yang direpresentasikan sebagai titik atau kerikil yang disusun dalam bentuk poligon beraturan. Titik-titik dianggap sebagai alfa (unit). Ini adalah satu jenis angka figurate 2 dimensi.
Angka 10, misalnya, dapat disusun sebagai segitiga:
* ** *** ****
Tetapi 10 tidak dapat disusun sebagai kotak. Angka 9, di sisi lain, dapat berupa:
*** *** ***
Beberapa angka, seperti 36, dapat disusun baik sebagai persegi maupun segitiga:
****** * ****** ** ****** *** ****** **** ****** ***** ****** ******
Dengan konvensi, 1 adalah angka poligon pertama untuk sejumlah sisi. Aturan untuk memperbesar poligon ke ukuran berikutnya adalah untuk memperpanjang dua lengan yang berdekatan dengan satu titik dan kemudian menambahkan sisi tambahan yang diperlukan antara titik-titik tersebut. Dalam diagram berikut, setiap lapisan tambahan ditampilkan dengan warna merah.
Angka segitiga:
Nomor Kuadrat:
Poligon dengan jumlah sisi yang lebih tinggi, seperti pentagon dan hexagon, juga dapat dibangun sesuai dengan aturan ini, meskipun titik-titik tidak akan lagi membentuk kisi yang teratur seperti di atas.
Bilangan Pentagonal:
Bilangan Heksagonal:
Sumber: Wikipedia
Tugas Anda
Dengan bilangan bulat positif N (1 <= N <= 1000), cetak setiap jenis Nomor Poligon N mulai dari Bilangan Segitiga hingga dan termasuk Bilangan Icosagonal (20-gon).
Sebagai contoh, angka 10 adalah angka segitiga dan angka decagonal, jadi outputnya harus seperti (Anda dapat memilih format output Anda sendiri, tetapi akan terlihat seperti ini):
3 10
Uji kasus
1 -> 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 -> (None)
3 -> 3
6 -> 3 6
36 -> 3 4 13
Untuk referensi, n
-th k
nomor -gonal adalah:
Kredit: xnor
Ingat, ini adalah kode-golf , jadi kode dengan byte paling sedikit menang.
sumber
n
bilangan k-gonal adalah(k-2)*n*(n-1)/2 + n
.Jawaban:
Python 3, 68 byte
Untuk setiap jumlah potensial sisi
s+2
, pecahkan rumus kuadratikR=s*n*(n-1)/2 + n
untukn
melihat apakah hasilnya bilangan bulat.Bandingkan (73 byte):
Pendekatan alternatif penyelesaian untuk
s
memberikan 62 byte dalam Python 3, tetapi gagalR=1
.sumber
JavaScript (ES6), 90 byte
Memecahkan persamaan kuadrat. 73 byte pada versi Firefox yang cukup baru:
sumber
> <>, 62 + 3 = 65 byte
Mengharapkan input di bagian atas tumpukan, jadi +3 byte untuk
-v
bendera.Ini adalah pemrograman pertama saya di> <>, jadi saya mungkin kehilangan beberapa trik yang jelas untuk mempersingkat kodenya.
Penjelasan:
Inisialisasi
Memindahkan N ke register, mendorong penghitung ke tumpukan (mulai dari
1
, yang sesuai dengan angka segitiga), dan memulai urutan dengan nilai0
dan1
.Loop Utama
Bandingkan bagian atas tumpukan dengan register. Jika sama, buka rutin cetak. Jika lebih besar, buka rutin reset. Kalau tidak, ambil perbedaan antara dua item tumpukan teratas, tambahkan penghitung, dan tambahkan ke item tumpukan teratas sebelumnya. Ini menghitung angka poligon berikutnya.
Mencetak
Mencetak penghitung + 2, diikuti oleh baris baru, lalu pindah ke rutin reset.
Setel ulang
Menghapus dua item tumpukan teratas dan menambah penghitung. Mengakhiri program jika penghitung lebih besar dari 18, jika tidak, tekan angka awal
0
dan1
ke tumpukan dan kembali ke loop utama.sumber
Jelly , 22 byte
Cobalah online!
Penjelasan
sumber
Aksioma 203 byte
di sini kurang golf dan rutin yang menunjukkan angka
sumber
AWK , 67 byte
Cobalah online!
Saya mencoba memecahkan kuadrat sebenarnya, tetapi memeriksa setiap nilai untuk melihat apakah itu bekerja lebih pendek (dan lebih sedikit rawan kesalahan bagi saya)
sumber
R,
6866 byteBaca
N
dari stdin. Menghitung angkaN
k-gonal pertama dan mendapatkan dik
mana mereka samaN
, menggunakan rumus xnor; namun, menyimpan byte pada tanda kurung dengan menggunakan1:18
alih-alih3:20
dan menambahkan2
di akhir.expand.grid
dengan nama default kolomVar1
,Var2
, ..., jika nama tidak diberikan.$
indeks dengan pencocokan sebagian, sehinggam$V
sesuai denganm$Var2,
kolom kedua.versi lama:
Cobalah online!
sumber
Pari / GP , 34 byte
Pari / GP memiliki built-in untuk menguji apakah suatu angka adalah angka poligonal.
Cobalah online!
sumber
Jelly , 20 byte
Saya baru saja mulai menulis pembohong yang efektif untuk tantangan ini (walaupun mencakup semua k> 1 bukan hanya [1,20]) ... jadi alih-alih saya akan menjawabnya!
Program lengkap mencetak representasi daftar Jelly dari hasil *
Cobalah online!
* Tidak ada hasil yang mencetak apa pun;
hasil tunggal mencetak hanya angka itu;
banyak hasil mencetak daftar angka yang
[]
tertutup dan tertutup,
Bagaimana?
sumber