Memasukkan:
Bilangan bulat positif n yaitu 1 <= n <= 25000
.
Keluaran:
- Dalam urutan ini kita mulai dengan angka desimal 1 / n .
- Kemudian kita mengambil jumlah digit hingga digit ke- n setelah koma (1-diindeks); diikuti oleh jumlah digit hingga ( n -1) 'th, lalu ( n -2)' th, dll. Lanjutkan hingga n adalah 1.
- Hasil adalah jumlah dari semua ini digabungkan.
Sebagai contoh:
n = 7
1/7 = 0.1428571428...
7th digit-sum = 1+4+2+8+5+7+1 = 28
6th digit-sum = 1+4+2+8+5+7 = 27
5th digit-sum = 1+4+2+8+5 = 20
4th digit-sum = 1+4+2+8 = 15
3rd digit-sum = 1+4+2 = 7
2nd digit-sum = 1+4 = 5
1st digit = 1
Output = 28+27+20+15+7+5+1 = 103
Aturan tantangan:
- Jika desimal 1 / n tidak memiliki n digit setelah koma, yang hilang akan dihitung sebagai 0 (yaitu
1/2 = 0.50 => (5+0) + (5) = 10
). - Anda mengambil digit tanpa pembulatan (yaitu digit
1/6
are166666
dan not166667
)
Aturan umum:
- Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
- Celah Default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Juga, silakan tambahkan penjelasan jika perlu.
1 - 50 pertama secara berurutan:
0, 10, 18, 23, 10, 96, 103, 52, 45, 10, 270, 253, 402, 403, 630, 183, 660, 765, 819, 95, 975, 1034, 1221, 1500, 96, 1479, 1197, 1658, 1953, 1305, 1674, 321, 816, 2490, 2704, 4235, 2022, 3242, 2295, 268, 2944, 3787, 3874, 4097, 1980, 4380, 4968, 3424, 4854, 98
Terakhir 24990 - 25000 dalam urutan:
1405098782, 1417995426, 1364392256, 1404501980, 1408005544, 1377273489, 1395684561, 1405849947, 1406216741, 1142066735, 99984
code-golf
sequence
number-theory
Kevin Cruijssen
sumber
sumber
Jawaban:
Jelly , 9 byte
Agak lambat, tapi pendek. Cobalah online! atau verifikasi 50 kasus uji pertama .
Bagaimana itu bekerja
sumber
Mathematica, 42 byte
atau
atau
Penjelasan
Ambil contoh dari spec tantangan. Kami ingin menghitung:
Mengatur ulang, ini adalah:
dimana
.
produk skalar dari dua vektor.Cukup banyak solusinya.
Ini memberi kita
N
angka desimal pertama1/N
(#&@@
ekstrak elemen pertama dariRealDigits
hasil karena itu juga mengembalikan offset dari digit pertama yang tidak kita pedulikan).Kemudian kita mendapatkan daftar dari
N
bawah ke1
menggunakan(#-Range@#+1)
atauRange[#,1,-1]
, keduanya lebih pendek dariReverse@Range@#
, dan mengambil produk skalar.Solusi alternatif yang digunakan
Accumulate
untuk menghitung daftar semua jumlah awalan dan kemudian menambahkan jumlah awalan denganTr
.Karena ini sangat cepat bahkan untuk input besar, berikut adalah sebaran plot urutan hingga
N = 100,000
(melakukan semuanya dan memplotnya memakan waktu cukup lama):Klik untuk versi yang lebih besar.
Garis biru adalah batas atas naif dari
9 N (N+1) / 2
(jika semua angka desimal adalah9
) dan garis oranye persis setengah dari itu. Tidak mengherankan ini tepat di dalam cabang utama plot karena, secara statistik, kami berharap angka rata-rata menjadi 4,5.Garis tipis titik plot yang dapat Anda lihat di bawah cabang utama adalah pecahan yang berakhir
...3333...
, karena semuanya terletak sangat dekat3 N (N+1) / 2
.sumber
05AB1E ,
1211 byteCobalah online! atau Test suite untuk 50 angka pertama.
Penjelasan
Versi yang lebih efisien untuk mencoba angka besar di TIO
Perbedaannya dengan versi yang lebih pendek adalah bahwa di sini kita menjumlahkan produk digit dan pembalikan indeks berbasis 1 mereka alih-alih menjumlahkan digit dalam awalan.
Cobalah online!
sumber
Java 8,
181169166153142 bytePenjelasan:
Coba di sini.
sumber
PHP,
6665 byteDiadaptasi dari jawaban ini (juga oleh saya): Pembagian jumlah yang tidak sedikit dan saran Jörg Hülsermann yang disarankan untuk diedit. Gunakan seperti:
sunting: mengoreksi bug untuk +1 byte dan melipat tugas $ a menjadi $ argv [1] untuk -2 byte untuk bersih 1 byte lebih sedikit.
sumber
Scala, 84 byte
Tidak Disatukan:
Penjelasan:
Saya bisa menyimpan beberapa byte dengan mengeksploitasi cara compiler tokenizes: Dengan memanggil argumen
&
, Anda dapat menulis1 to&map
alih-alih1 to n map
. Aturan yang sama berlaku untukdef?
.sumber
Jelly , 11 byte
TryItOnline
Pertama 50
Terlalu lambat untuk kasus uji besar.
Bagaimana?
sumber
R⁵*
sebagai setara kiri ke kanan tetapi kemudian melihat garis lurus yang bagus :)PHP, 76 byte
(Edit -1 byte - Terima kasih user59178 - solusi Anda bahkan lebih baik)
sumber
$c=blah
ke bagian pertamafor(;;)
MATL, 19 byte
Cobalah secara Online!
Penjelasan
sumber
Groovy, 87 Bytes
Ini kurang menyakitkan daripada yang saya perkirakan, dan didasarkan pada jawaban saya di sini :
Penjelasan
1.0g
- Gunakan notasi BigDecimal untuk yang satu..divide(n, n, 1)+""
- Membagi dengan n dengan n presisi (fungsi BigDecimal saja) dan mengkonversi ke str.(...)[2..x+1].getChars()
- Dapatkan substring dari iterasi saat ini sebagai array char..sum()-48*(x)
- Jumlahkan nilai ASCII dari karakter dan kurangi sebesar 48 untuk setiap elemen. Ini mengubah nilai dari angka ASCII ke Integer yang pada dasarnya menghemat byte*.toInteger()
.(1..n).collect{...}.sum()
- Ulangi setiap digit di divisi, lakukan fungsi ini, dapatkan semuanya dalam satu array dan jumlah.Disimpan 2 Bytes dan Efisiensi Pengorbanan ...
Ini adalah versi yang lebih efisien yang tidak menghitung ulang BigDecimal setiap iterasi.
sumber
J, 27 byte
Pemakaian
Inputnya adalah integer yang diperluas.
Performanya bagus dan hanya membutuhkan sekitar 3 detik untuk menghitung untuk kasus uji besar.
Penjelasan
sumber
Jelly , 10 byte
Bukan pendekatan terpendek , tetapi cukup efisien. Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Python 2, 90 byte
Tidak cantik, tetapi dilakukan dengan membagi float kemudian mengkonversi ke string dan kemudian seleksi indeks string iteratif untuk mendapatkan segitiga angka, kemudian melakukan pemahaman daftar dan mengkonversi masing-masing char ke int dan akhirnya menjumlahkan mereka semua.
sumber
JavaScript (ES6), 47 byte
Bagaimana itu bekerja
Jawaban ini menunjukkan teknik untuk menghitung c angka desimal dari a / b :
Ini akan menjadi titik awal yang sangat baik untuk tantangan ini. Pertama kita dapat mengubahnya sedikit sehingga menghitung b angka desimal 1 / b , dengan menyusun ulang parameter dan menetapkan default:
Selanjutnya kita dapat mengubah ini sehingga menghitung jumlah dari angka desimal b pertama, alih-alih menggabungkannya (ini menghilangkan
d
parameternya):Kami hampir mencapai solusi; sekarang kita hanya perlu membuatnya mengalikan setiap digit dengan c + 1 :
Hmm, ini sepertinya agak lama. Bagaimana jika kita menambahkan c dengan 1 sebagai permulaan?
Itu menghemat satu byte. Dan inilah cara untuk menyimpan satu lagi:
Dan sekarang kita punya jawaban.
f(7)
adalah 103,f(11)
apakah 270,f(1)
apakah ... 2? Oh, kami lupa memperhitungkan kasus di mana a / b adalah 1 pada iterasi pertama (yaitu b adalah 1). Mari kita lakukan sesuatu tentang ini:1 mod b selalu 1 , kecuali b adalah 1 , dalam hal ini akan menjadi 0 . Program kami sekarang benar untuk semua input, pada 47 byte .
sumber
Python 2, 49 byte
Uji di Ideone .
sumber
C, 53 byte
Di bawah utama untuk melakukan beberapa tes ...
sumber
f(n,i,x,s){while(i)x=10*(x%n),s+=i--*(x/n);return s;}
hanya sepanjang 53 byte.