Sebelum ada yang mengatakan apa pun, mirip dan mirip . Tapi ini bukan penipuan.
Beberapa bilangan bulat positif dapat ditulis sebagai jumlah setidaknya dua bilangan bulat positif berturut-turut. Sebagai contoh 9=2+3+4=4+5
,. Tulis fungsi yang mengambil bilangan bulat positif sebagai inputnya dan mencetak sebagai outputnya urutan terpanjang dari peningkatan bilangan bulat positif berurutan yang menjumlahkannya (format apa pun dapat diterima, meskipun -5 byte jika outputnya adalah urutan peningkatan yang dipisahkan oleh +
seperti ditunjukkan di atas) Jika tidak ada urutan seperti itu, maka nomor itu sendiri harus dicetak.
Ini kode golf. Aturan standar berlaku. Kode terpendek dalam byte menang.
Sampel (perhatikan bahwa pemformatan bervariasi)
Input: 9
Output: 2,3,4
Input: 8
Output: 8
Input: 25
Output: [3,4,5,6,7]
-n+1
ken
)Jawaban:
Python, 67 byte
Strategi aneh langsung: mencari interval R dengan jumlah yang tepat.
Karena ujung bawah interval hanya meningkat, interval yang lebih lama ditemukan sebelum yang lebih pendek.
sumber
Pyth,
1210 bytePanjang kode 15 byte dan memenuhi syarat untuk bonus -5 byte . Cobalah online di Pyth Compiler .
Terima kasih kepada @Jakube untuk bermain golf 2 byte!
Bagaimana itu bekerja
sumber
Mathematica,
7368655643 bytesumber
Tuples
ekspresi infiks.Haskell,
4948 bytesumber
[...]!!0
bukanhead[...]
.MATLAB,
8779 byteSaya tahu sudah ada jawaban MATLAB, tetapi yang satu ini sangat berbeda dalam pendekatan.
Ini juga berfungsi pada Oktaf . Anda dapat mencoba online di sini . Saya sudah menambahkan kode ke
consecutiveSum.m
dalam ruang kerja yang ditautkan, jadi masukkan sajaconsecutiveSum
pada prompt perintah, kemudian masukkan nilainya (misalnya 25).Saya masih bekerja untuk mengurangi itu (mungkin menyesuaikan persamaan yang digunakan sedikit), tetapi pada dasarnya ia menemukan nilai terbesar
n
yangm
merupakan bilangan bulat, kemudian menampilkanm
angka pertama dimulai dengann
.Jadi mengapa ini berhasil? Yah pada dasarnya ada persamaan matematika yang mengatur semua angka-angka itu. Jika Anda menganggap bahwa semuanya berturut-turut, dan mulai dari titik tertentu, pada dasarnya Anda dapat mengatakan:
Sekarang, dari sini menjadi jelas bahwa urutan pada dasarnya hanya
p
angka segitiga pertama (termasuk 0'th), ditambahkan kep+1
banyakn
. Sekarang jika kita membiarkanm=p+1
, kita dapat mengatakan:Ini sebenarnya cukup bisa dipecahkan. Saya masih mencari cara kode terpendek untuk melakukannya, saya punya beberapa ide untuk mencoba dan mengurangi kode di atas.
Untuk input 25, outputnya adalah:
sumber
1,3,6,10,...
dimaksimalkan.Python 2, 94 byte
Input diambil dari stdin. Solusi ini cocok untuk input yang sangat besar.
Ini mengulangi kemungkinan panjang solusi, r , memiliki r ≤ √ (2n) , dan memeriksa solusi secara eksplisit. Agar ada solusi, jika r aneh, n mod r harus nol, dan jika r genap, n mod r harus r / 2 .
Contoh Penggunaan
Saya sengaja memilih contoh dengan output yang relatif kecil.
sumber
Oktaf, 89 Bytes
Ini adalah yang terbaik yang bisa saya lakukan di Octave. Algoritma ini sama dengan xnor.
Dalam MATLAB ini akan menjadi 95 byte:
Dalam MATLAB ini berjalan sekitar 0,1 detik untuk input
2000000
dan 1 detik untuk input1000002
.sumber
awk, 51 byte
Kode ini 56 byte, minus 5 byte untuk format output. Saya harus menggunakan 4 byte tambahan untuk menghasilkan format itu, jadi saya benar-benar menyimpan 1 byte. Hore! ;)
Ini sebenarnya melakukan kerja keras penjumlahan mulai dari 1 hingga jumlahnya lebih besar dari input. Kemudian mulai mengurangi angka mulai dari 1 hingga jumlahnya lebih kecil dari input. Itu terus mengubah nomor awal dan akhir dengan cara ini sampai menemukan hasil, yang kemudian dicetak.
Contoh penggunaan
Keluaran contoh
Saya sudah mencoba ini untuk masukan
1e12
dan memberikan hasil yang benar (464562+...+1488562
) segera. Meskipun butuh beberapa saat mencetaknya tentu saja ...sumber
{while($0!=s)s+=(s<$0) ? (++j) : -(++i); while(++i<j)r=r i"+"}$0=r j
saya selalu bilangan bulat terakhir yang dikurangkan dari awal rantai, j selalu bilangan bulat terakhir yang ditambahkan di akhir rantaiJapt , 33 byte
Ini menggunakan teknik Pyth Dennis , meskipun jauh lebih lama ...
Cobalah online! Peringatan: Untuk input yang lebih besar (<= 20), perlu beberapa saat untuk menyelesaikan, dan membekukan browser Anda hingga benar.
Tanpa penjelasan dan penjelasan
Versi penghasil bonus: (38 byte - 5 = 33)
sumber
Julia, 92 byte
Ini adalah fungsi anonim yang menerima integer dan mengembalikan array. Untuk menyebutnya, berikan nama, mis
f=x->...
.Tidak Disatukan:
sumber
Ruby, 94 byte
Tidak Disatukan:
Pemakaian:
sumber
Serius, 53 - 5 = 48 byte
Hex Dump
Cobalah secara Online!
Ini adalah pendekatan brute force, mirip dengan Dennis's Pyth.
Semuanya hingga
k
hanya membaca inputn
ke register 1 dan kemudian membuat daftar[[1],[2,2],[3,3,3],[4,4,4,4],...]
hinggan
n
.Bit selanjutnya
╗
adalah fungsi yang disimpan dalam register 0 yang mengambil pasangan, menambah kedua elemen, mengubahnya menjadi suatu rentang, menemukan jumlah kisaran, dan memeriksa apakah jumlah itu adalah nilai dalam register 1. Jika ya, ia mengembalikan rentang yang sesuai, dan jika tidak, ia mengembalikan daftar kosong.Bagian hingga kemunculan terakhir
M
suatu fungsi di atas daftar daftar yang diuraikan di atas, lakukanenumerate
pada setiap daftar, lalu pemetaan fungsi yang tersimpan di atasnya. Ketika selesai, kami memiliki daftar daftar yang masing-masing kosong atau kisaran yang dijumlahkann
.;░
menghapus daftar kosong.p@X
mengambil daftar pertama yang tersisa (0@E
juga berfungsi).'+j
menempatkan+
antara masing-masing nomor karena mengkonversi daftar ke string untuk bonus.sumber
ES6, 72 byte
Port langsung dari solusi awk @ Cabbie407, tetapi tanpa bonus format, karena ini penalti di sini.
sumber
Python 3,
239236215203 byteIni sedikit rumit. Saya harus bermain golf nanti.
ItuTerima kasihk
karena jika Anda memeriksat[0]
kosongt
, Python membuat suara kasar pada Anda. Sekali lagi, ini perlu bermain golf.t[:1]
, tidak ada lagi suara kasar! Anda hanya perlu memeriksa terhadap array lain.sumber
Jelly , 8 byte (tidak bersaing)
Cobalah online!
Jika saya mengerti dengan benar, ini bisa menjadi versi (11-5 = 6) -byte:
sumber
05AB1E , 11 - 5 = 6 byte (tidak bersaing)
Mengambil bonus itu tentu saja :)
Cobalah online!
sumber
PHP, 70 byte
Jalankan sebagai pipa dengan
-nR
atau coba online .bertambah
p
hingga menemukan solusi integer untukargument==(p+q)*(q-p+1)/2
,lalu mencetak rentang dari
p
hinggaq
.sumber
Excel VBA, 119 - 5 = 114 Bytes
Sub
rutin yang mengambil inputn
dari integer tipe yang diharapkan dan menampilkan urutan terpanjang dari angka berurutan yang menjumlahkannya ke sel[A1]
sumber