Diberikan input n
, tulis program atau fungsi yang menghasilkan / mengembalikan jumlah jumlah digital dari n
semua basis 1 ke n
.
Contoh:
n = 5
Buat rentang [1...n]
:[1,2,3,4,5]
Untuk setiap elemen x
, dapatkan array dari x
digit-digit dasar n
: [[1,1,1,1,1],[1,0,1],[1,2],[1,1],[1,0]]
base- 1
of bijective 5
adalah[1,1,1,1,1]
base- 2
(binary) dari 5
is[1,0,1]
dasar- 3
dari 5
is[1,2]
dasar- 4
dari 5
is[1,1]
dasar- 5
dari 5
is[1,0]
Jumlahkan angka: 13
Kasus uji:
1 1
2 3
3 6
4 8
5 13
6 16
7 23
8 25
9 30
10 35
36 297
37 334
64 883
65 932
Urutannya dapat ditemukan di OEIS: A131383
Mencetak:
code-golf : Kiriman dengan skor terendah menang.
227 -> 9999
. Dan juga:1383 -> 345678
.Jawaban:
Kanvas , 3 byte
Coba di sini!
Kanvas mengalahkan Jelly?
sumber
Haskell , 46 byte
Cobalah online!
Penjelasan
Fungsi[ 0 ... b ]n
\b n -> mapM(pure[0..b])[1..n]
, menghasilkan semua string dalam urutan leksikografis. Sebagai contoh:Dengan mengindeks ke dalamnya dengan1 ( n + 1 ) 1 [ 1 , … , 1 ⏟ n kali ] [ n ]( N + 1 ) 1 [ 1 , ... , 1n kali] [ n ]
(!!n)
ini dapat digunakan untuk mengkonversin
ke basisb+1
, namun ini tidak akan bekerja untuk unary ( basis- ), tetapi kami menjumlahkan hasilnya .. Kami bahkan dapat menyimpan beberapa byte dengan dan menggunakan basis- daripada mencari-cari basis- karena kita kehilangan yang sama dengan saat menjumlahkan.a <- [1..n]
Menggunakan
do
-notation hanya menggabungkan semua daftar alih-alih bersarang:sumber
APL (Dyalog Unicode) , 14 byte
Cobalah online!
Penjelasan
Beberapa tanda kurung tersirat dan dapat ditambahkan (lebih ringan dari tanda kurung "resmi"):
Ini adalah puncak monadik. Diberikan argumen
Y
, fungsi ini berperilaku seperti:Dua fungsi diterapkan secara berurutan. Kami akan mulai dari yang benar:
Ada tiga fungsi di kereta ini, jadi ini garpu. Diberikan argumen
Y
, itu bertindak sebagai:Kita dapat dengan mudah mengurangi hal ini (monadik
⊢
mengembalikan argumennya, karenanya disebut identitas ):Sekarang, kita tahu bahwa itu
Y
adalah bilangan bulat (skalar sederhana, yaitu angka atau karakter), karena kita diberi satu. Karena itu⍳Y
, dengan⎕IO=1
, pengembalian1 2 ... Y
.⍳Y
sebenarnya mengembalikan array dengan bentukY
(Y
harus vektor), di mana setiap skalar adalah indeks dari dirinya sendiri dalam array (itu sebabnya monadik⍳
disebut generator indeks ). Indeks-indeks ini adalah vektor, kecuali untuk kasus di mana1≡⍴Y
, di mana mereka adalah skalar (ini adalah kasus kami).Mari kita parsing fungsi tengah
(⍴⊤⊣)¨
,, selanjutnya.⍴⊤⊣
adalah operan dari¨
( masing-masing ), dan fungsinya adalah diadik, sehingga¨
operator akan terlebih dahulu membentuk kembali setiap argumen panjang-1 ke bentuk yang lain (yaitu, mengambil elemen dan menggunakannya untuk mengganti setiap skalar dalam argumen lain) , dan lalu terapkan fungsi untuk setiap pasangan dari dua argumen. Dalam hal ini,⍳Y
adalah vektor danY
skalar, jadi, jikan≡⍴⍳Y
, makaY
akan dikonversi menjadin⍴Y
(⍴
mewakili bentuk (monadik) dan membentuk kembali fungsi (dyadic)). Artinya, secara lebih sederhana,Y
akan dikonversi ke array yang berisiY
waktuY
.Sekarang, untuk setiap pasangan, sebut saja argumen kiri
X
dan kananZ
(agar kita tidak bertentangan dengan inputY
).⍴⊤⊣
adalah garpu diad, sehingga akan diperluas ke:Mari kita buat langkah pertama yang mudah
X⊣Z
untuk mengurangi menjadiX
(diad⊣
adalah fungsi kiri ):TheX, Z∈ N , XZ ( X dalam basis Z ) tidak boleh memiliki lebih dari X digit, karena X1 memiliki X digit. Karena itu,
⍴
dalamX⍴Z
adalah, sekali lagi, membentuk kembali fungsi, sehinggaX⍴Z
, dalam kasus kami, hanyaX
kaliZ
.⊤
adalah fungsi encode . Diberikan dua array angka, di mana array kiri adalah basis dari setiap digit dalam hasil (tidak perlu bilangan bulat atau positif), yaitu pengkodean, dan kanan adalah array angka, mengembalikan array yang ditransposisikan dari mereka angka dalam pengkodean yang ditentukan (transposisi adalah pembalikan dimensi array relatif terhadap elemen-elemennya). Representasi digit didasarkan pada hasil bagi dari pembagian angka dan produk dari basis yang kurang signifikan. Jika ada pangkalan0
, ia bertindak sebagai basis + ∞. Skalaral argumen semuanya sederhana. KarenaX
bilangan bulat positif, danX⍴Z
adalah vektor elemen yang sama, ini benar-benar hanya kasus konversiX
ke basisZ
dan membentuk kembali keX
angka. UntukX⍴Z
sudah cukup untuk keperluan kita.Y(⍴⊤⊣)¨⍳Y
Oleh karena itu, hasilnyaY
dikonversi ke setiap basis dari 1 hinggaY
, mungkin dengan nol di depan. Namun, ada satu masalah: di APL, basis 1 tidak khusus, sementara tantangan ini khusus, jadi kita harus memasukkan jumlah digit basis-1 dariY
diri kita sendiri. Untungnya, jumlah ini hanyaY
, karenaY
suatu tempat ke dalam array. Beginilah Cara kita melakukanya:Saya sudah memasukkan bagian ini di sini. Dyadic
,
adalah fungsi catenate , ia menggabungkan argumennya pada sumbu terakhir mereka, dan kesalahan jika itu tidak mungkin. Di sini, kita cukup menggabungkan skalarY
ke vektorY(⍴⊤⊣)¨⍳Y
, sehingga kita menambah jumlah yang akan kita hitungY
, seperti dijelaskan di atas.Bagian akhir adalah fungsi kiri atas kami,
+/∘∊
:∘
adalah operator menulis .f∘g Y
sama denganf g Y
. Namun, kami menggunakannya di sini sehingga kereta kami tidak membayar pada∊
. Jadi, kita dapat mengurangi:Sekarang, waktunya untuk penjumlahan, tapi tunggu ... ada masalah. Array tidak rata, jadi kita tidak bisa menjumlahkan elemen-elemennya sebelum meratakannya terlebih dahulu. The Terdaftar fungsi
∊
merata array. Sekarang array telah diratakan, akhirnya kita gunakan+/
untuk menjumlahkannya./
adalah mengurangi operator, berlaku fungsi diad antara unsur-unsur array pada kedua-untuk-terakhir porosnya, dengan prioritas kanan-ke-kiri. Jika peringkat (jumlah dimensi, yaitu panjang bentuk) dari array tidak berkurang, array kemudian ditutup, meskipun ini tidak terjadi di sini. Fungsi yang diterapkan di sini adalah+
, yang merupakan plusfungsi yang menambahkan pasangan pada sumbu terakhir dari dua array (dan kesalahan jika array tidak dapat ditambahkan seperti itu). Di sini, ia hanya menambahkan dua angka beberapa kali sehingga pengurangan selesai.Lihatlah, kereta kami:
sumber
+/∘∊⊢,⊢⊤¨⍨⊢⍴¨⍳
Ruby ,
3937Satu-satunya golf di sini adalah menghilangkan spasi. Cobalah online
sumber
n
(37b):->n{(2..n).sum{|b|n.digits(b).sum}+n}
Python 2 , 57 byte
Cobalah online!
sumber
Java 8,
7665 byte-11 byte terima kasih kepada @ OlivierGrégoire .
Cobalah online.
Penjelasan:
sumber
i
, jadi ... 65 byte.Desmos, 127 byte
Desmos, 56 byte
sumber
^n
seharusnya sudah cukup.\sum_{b=2}^{n+1}
untukn+\sum_{b=2}^n
menyimpan 2 byte lagiSAS,
8174 byteMasukan dimasukkan setelah
cards;
pernyataan, pada baris baru, seperti:Keluaran dataset yang berisi jawaban
s
(bersama dengan variabel pembantu), dengan baris untuk setiap nilai inputTidak Disatukan:
sumber
Japt
-x
, 6 byteCobalah
Cobalah
sumber
J ,
2423 byteCobalah online!
sumber
05AB1E (warisan) , 5 byte
Cobalah online!
Penjelasan:
Dalam 05AB1E (warisan), basis 1 dari 5 adalah [0,0,0,0,0], bukan [1,1,1,1,1]. Karena itu setelah menjumlahkan rentang, tambahkan input ke akun untuk basis 1 yang hilang.
Saya menggunakan 05AB1E (warisan) karena pada 05AB1E saat ini, basis 1 dari 5 adalah [1]. Untuk menjelaskan ini, saya perlu mengurangi hasil dengan 1 atau menghapus elemen pertama dari rentang, yang keduanya akan menelan biaya 1 byte.
sumber
Perl 6 ,
4541 byte-4 byte terima kasih kepada Jo King
Cobalah online!
sumber
Spasi , 153 byte
Huruf
S
(spasi),T
(tab), danN
(baris baru) ditambahkan hanya sebagai penyorotan.[..._some_action]
ditambahkan sebagai penjelasan saja.Cobalah online (dengan spasi, tab, dan hanya baris baru).
Port of Java 8 saya menjawab , karena Whitespace tidak memiliki builtin Base konversi sama sekali.
Contoh dijalankan:
input = 3
Program berhenti dengan kesalahan: Tidak ditemukan jalan keluar. (Meskipun saya bisa menambahkan tiga baris tambahan
NNN
untuk menghilangkan kesalahan itu.)sumber
R , 60 byte
Cobalah online!
Gagal
n>143
karena144^144
lebih besar dari yangdouble
bisa didapat. Terima kasih kepada Josh Eller karena menyarankan penggantianlog(n,i)
dengan sederhanan
.Di bawah ini akan berfungsi untuk
n>143
; tidak yakin pada titik mana ia akan berhenti bekerja.R , 67 byte
Cobalah online!
Gunakan
n%/%i^(0:log(n,i))%%i
metode klasik untuk mengekstraksii
digitn
basis untuk setiap basisb>1
, lalu menjumlahkannya dan mengakumulasikan jumlahF
, yang diinisialisasi0
, kemudian menambahkann
(1
representasi basisn
) keF
dan mengembalikan hasilnya. Untukn=1
, itu melompat dasar dan hanya menambahkann
untukF
.sumber
0:log(n,i)
, tidak bisakah Anda menggunakan0:n
? Akan selalu ada paling banyak n digit dalam representasi basis apa pun dari n, dan semuanya setelahlog(n,i)
digit awal harus 0, sehingga tidak akan memengaruhi jumlah.n=144
, karena143^143
ada1.6e308
dan144^144
dievaluasiInf
. Terima kasih!Python 2 , 61 byte
Cobalah online!
Meskipun ini adalah solusi Dennis yang lebih lama dari yang didasarkan, saya menemukan metode terlalu lucu untuk tidak berbagi.
Tujuannya adalah untuk melakukan pengulangan pada saat memotong digit terakhir
n->n/b
dan menambah basisb->b+1
, tetapi kami ingin mencegah kenaikan basis setelah satu atau lebih digit dikunci. Hal ini dicapai dengan menjadikan baseb
sebagai float, sehingga setelah pembaruann->n//b
, floatb
menginfeksin
dengan floatness-nya. Dengan cara ini, apakahn
float atau tidak adalah flag-bit untuk apakah kami telah menghapus digit apa pun darin
.Kami mensyaratkan bahwa kondisi
1/n==0
terpenuhi untuk berulang menjadi incrementingb
, yangn
memuaskan bilangan bulat karena pembagian lantai dilakukan, tetapi mengapung gagal. (n=1
juga gagal tetapi kita tetap tidak ingin mengulanginya.) Jika tidak, float berfungsi seperti bilangan bulat dalam fungsi karena kita berhati-hati untuk melakukan pembagian lantain//b
, dan hasilnya adalah float bilangan bulat .sumber
C (gcc),
6756 bytePort of Java 8 saya jawab .
-11 byte berkat golf @ OlivierGrégoire pada jawaban Java saya.
Cobalah online.
Penjelasan:
sumber
JavaScript (ES6), 42 byte
Versi ini hampir identik dengan jawaban utama saya tetapi bergantung pada aritmatika underflow untuk menghentikan rekursi. Nilai yang didukung tertinggi tergantung pada ukuran tumpukan panggilan.
Cobalah online!
JavaScript (ES6),
51 4844 byteCobalah online!
Berkomentar
sumber
APL (Dyalog Unicode) , 22 byte
Cobalah online!
sumber
Sekam , 6 byte
Saya benar-benar berharap ada sesuatu seperti
M
untukcmap
:(Cobalah online atau uji semua!
Penjelasan
Atau, 6 byte
Cobalah online atau uji semua!
Penjelasan
sumber
Pari / GP , 30 byte
Cobalah online!
sumber
Jelly , 4 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Attache , 25 byte
Cobalah online!
Penjelasan
sumber
Arang , 12 byte
sumber
Retina 0.8.2 , 49 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Konversikan ke unary.
Gunakan divmod berulang untuk mengkonversi nomor asli ke setiap basis.
Hapus daftar pangkalan, hanya menyisakan digit konversi basis.
Ambil jumlah dan konversikan ke desimal.
sumber
Desmos, 51 byte
Terinspirasi oleh jawaban Conor O'Brien dan melihat entri-OEIS saya datang dengan solusi Desmos saya sendiri:
Cobalah online!
sumber
APL (NARS), 29 karakter, 58 byte
sedikit tes tentang cara menggunakan:
sumber