Sebuah angka segitiga adalah angka yang merupakan penjumlahan dari n
bilangan dari 1 sampai n
. Misalnya 1 + 2 + 3 + 4 = 10
demikian 10
adalah angka segitiga.
Diberikan bilangan bulat positif ( 0 < n <= 10000
) sebagai input (dapat diambil sebagai bilangan bulat, atau sebagai string), kembalikan angka segitiga sekecil mungkin yang dapat ditambahkan ke input untuk membuat nomor segitiga lain.
Misalnya input yang diberikan 26
, menambahkan 10
hasil 36
, yang juga merupakan angka segitiga. Tidak ada angka segitiga yang lebih kecil dari 10
yang dapat ditambahkan 26
untuk membuat angka segitiga lain, jadi 10
adalah hasil yang benar dalam kasus ini.
0
adalah bilangan triangular, oleh karena itu jika input itu sendiri bilangan triangular, output seharusnya 0
Testcases
Kasing diberikan dalam format input -> output (resulting triangular number)
0 -> 0 (0)
4 -> 6 (10)
5 -> 1 (6)
7 -> 3 (10)
8 -> 28 (36)
10 -> 0 (10)
24 -> 21 (45)
25 -> 3 (28)
26 -> 10 (36)
34 -> 21 (55)
10000 -> 153 (10153)
Mencetak gol
Ini adalah kode-golf sehingga byte paling sedikit di setiap bahasa menang!
26 -> 2
?Jawaban:
Java 8,
5857 byteTest suite online
Terima kasih kepada Dennis untuk penghematan 1 byte.
sumber
return-~i*i/2;
menghemat satu byte.int[]
alih - alihint
sebagai. Tapi itu berarti berurusan dengan array nanti. Ini bisa berhasil:,x->{int i=0,m=0,n=x[0];while(n!=0)n+=n<0?++i:--m;x[0]=-~i*i/2;}
tetapi 63 byte.MATL ,
1312 byte1 byte dihapus menggunakan ide (set persimpangan) dari jawaban 05AB1E Emigna
Cobalah online!
Penjelasan
Biarkan
t(n) = 1 + 2 + ··· + n
menunjukkan angkan
segitiga -th.Kode mengeksploitasi fakta bahwa, mengingat
n
, solusinya dibatasi oleht(n-1)
. Untuk melihat ini, amati bahwa itut(n-1) + n
samat(n)
dan jadi itu adalah bilangan segitiga.Pertimbangkan input
8
sebagai contoh.sumber
Q
dengan argumen Anda tentang batasan?8
. Ketika output sama dengan yang diikatt(n-1)
, kode mendapatkannya sebagait(n)-n
. Jadit(n)
itu perlu. Terima kasih atas idenya!Java (OpenJDK 8) , 83 byte
Cobalah online!
Kredit
sumber
m
. Jadi saya beralih daria
bawah ke0
. "tapi kau menugaskan mungkin 100 kali nilai yang samaa*a+a
untukm
dib
-loop", ya, saya tidak perlu melakukannya 100 kali, tapi aku mendapatkan byte dengan tidak melanggarb
-loop sebelumnya.Mathematica, 46 byte
sumber
Neim ,
129 byteIni membutuhkan waktu terlalu lama untuk dihitung (tetapi bekerja dengan waktu dan memori yang tak terbatas), jadi di tautan saya hanya menghasilkan 143 angka segitiga pertama - menggunakan
£𝕖
, yang cukup untuk menangani input 10.000, tetapi tidak cukup untuk waktu habis.Peringatan: ini mungkin tidak berfungsi di versi mendatang. Jika demikian, gantikan £ untuk 143
Penjelasan:
Cobalah!
sumber
9998
, hasil yang diharapkan adalah3118753
, yang jauh di atas angka segitiga ke-143 (yaitu `10296).This takes too long to compute (but works given infinite time and memory)
£
ke nomor yang lebih tinggi, seperti 200.PHP , 45 byte
Cobalah online!
Apakah varian lebih pendek dari
for(;!$r[$t];$t+=++$i)$r[$argn+$t]=~+$t;echo~$r[$t];
Diperluas
PHP , 53 byte
Cobalah online!
Gunakan operator pesawat ruang angkasa baru di PHP 7
Diperluas
PHP , 55 byte
Cobalah online!
sumber
Java 8,
1101021009392 byte-2 byte terima kasih kepada @PeterTaylor .
-7 byte terima kasih kepada @JollyJoker .
-1 byte terima kasih kepada @ceilingcat .
Penjelasan:
Cobalah online.
sumber
Brachylog ,
1715 byteCobalah online!
Penjelasan
sumber
Python 2 , 59 byte
Cobalah online!
Ini menggunakan karakterisasi angka segitiga berikut yang
t
dapat ditambahkann
untuk mendapatkan angka segitiga:Kode mengambil minimum dari semua angka segitiga tersebut.
sumber
Jelly , 8 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Japt ,
24231615 bytesMenguji
1 byte disimpan berkat ETH
Penjelasan
sumber
æ!øV
. Selain itu, terlihat hebat :-)Oktaf ,
3836 byte2 byte off berkat @Giuseppe!
Fungsi anonim yang menggunakan pendekatan yang hampir sama dengan jawaban MATL saya .
Cobalah online!
sumber
05AB1E , 12 byte
Menggunakan penyandian 05AB1E . Cobalah online!
sumber
Mathematica, 62 byte
sumber
Solve[2*#==m(m+1)-n(n+1)
akan lebih pendek (jika berhasil)?Python 2 ,
787170 byteTujuh byte disimpan, thanx ke ovs dan theespinosa
Satu byte lagi yang disimpan karena pernyataan neil ,
x+9
suffisant dan diperiksa untuk semua bilangan asli0 <= n <= 10000
. Hal itu juga diverifikasi untukx+1
bukanx+9
, ia bekerja juga.Cobalah online!
sumber
n*-~n/2
bukannyan*(n+1)/2
{n*(n+1)/2for n in range(999)}
alih-alih secara eksplisitset
dan juga menggunakan{}
alih-alihset
di baris ketigaJavaScript (ES6),
4342 byteSunting: Disimpan 1 byte berkat @PeterTaylor.
sumber
-++s
dengan--s
, seperti yang saya lakukan di mandiri berasal tapi sangat mirip versi Java saya. (Tambahan: Anda juga perlu mengubah tes ken>0
).n>s
ceknya adalah herring merah!node --stack_size=
untuk menambah ukuran tumpukannya.Python 3 ,
6044 byteTerima kasih kepada @xnor untuk saran yang menghemat 16 byte!
Cobalah online!
Latar Belakang
Biarkan n menjadi bilangan bulat non-negatif. Jika n adalah bilangan segitiga k , kita miliki
yang berarti akan ada solusi alami jika dan hanya jika 1 + 8n adalah kuadrat yang aneh dan sempurna. Jelas, memeriksa paritas 1 + 8n tidak diperlukan.
Bagaimana itu bekerja
Fungsi rekursif n menerima integer tunggal, non-negatif sebagai argumen. Saat dipanggil dengan argumen tunggal, k default ke 1 .
Pertama,
(8*n+1)**.5%1
menguji apakah n adalah bilangan segitiga: jika (dan hanya jika) itu,(8*n+1)**.5
akan menghasilkan bilangan bulat, sehingga residu dari divisi dengan 1 akan menghasilkan 0 .Jika modulus 0 ,
and
kondisinya akan gagal, menyebabkan f untuk mengembalikan 0 . Jika ini terjadi pada panggilan awal ke f , perhatikan bahwa ini adalah output yang benar sejak n sudah segitiga.Jika modulus positif,
and
kondisinya menahan danf(n+k,k+1)+k
dieksekusi. Ini memanggil f lagi, bertambah n oleh k dan k dengan 1 , lalu menambahkan k ke hasilnya.Ketika f (n 0 , k 0 ) akhirnya mengembalikan 0 , kami kembali dari rekursi. Argumen pertama dalam panggilan pertama adalah n , yang kedua n + 1 , yang ketiga n + 1 + 2 , sampai akhirnya n 0 = n + 1 + ... k 0 -1 . Perhatikan bahwa n 0 - n adalah angka segitiga.
Demikian juga, semua bilangan bulat ini akan ditambahkan ke nilai balik terdalam ( 0 ), sehingga hasil dari panggilan awal f (n) adalah n 0 - n , seperti yang diinginkan.
sumber
n
berulang, Anda dapat menulisn
daripada(n+k)
.C # (.NET Core) ,
291281 byteCobalah online! Program yang mengambil string sebagai input dan output melalui Kode Keluar.
Disimpan 10 Bytes berkat Kevin Cruijssen
sumber
class p{static int Main(string[]I){string d="0",s=I[0];int c=1,j,k;for(;;){j=k=0;string[]D=d.Split(' '),S=s.Split(' ');for(;j<D.Length;j++)for(;k<S.Length;k++)if(D[j]==S[k])return int.Parse(D[k]);j=int.Parse(D[0])+c++;d=d.Insert(0,$"{j} ");s=s.Insert(0,$"{j+int.Parse(I[0])} ");}}}
( 281 bytes )for(;;)
untuk membuat infinite loop adalah tonjolan yang bagus, dan saya akan memastikan untuk berpikir lebih hati-hati tentang apakah menggunakan var sebenarnya lebih efisien daripada menggunakan tipe eksplisit tetapi menggabungkan deklarasi, dan saya kira lebih rajin dalam menghapus tanda kurung yang tidak perlu. Adapun fungsi program vs., saya mulai dengan lambda tetapi tidak bisa menjalankannya di TIO. Saya tahu tautan TIO sebenarnya tidak perlu, tapi itu sesuatu yang saya suka lihat di jawaban orang lain, jadi saya ingin setidaknya sesuatu yang serupa dengan saya.JavaScript (ES7),
4644 byteCobalah
sumber
r=x=0
bekerja05AB1E , 8 byte
Cobalah online! atau sebagai Test suite
Penjelasan
sumber
Dyalog APL, 19 byte
6 byte disimpan berkat @KritixiLithos
Cobalah online!
Bagaimana?
o←0,+\⍳⍵
- tetapkano
yang pertama⍵
angka segitigao/⍨
- filtero
menuruto∊⍨⍵+o
- angka segitiga yang dijumlahkan dengan⍵
menghasilkan segitiga⊃
- dan ambil yang pertamasumber
+\⍳⍵
harus bekerja alih-alih apa yang Anda gunakan untuk menghasilkan angka segitiga.⊃
bukan bekerja⌊/
Pari / GP , 54 byte
Cobalah online!
sumber
Haskell , 56 byte
Cobalah online!
sumber
Tambahkan ++ , 68 byte
Cobalah online! , atau lihat test suite !
Bahkan Jawa mengalahkan saya. Saya benar-benar perlu menambahkan beberapa set perintah ke Tambah ++
Bagaimana itu bekerja
sumber
R ,
46444341 byteCobalah online!
Fungsi anonim dengan satu argumen wajib,
x
; menghitungx+1
angka segitiga pertama sebagai argumen opsional untuk menghilangkan beberapa kurung kurawal. Saya menggunakanchoose
sebelum saya melihat jawaban Oktaf Luis Mendo .Saya memotong beberapa byte jawaban Luis Mendo tetapi lupa untuk menggunakan ide yang sama dalam jawaban saya.
sumber
Jelly , 18 byte
Cobalah online!
sumber
Python 2 ,
8381 byteCobalah online!
sumber
APL (Dyalog Classic) ,
1614 byteCobalah online!
sumber
Clojure, 74 byte
Pilih favorit Anda :) Loop mungkin lebih pendek ...
sumber
Python 2 , 82 byte
Cobalah online
Ini dibuat dengan mengubah jawaban ini dari pertanyaan terkait.
sumber