Rantai penjumlahan adalah urutan bilangan bulat yang dimulai dengan 1, di mana setiap bilangan bulat selain 1 awal adalah jumlah dari dua bilangan bulat sebelumnya.
Misalnya, inilah rantai tambahan:
[1, 2, 3, 4, 7, 8, 16, 32, 39, 71]
Berikut ini jumlah yang menjadikannya rantai tambahan:
1 + 1 = 2
1 + 2 = 3
1 + 3 = 4
3 + 4 = 7
1 + 7 = 8
8 + 8 = 16
16 + 16 = 32
7 + 32 = 39
32 + 39 = 71
Dalam tantangan ini, Anda akan diberikan bilangan bulat positif n
, dan Anda harus menampilkan salah satu rantai penambahan terpendek yang berakhir n
.
Contoh - perhatikan bahwa ada banyak kemungkinan keluaran, yang harus Anda temukan hanyalah rantai tambahan yang sama pendeknya:
1: [1]
2: [1, 2]
3: [1, 2, 3]
4: [1, 2, 4]
5: [1, 2, 3, 5]
6: [1, 2, 3, 6]
7: [1, 2, 3, 4, 7]
11: [1, 2, 3, 4, 7, 11]
15: [1, 2, 3, 5, 10, 15]
19: [1, 2, 3, 4, 8, 11, 19]
29: [1, 2, 3, 4, 7, 11, 18, 29]
47: [1, 2, 3, 4, 7, 10, 20, 27, 47]
71: [1, 2, 3, 4, 7, 8, 16, 32, 39, 71]
Aturan I / O standar, dll. Lubang Standar dilarang. Golf kode: Byte paling sedikit menang.
code-golf
sequence
arithmetic
isaacg
sumber
sumber
Jawaban:
Haskell , 57 byte
Solusi brute force. Cobalah online!
Penjelasan
Daftar yang tak terbatas
c
berisi semua rantai tambahan, yang dipesan berdasarkan panjangnya. Ini didefinisikan secara induktif dalam hal dirinya sendiri, dengan mengambil daftarx
daric
dan dua elemen darix
, dan menambahkan jumlah mereka kex
. Fungsif
menemukan daftar pertamac
yang diakhiri dengan nomor yang diinginkan.sumber
Brachylog , 14 byte
Cobalah online!
Kiriman brute-force yang membangun semua rantai tambahan yang mungkin menggunakan iterative deepening, berhenti ketika rantai berisi argumen yang tepat ditemukan. Tidak seperti kebanyakan pengiriman Brachylog, ini adalah pengiriman fungsi yang diinput melalui argumen kanannya (secara konvensional disebut Output) dan output melalui argumen kirinya (secara konvensional disebut Input); melakukan hal ini agak kontroversial, tetapi jawaban meta dengan suara tertinggi pada subjek mengatakan itu sah (dan melakukannya konsisten dengan standar I / O normal kami untuk fungsi). Jika kita menggunakan input dan output dengan cara yang lebih konvensional, ini akan menjadi 16 byte (
∧≜;1{j⊇Ċ+}ᵃ⁽.∋?∧
), karena sisi kanan program tidak akan dapat menggunakan kendala implisit (dengan demikian perlu dinonaktifkan, dan batasan eksplisit baru diberikan, dengan biaya 2 byte).Penjelasan
Kehalusan yang menarik di sini adalah apa yang terjadi pada iterasi pertama, di mana input adalah nomor daripada daftar seperti pada iterasi lainnya; kita mulai dengan angka 1, buat dua salinan dari setiap digit (jadikan nomor 11), kemudian temukan 2 digit berikutnya (juga nomor 11). Kemudian kita ambil jumlah digitnya, yaitu 2, dan dengan demikian urutannya dimulai
[1,2]
seperti yang kita inginkan. Pada iterasi masa depan, kita mulai dengan daftar seperti[1,2]
, dua kali lipat untuk[1,2,1,2]
, kemudian mengambil subsequence dua elemen ([1,1]
,[1,2]
,[2,1]
, atau[2,2]
); jelas, jumlah masing-masing akan menjadi elemen berikutnya dari rantai penambahan.Agak membuat frustasi di sini bahwa petunjuk urutan evaluasi diperlukan di sini, terutama
≜
komponen (tampaknya yangᵃ
mengambil petunjuk urutan evaluasi dari dalam bukan dari luar secara default, sehingga penggunaan yang agak kasar≜
untuk memaksa masalah).sumber
ᵃ
adalah salah satu dari builtin yang jarang muncul, tetapi ketika Anda membutuhkannya, Anda benar - benar membutuhkannya, karena tidak ada cara yang jauh untuk mengimplementasikannya menggunakan konstruksi kontrol lain. Begitu saya menyadari ini adalah sebuahᵃ
tantangan, sisanya datang langsung dari sana.Jelly , 17 byte
Menghasilkan solusi leksikografis pertama dalam waktu eksponensial.
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6),
8386 byteSunting: diperbaiki untuk menampilkan daftar dalam urutan yang tidak terbalik
Demo
Tampilkan cuplikan kode
sumber
PHP, 195 Bytes
Cobalah online!
sumber
Mathematica, 140 byte
.
menghasilkan rantai tambahan terpendek yang berbeda setiap kali Anda menjalankannya
Cobalah online
paste kode dengan ctrl + v, masukkan input yaitu [71] di akhir kode dan tekan shift + enter
sumber
[1,2,4,5,9,18,36,72,77,149]
). Tampaknya program Anda menggunakan pengambilan sampel acak dan tidak dijamin untuk menemukan solusi optimal.Pyth, 13 byte
Suite uji
Memberikan rantai terpendek leksikografis pertama. Ini cukup lambat, tapi tidak terlalu buruk -
19
selesai dalam waktu sekitar 30 detik menggunakan pypy.Beberapa ide dari solusi @ Dennis.
Saya sangat suka yang ini - ada banyak trik rapi yang terlibat.
Penjelasan:
Ini masih agak sulit untuk dipahami, tetapi izinkan saya mencoba menjelaskan dengan lebih detail.
Kita mulai dengan
ySQ
, yang memberikan semua himpunan bagian yang mungkin dipesan[1, 2, ... Q]
, dalam urutan ukuran yang meningkat. Rantai penambahan terpendek jelas merupakan salah satunya, tetapi kita perlu menemukannya.Hal pertama yang akan kita lakukan adalah memfilter daftar hanya menyimpan daftar yang mengandung a
Q
. Kami melakukan ini dengan/#Q
.Selanjutnya, kami memesan daftar berdasarkan apa yang tersisa setelah kami menghapus hasil fungsi tertentu.
-D
pesanan oleh sisanya setelah menghapus sesuatu.Hal yang kami hapus adalah
sM^N2
, di manaN
daftar barang yang kami hapus.^N2
memberikan produk kartesiusN
dengan dirinya sendiri, semua pasangan yang memungkinkan dari dua elemen diN
.sM
lalu jumlahkan masing-masing pasangan.Apa hasil sekecil mungkin, setelah kami melakukan penghapusan ini? Nah, elemen terkecil dalam daftar input pasti akan tetap ada, karena semua angka positif, jadi jumlah dari dua angka akan lebih besar dari angka terkecil. Dan akan ada setidaknya satu nomor, karena kami memeriksa bahwa input ada dalam daftar. Oleh karena itu, hasil terkecil yang mungkin terjadi adalah ketika setiap angka kecuali angka terkecil adalah jumlah dari dua angka lain dalam daftar, dan angka terkecil dalam daftar adalah 1. Dalam hal ini, kunci pengurutannya adalah
[1]
. Persyaratan ini berarti bahwa daftar tersebut harus merupakan rantai tambahan.Jadi, kami mengurutkan rantai tambahan ke depan. Ingatlah bahwa
y
memberikan himpunan bagiannya dalam urutan ukuran yang meningkat, sehingga daftar yang disortir ke depan harus menjadi salah satu rantai penambahan terpendek.h
memilih daftar itu.sumber