Angka kuadrat adalah angka yang berbentuk di n^2
mana n adalah bilangan bulat. Ini juga disebut kuadrat sempurna, karena ketika Anda mengambil root kuadrat Anda mendapatkan bilangan bulat.
10 angka kuadrat pertama adalah: ( OEIS )
0, 1, 4, 9, 16, 25, 36, 49, 64, 81
Bilangan segitiga adalah angka yang dapat membentuk segitiga sama sisi. Angka segitiga ke-n sama dengan jumlah semua bilangan asli dari 1 ke n.
10 angka segitiga pertama adalah: ( OEIS )
0, 1, 3, 6, 10, 15, 21, 28, 36, 45
Angka segitiga kuadrat adalah angka yang berbentuk bujur sangkar dan segitiga.
10 angka segitiga persegi pertama adalah: ( OEIS )
0, 1, 36, 1225, 41616, 1413721, 48024900, 1631432881, 55420693056, 1882672131025, 63955431761796
Ada jumlah tak terbatas dari angka kuadrat, angka segitiga, dan angka segitiga kuadrat.
Tulis program atau fungsi bernama yang diberi nomor input (parameter atau stdin) n
, hitung n
angka segitiga kuadrat dan hasilkan / kembalikan, di mana n adalah bilangan nol bukan yang positif. (Untuk n = 1 mengembalikan 0)
Agar program / fungsi menjadi pengajuan yang valid, program harus dapat mengembalikan setidaknya semua angka segitiga persegi lebih kecil dari 2 ^ 31-1.
Bonus
-4 byte untuk dapat menampilkan semua angka segitiga kuadrat kurang dari 2 ^ 63-1
-4 byte karena secara teoritis dapat menghasilkan angka segitiga persegi dari berbagai ukuran.
+8 byte penalti untuk solusi yang membutuhkan waktu nonpolinomial.
Bonus menumpuk.
Ini adalah tantangan kode-golf, jadi jawaban dengan byte paling sedikit menang.
n
langkah - langkah, dan dalam setiap langkah aritmatika mengambil waktu linier karena jumlah digit tumbuh secara linearn
. Saya tidak berpikir waktu linear itu mungkin. Kecuali Anda mengatakan operasi aritmatika adalah waktu yang konstan?Jawaban:
CJam,
128 byteMemanfaatkan hubungan perulangan dari artikel Wikipedia.
Kode panjangnya 16 byte dan memenuhi syarat untuk kedua bonus.
Cobalah online di penerjemah CJam .
Bagaimana itu bekerja
Kode saya ternyata identik dengan xnor di selalu setiap aspek, kecuali bahwa saya menggunakan tumpukan CJam, bukan variabel.
sumber
Python 2, 45 - 4 - 4 = 37
Iterasi menggunakan rekurensi
Secara teori, ini mendukung angka dari berbagai ukuran, tetapi berjalan dalam waktu eksponensial, sehingga tidak memenuhi syarat untuk bonus. Harus bekerja untuk nomor dari berbagai ukuran. Misalnya, untuk 100, memberi
Solusi rekursif menggunakan 41 karakter, tetapi seharusnya tidak memenuhi syarat karena membutuhkan waktu yang eksponensial.
sumber
exec
solusi. Jika Anda diizinkan untuk mengubah batas rekursi, maka itu juga bisa menghitung angka segitiga persegi dari ukuran apa pun, memenuhi syarat untuk # 2. Namun, saya tidak yakin apakah itu memenuhi syarat (@Rodolvertice).Pyth, 16 - 4 - 4 = 8 byte
Menggunakan rumus rekursif dari artikel OEIS.
Ini menggunakan perintah post-assign yang cukup baru dan tampaknya sangat keren. Penggunaan mengurangi
n-1
waktu iterate karena pengindeksan berbasis 1.Tampaknya polinomial karena berulang kali dan melakukan matematika & tugas setiap iterasi, tapi aku bukan ilmuwan komputer. Selesai n = 10.000 hampir secara instan.
Coba di sini online .
sumber
b
.Oasis , 7 - 4 - 4 = -1 (Tidak bersaing)
Cobalah online!
Penggunaan
a(0) = 0, a(1) = 1; for n >= 2, a(n) = 34 * a(n-1) - a(n-2) + 2
Oasis mendukung bilangan bulat presisi yang sewenang-wenang, sehingga harus dapat naik ke nomor berapa pun selama tidak terjadi stack overflow. Beri tahu saya jika ini tidak termasuk bonus karena tumpukan tumpah. Mungkin juga bahwa algoritma khusus ini non-polinomial, dan beri tahu saya jika itu masalahnya.
Non-bersaing karena tantangan tanggal postingan bahasa.
Penjelasan:
Solusi alternatif:
Alih-alih menggunakan
a(n) = 35*(a(n-1)-a(n-2)) + a(n-3)
sumber
For n=1 return 0
, tetapi ini mengembalikan 1. Ini dapat diperbaiki dengan menambahkan opsi -O .JavaScript (ES6), 29-4 = 25 byte
Disimpan 5 byte berkat @IsmaelMiguel !
Saya harus menuliskan kode 0, 1 dan negatif untuk menghindari rekursi tak terbatas.
Konsol, saya menamai fungsinya
f
,:EDIT : Ternyata JavaScript akan membulatkan angka menjadi 16 (15) digit (Spec) karena angka-angka ini terlalu besar yang menyebabkan overflow. Masukkan 714341252076979033 di konsol JavaScript Anda dan lihat sendiri. Ini lebih merupakan batasan JavaScript
sumber
f(15)
harus kembali85170343853180456676
, bukan85170343853180450000
.n=>n?n<2?0:34*f(n-1)-f(n-2)+2:1
(31 byte). Saya sudah menguji sampai nomor 5.n=>n>1?34*f(n-1)-f(n-2)+2:!!n
. Ia kembalifalse
aktif0
,true
terus1
dan36
terus2
. Jika Anda ingin mengembalikan nomor, Anda dapat menggantinya!!n
dengan+!!n
.n=>n>1?34*f(n-1)-f(n-2)+2:n|0
(jumlah byte yang sama, sekarang selalu kembali angka)Excel VBA - 90 byte
Menggunakan relasi perulangan dari halaman Wikipedia:
Ketika dieksekusi Anda diminta untuk n, maka urutan hingga dan termasuk n adalah output ke kolom A:
Itu dapat dijalankan hingga dan termasuk n = 202 sebelum memberikan kesalahan overflow.
sumber
[Tidak Bersaing] Pyth (14 - 4 - 4 = 6 byte)
Menggunakan pengulangan pertama dari OEIS , bahwa setelah 0,1,36 Anda dapat menemukan A n = (A n-1 -1) 2 / A n-2 . A Tidak bersaing karena solusi ini dimulai dari 36, jika Anda turun Anda membagi dengan nol (jadi input 0 memberi 36). Juga harus hardcode 36.
Coba di sini
sumber
Java, 53 - 4 = 49 byte
Ini adalah rekursi sederhana yang lain, tetapi saya tidak sering memposting Jawa dengan skor <50, jadi ...
Sekarang, untuk sesuatu yang non- rekursif, itu akan menjadi sedikit lebih lama. Yang ini lebih lama (112-4 = 108) -dan- lebih lambat, jadi saya tidak yakin mengapa saya mempostingnya kecuali memiliki sesuatu yang berulang:
sumber
Julia, 51 byte - 4 - 4 = 43
Ini menggunakan relasi perulangan pertama yang tercantum di halaman Wikipedia untuk angka segitiga persegi. Ini menghitung n = 1000 dalam 0,006 detik, dan n = 100000 dalam 6,93 detik. Ini beberapa byte lebih lama dari solusi rekursif tetapi jauh lebih cepat.
Penjelasan + tidak dikumpulkan:
Contoh:
sumber
PHP,
655956-4 = 52 byteulangi sampai akar kuadrat
$s
adalah ∈ℤ: tambahkan$f
ke jumlah$s
, tambahkan$f
;ulangi
$argv[1]
kali.jumlah keluaran.
sumber
Prolog,
7074 - 4 - 4 = 66Menjalankan
n(100,R)
output:Butuh sekitar 1 detik untuk berjalan
n(10000,X)
di komputer saya.Sunting : Versi 66 bersifat ekor-rekursif. Versi non-ekor-rekursif sebelumnya adalah sebagai berikut:
Mereka memiliki panjang yang sama dalam byte tetapi non-tail-rekursif menghasilkan stack overflows melewati titik tertentu (di komputer saya, sekitar 20500).
sumber
Javascript ES6,
777571 karakterUji:
sumber
C, 68 byte
Ini adalah tantangan yang menyenangkan dengan C
main(o,k){o==1?k=0:0;k<9e9&&k>=0&&main(34*o-k+2,o,printf("%d,",k));}
Tonton di sini: https://ideone.com/0ulGmM
sumber
Jelly , 13 - 8 = 5 byte
Ini memenuhi syarat untuk kedua bonus.
Cobalah online!
Dilakukan bersama caird coinheringaahing dalam obrolan .
Penjelasan
sumber
Perl 6 , 25 - 8 = 17 byte
Cobalah online!
sumber
05AB1E , 10 - 8 = 2 byte
Cobalah online!
sumber
APL (NARS), 67 karakter, 134 byte
uji:
f akan mencari dalam urutan kuadrat elemen-elemen yang merupakan nomor segitiga juga, sehingga mereka harus mengikuti rumus periksa segitiga dalam APLs: 0 = 1∣√1 + 8 × m dengan angka m untuk memeriksa.
sumber