Pekerjaan saya adalah menumpuk kerikil menjadi tumpukan segitiga. Saya hanya melakukan ini selama satu abad dan itu sudah cukup membosankan. Bagian terburuknya adalah saya memberi label setiap tumpukan. Saya tahu cara menguraikan kerikil menjadi tumpukan dengan ukuran maksimal , tetapi saya ingin meminimalkan jumlah tumpukan. Dapatkah kamu menolong?
Tugas
Diberikan bilangan bulat, dekomposisikan ke dalam jumlah minimum angka segitiga , dan hasilkan angka minimum itu.
Bilangan Segitiga
Angka segitiga adalah angka yang dapat dinyatakan sebagai jumlah dari n
bilangan asli pertama , untuk beberapa nilai n
. Demikianlah beberapa angka segitiga pertama
1 3 6 10 15 21 28 36 45 55 66 78 91 105
Contoh
Sebagai contoh, katakanlah inputnya 9
. Ini bukan bilangan segitiga, sehingga tidak dapat dinyatakan sebagai jumlah 1
bilangan segitiga. Dengan demikian jumlah minimum bilangan segitiga adalah 2
, yang dapat diperoleh dengan [6,3]
, menghasilkan output yang benar 2
.
Sebagai contoh lain, katakanlah inputnya 12
. Solusi yang paling jelas adalah dengan menggunakan algoritma serakah dan menghapus angka segitiga terbesar pada suatu waktu, menghasilkan [10,1,1]
dan menghasilkan 3
. Namun, ada solusi yang lebih baik [6,6]
:, menghasilkan output yang benar 2
.
Uji Kasus
in out
1 1
2 2
3 1
4 2
5 3
6 1
7 2
8 3
9 2
10 1
11 2
12 2
13 2
14 3
15 1
16 2
17 3
18 2
19 3
20 2
100 2
101 2
5050 1
Aturan
- Bilangan bulat input adalah antara 1 dan bilangan bulat maksimum bahasa Anda.
- Saya dapat meniru bahasa apa pun dengan kerikil saya , dan saya ingin kode Anda sekecil mungkin karena saya tidak punya apa-apa selain kerikil untuk melacaknya. Jadi ini adalah kode-golf , jadi kode terpendek di setiap bahasa menang.
sumber
n = 12
).Jawaban:
Retina ,
5749 byteCobalah online! Berdasarkan jawaban saya untuk Tiga angka segitiga . Ubah baris ketiga ke
^(^1|1\1)*$
untuk mendukung input nol. Sunting: Disimpan 8 (tetapi mungkin lebih) byte berkat @MartinEnder.sumber
1
di tahap kedua, dan tidak grup1
maupun3
di tahap ketiga.((?(2)1\2|1))
bisa disingkat menjadi(1(?(2)\2))
.^((?<2>)(1\2)+){2}$
. Atau^(()(?<2>1\2)+){2}$
jika Anda suka.Mathematica, 53 byte
Kode ini sangat lambat. Jika Anda ingin menguji fungsi ini, gunakan versi berikut ini sebagai gantinya:
Cobalah di Wolfram Sandbox
Penjelasan
sumber
Jelly ( garpu ), 9 byte
Ini bergantung pada garpu di mana saya mengimplementasikan atom pemecahan Frobenius yang tidak efisien. Aku tidak percaya ini sudah setahun sejak terakhir aku menyentuhnya.
Penjelasan
sumber
R ,
6958 byteCobalah online!
Penjelasan:
sumber
Jelly , 15 byte
Cobalah online!
sumber
JavaScript (ES6),
756361 byteBagaimana?
Kami menggunakan properti berikut:
Diberikan bilangan bulat positif n , cukup untuk menguji apakah kita dapat menemukan:
Jika kedua tes gagal, n harus merupakan jumlah dari 3 angka segitiga.
Uji kasus
Tampilkan cuplikan kode
sumber
MATL , 15 byte
Cobalah online!
Penjelasan
sumber
Kotlin ,
176154 bytepengajuan
Yg diperindahkan
Uji
TryItOnline
sumber