Deskripsi
Ada beberapa tantangan lain mengenai angka-angka ini sebelumnya, dan saya harap yang ini tidak ada di antara mereka.
The n th angka segitiga sama dengan jumlah semua bilangan sampai n , hal-hal sederhana. Ada halaman wikipedia dan entri di OEIS , bagi mereka yang ingin menginformasikan diri mereka lebih lanjut.
Sekarang, Gauss menemukan bahwa setiap bilangan alami dapat dinyatakan sebagai jumlah dari tiga bilangan segitiga (ini termasuk 0
), dan boleh saja memiliki satu bilangan lebih dari satu, misalnya 0 + 1 + 1 = 2
.
Tantangan
Tugas Anda adalah menulis program atau fungsi, diberi nomor alami (termasuk 0
), mencetak tiga angka segitiga yang meringkas argumen. Anda dapat mencetak angka-angka yang dipisahkan oleh spasi, sebagai array, atau dengan metode lain yang Anda suka. Namun, dilarang untuk menggunakan fungsi bawaan apa pun untuk secara langsung mendapatkan array, rentang atau bentuk koleksi lain yang berisi daftar angka segitiga (misalnya atom tunggal yang menghasilkan rentang).
Uji kasus
9 -> 6 + 3 + 0 or 3 + 3 + 3
12 -> 6 + 6 + 0 or 6 + 3 + 3 or 10 + 1 + 1
13 -> 6 + 6 + 1
1 -> 1 + 0 + 0
0 -> 0 + 0 + 0
Catatan: Jika ada lebih dari satu kombinasi yang mungkin, Anda dapat mencetak salah satu atau semua, tetapi Anda harus mencetak kombinasi apa saja satu kali, menghilangkan semua kombinasi yang merupakan hasil pengaturan ulang kombinasi lainnya. Saya sangat menghargai tautan coba-coba dan penjelasannya, saya sangat senang melihat bagaimana Anda memecahkan masalah;)
Ini kode-golf , jadi celah standar berlaku. Semoga jawaban tersingkat dalam byte menang!
sumber
a
tidak akan selalu menjadi angka segitigan
dan mengembalikan daftar pertaman
nomor segitiga yang diizinkan? Rasanya agak ditargetkan terhadap beberapa bahasa tertentu, meskipun saya tidak tahu yang mana.Jawaban:
05AB1E , 10 byte
Kode:
Penjelasan:
Menggunakan penyandian 05AB1E . Cobalah online!
sumber
Python 2 , 99 byte
Cobalah online!
Saya cukup kagum ini lebih pendek dari
itertools
atau pemahaman daftar tiga! Itu (akhirnya) mengeluarkan jawaban acak setiap kali Anda menjalankannya.Dua 102-an:
itertools terlihat seperti 106:
sumber
Jelly , 12 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Brachylog , 13 byte
Cobalah online!
Bagaimana itu bekerja
sumber
MATL , 18 byte
Ini menghasilkan hasil pertama dalam urutan leksikografis.
Cobalah di MATL Online!
Penjelasan
sumber
Haskell,
6659 byteTerima kasih telah mengizinkan untuk mengeluarkan semua solusi, itu adalah pengalih perhatian yang menarik! Saya sangat senang tidak perlu mengekstraksi satu solusi dan hanya bisa memberikan semuanya sehingga saya tidak melihat biaya yang timbul dari menghindari solusi yang diijinkan. @ Lynn berkomentar bahwa untuk saya dan biarkan saya menghemat 7 byte.
Ini mengikat lebih dari cukup angka segitiga ke
l
dan memeriksa semua kombinasi.sumber
a>=b,b>=c
persyaratan dan hanya suffixing!!0
ke kode Anda juga merupakan jawaban yang valid? Mengeluarkan semua solusi tidak terlalu membantu Anda di sini.Retina ,
6359 byteCobalah online! Tautan termasuk kasus uji.
(1(?(1)\1))*
adalah pencocokan angka segitiga umum, tetapi untuk angka segitiga pertama kita dapat menyimpan beberapa byte dengan menggunakan^
untuk pencocokan awal.sumber
PHP , 351 byte
Cobalah online!
sumber
Python 3 , 119 byte
Cobalah online!
Terima kasih kepada @WheatWizard karena telah menghemat 12 byte!
sumber
map
(dan mungkin filter Anda) dapat ditulis lebih pendek sebagai pemahaman daftar.map
[*filter(...)]
(x,y,z) for x,y,z in...
yang lebih panjang dari Andal for l in...
yang kemungkinan menyebabkan perbedaan itu.C / C ++ - 197 byte
Tiupan demi tiupan:
Dibutuhkan untuk printf. Dapat dieleksi untuk versi C tertentu
Hemat ruang untuk loop.
Evaluator segitiga rekursif.
Orang ini melakukan angkat berat. Tiga bersarang untuk loop iterasi a, b, c dari 0 hingga n, perhatikan bahwa b dan c setiap iterate dari nilai sebelumnya hingga n. Ini tidak sepenuhnya diperlukan untuk memotong iterasi seperti itu karena
return
kedatangan dalam satu menit menyelesaikan masalah "duplikat".Pada level bagian dalam, jika penjumlahan dari tiga angka segitiga
==
nilai yang diinginkan, cetak segitiga dan kembali.Anda dapat secara legal menghapus
return
kata kunci dan mengonversi tipe kembalinya c menjadi void untuk menyimpan beberapa byte lagi dan mencetak semua solusi yang mungkin. Hal ini untuk alasan ini bahwa iterasi terbatas, jika semua loop berlari dari0
ken
itu akan menyebabkan duplikat.sumber
Mathematica, 63 byte
sumber
First
yang menghemat itu menghemat 2 byte ,(t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&])&
untuk 62 byte.CJam , 26 byte
Port jawaban MATL saya. Ini adalah blok anonim yang mengharapkan input pada stack dan menggantinya dengan array output.
Cobalah online!
sumber
R , 66 byte
Algoritma brute force; membaca
n
dari stdin dan mengembalikan bingkai data di mana setiap baris adalah kombinasi dari 3 angka segitiga yang dijumlahkann
. Jika perlu, saya hanya bisa mengembalikan baris pertama untuk +4 byte.Cobalah online!
sumber
Java 8, 164 byte
Penjelasan:
Coba di sini.
sumber
JavaScript, 108 byte
Penjelasan
x
mewakili inputwhile(a<=x)r.push(a=i++*i/2)
Membuat larik semua angka segitiga hingga xThe
for
Loop mencetak jumlah segitiga tertinggi kurang darix
, kemudian mengurangi nomor darix
, selama tiga iterasi. (pada dasarnya algoritma serakah)sumber
x = 103
:91 + 10 + 1 = 102
Pyth, 19 byte
Saya sangat tidak berlatih dengan Pyth, itu tidak benar: /
Cobalah di sini .
sumber
J , 36 byte
Cobalah online!
sumber
Ruby
615755 byteTerinspirasi oleh jawaban Python Lynn . Ini menghasilkan kembar tiga acak sampai jumlah yang diinginkan tercapai:
Itu membutuhkan Ruby 2.4. Di Ruby 2.3 dan yang lebih lama, ini merupakan kesalahan sintaksis, dan
Range#sum
tidak ditentukan. Versi yang lebih panjang ini (64 bytes) diperlukan untuk Ruby 2.3:Inilah tes kecil:
Cobalah online dengan Ruby 2.3!
sumber
Javascript (ES6), 108 byte - diperbaiki
Mengambil bilangan bulat sebagai input, mengeluarkan array yang
[a, b, c]
berisi daftar nomor segitiga yang diurutkana + b + c = x
, di manaa
jumlah segitiga terbesar kurang dari atau sama dengan input, danb
merupakan jumlah segitiga terbesar kurang dari atau sama dengan minus inputa
.Penjelasan
Tampilkan cuplikan kode
sumber
x-m-n
angka segitiga, yaitu mengapa ini bekerja?