Mathematica, 79 byte
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]-2⌊(2#)^.5+.5⌋+⌈Sqrt[8#+1]~Mod~1⌉&
Penjelasan
Saya tidak bisa diganggu untuk mengimplementasikan algoritma dalam tantangan, jadi saya ingin mencari jalan pintas ke solusinya. Walaupun saya menemukan satu, sayangnya itu tidak mengalahkan jawaban Mathematica yang mengimplementasikan algoritma. Yang mengatakan, saya yakin ini belum golf secara optimal, dan mungkin ada bahasa lain yang bisa mendapat manfaat dari pendekatan ini atau beberapa wawasan yang diperoleh dalam proses.
Jadi saya mengklaim bahwa urutan yang seharusnya kita hitung adalah:
f (n) = 2 * ( A212652 (n) - A002024 (n)) + 1 + A023532 (n-1)
Atau, itu f (n) = 1 jika n adalah bilangan segitiga dan f (n) = 2 * ( A212652 (n) - A002024 (n) + 1) sebaliknya.
Dalam ekspresi pertama, A023532 hanya menyandikan dua kasus yang berbeda ini. Dua urutan lainnya (plus 1) adalah perbedaan antara bilangan bulat terbesar k dalam dekomposisi terpanjang n menjadi bilangan bulat berurutan (k-i + 1) + (k-i + 2) + ... + k = n dan terbesar bilangan bulat j sehingga 1 + 2 + ... + j <n .
Dengan kata agak sederhana, di sini adalah bagaimana kita menemukan jawaban untuk nomor non-segitiga: pertama, menemukan terbesar nomor segitiga T j yang kurang dari n . Kemudian j adalah bilangan bulat kedua dari belakang yang ditambahkan selama langkah 1 (karena setelah menambahkan j + 1 kita akan melebihi n ). Kemudian dekomposisi n menjadi sebanyak (atau sekecil) bilangan bulat berturut-turut sebanyak mungkin dan panggil maksimum di antara angka-angka ini k . Hasilnya hanya 2 * (kj) . Alasan intuitif untuk ini adalah bahwa maksimum dalam dekomposisi bertambah 1 setiap langkah lainnya dan kita berhenti ketika kita mencapaik .
Kita perlu menunjukkan empat hal untuk membuktikan bahwa ini berhasil:
- f (n) = 1 untuk bilangan segitiga. Ini sepele kasusnya, karena langkah pertama hanya iterates melalui semua angka segitiga. Jika kita menekan dan persis selama proses ini kita selesai dan hanya ada satu langkah untuk menghitung.
- Untuk semua angka lainnya, kami selalu berakhir setelah langkah penghapusan, tidak pernah setelah langkah penyisipan. Itu berarti semua f (n) lainnya adalah genap.
- Di setiap langkah penyisipan setelah yang pertama, kami hanya menambahkan satu nomor. Jaminan bahwa kita akan mencapai dekomposisi termasuk k setelah kj pasang langkah.
- Dekomposisi akhir dari n yang kita peroleh selalu merupakan dekomposisi terpanjang yang mungkin dari n menjadi bilangan bulat berurutan, atau dengan kata lain, itu selalu merupakan dekomposisi dari n dengan maksimum terendah di antara jumlah yang dijumlahkan. Dengan kata lain, angka terakhir yang kita tambahkan ke penjumlahan selalu A212652 (n) .
Kami telah menunjukkan mengapa (1) itu benar. Selanjutnya, kami membuktikan bahwa kami tidak dapat mengakhiri langkah penyisipan kecuali langkah awal (yang tidak terjadi untuk angka non-segitiga).
Misalkan kita berakhir pada langkah penyisipan, mencapai n setelah menambahkan nilai p ke jumlah. Itu berarti bahwa sebelum langkah penyisipan ini, nilainya adalah np ( atau kurang jika kami menambahkan beberapa nilai sekaligus). Tetapi langkah penyisipan ini didahului oleh langkah penghapusan (karena kami tidak bisa menekan n selama langkah 1). Nilai terakhir q yang kami hapus selama langkah penghapusan ini tentu kurang dari p karena cara kerja algoritma. Tetapi itu berarti sebelum kita menghapus q kita memiliki n-p + q ( atau kurang ) yang kurang dari n. Tapi itu kontradiksi, karena kita harus berhenti menghapus bilangan bulat ketika kita menekan n-p + q alih-alih menghapus q lain . Ini membuktikan poin (2) di atas. Jadi sekarang kita tahu bahwa kita selalu berakhir pada langkah penghapusan dan karena itu semua angka non-segitiga memiliki output yang sama.
Selanjutnya kita buktikan (3), bahwa setiap langkah penyisipan hanya dapat memasukkan satu nilai. Ini pada dasarnya adalah akibat wajar dari (2). Kami telah menunjukkan bahwa setelah menambahkan satu nilai, kami tidak dapat menekan n dengan tepat dan karena buktinya menggunakan ketidaksetaraan, kami juga tidak bisa berakhir di bawah n (sejak itu n-p + q masih akan lebih kecil dari n dan kami tidak seharusnya menghapus yang banyak nilai di tempat pertama). Jadi, setiap kali kita menambahkan nilai tunggal, kami dijamin melebihi n karena kami pergi di bawah n dengan menghapus nilai yang lebih kecil. Karenanya, kita tahu bahwa ujung atas dari jumlah itu bertambah 1 setiap langkah lainnya. Kita tahu nilai awal dari ujung atas ini (itu terkecil m sehinggaT m > n ). Sekarang kita hanya perlu mencari tahu ujung atas ini setelah kita mencapai jumlah akhir. Maka jumlah langkah hanyalah dua kali perbedaan (ditambah 1).
Untuk melakukan ini, kami membuktikan (4), bahwa jumlah akhir selalu merupakan dekomposisi dari n menjadi sebanyak mungkin bilangan bulat, atau dekomposisi di mana maksimum dalam dekomposisi itu minimal (yaitu dekomposisi paling awal yang mungkin). Kami akan lagi melakukan ini dengan kontradiksi (kata-kata di bagian ini bisa sedikit lebih keras, tapi saya sudah menghabiskan terlalu banyak waktu untuk ini ...)
Katakanlah dekomposisi paling awal / terpanjang dari n adalah beberapa a + (a + 1) + ... (b-1) + b , a ≤ b , dan katakanlah algoritma melewatkannya. Itu berarti pada saat b ditambahkan, a tidak boleh lagi menjadi bagian dari jumlah. Jika a adalah bagian dari jumlah s , maka kita akan memiliki n ≤ s pada saat itu. Jadi, penjumlahan hanya berisi nilai dari a ke b , yang sama dengan n dan kami berhenti (maka kami tidak melewatkan dekomposisi ini), atau setidaknya ada satu nilai kurang dari a dalam jumlah, menangkan kasus n <sdan nilai itu akan dihapus sampai kami mencapai jumlah yang tepat (sekali lagi, dekomposisi tidak dilewati). Jadi kita harus menyingkirkan sebuah sebelum menambahkan b . Tetapi itu berarti kita harus mencapai situasi di mana a adalah komponen terkecil dari jumlah, dan yang terbesar belum b . Namun, pada saat itu kami tidak dapat menghapus a , karena jumlahnya jelas kurang dari n (karena b tidak ada), jadi kami diharuskan untuk menambahkan nilai terlebih dahulu hingga kami menambahkan b dan menekan n dengan tepat. Ini membuktikan (4).
Jadi, kumpulkan semuanya ini: kita tahu bahwa pasangan langkah pertama memberi kita nilai maksimum A002024 (n) . Kita tahu bahwa nilai maksimum dekomposisi akhir adalah A212652 (n) . Dan kita tahu bahwa maksimum ini bertambah satu kali dalam setiap pasang langkah. Oleh karena itu, ekspresi terakhir adalah 2 * ( A212652 (n) - A002024 (n) + 1) . Rumus ini hampir berfungsi untuk bilangan segitiga, kecuali untuk itu kita hanya perlu 1 langkah alih-alih 2, itulah sebabnya kita mengoreksi hasilnya dengan fungsi indikator bilangan segitiga (atau kebalikannya, mana yang lebih nyaman).
Akhirnya, untuk implementasi. Untuk urutan sebelumnya, saya menggunakan rumus MIN (odd d | n; n / d + (d-1) / 2) dari OEIS. Ternyata untuk menghemat beberapa byte jika kita mengambil faktor 2 ke dalam ekspresi ini untuk mendapatkan MIN (odd d | n; 2n / d + d-1) , karena -1 kemudian dibatalkan dengan +1 di versi pertama saya dari f (n) yang secara langsung mengkodekan dua case untuk bilangan triangular dan non-triangular. Dalam kode, ini adalah:
Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]
Untuk urutan terakhir ( 1, 2, 2, 3, 3, 3, ...
), kita dapat menggunakan formulir tertutup sederhana:
⌊(2#)^.5+.5⌋
Dan akhirnya, fungsi indikator terbalik dari angka segitiga adalah 0 setiap kali 8n + 1 adalah kuadrat sempurna. Ini dapat dinyatakan dalam Mathematica as
⌈Sqrt[8#+1]~Mod~1⌉
Ada banyak cara untuk mengekspresikan dua urutan terakhir ini dan untuk menggeser beberapa offset konstan di antara mereka, jadi saya yakin ini belum merupakan implementasi yang optimal, tetapi saya berharap ini dapat memberi orang lain titik awal untuk melihat ke dalam pendekatan baru di bahasa mereka sendiri.
Karena saya mengalami semua masalah ini, berikut adalah plot urutannya hingga n = 1000 (saya juga bisa menghitung 100k dalam beberapa detik, tetapi tidak benar-benar menunjukkan wawasan tambahan):
Mungkin menarik untuk melihat variasi tentang garis-garis yang sangat lurus itu, tetapi saya akan menyerahkannya kepada orang lain ...