Pertimbangkan digit setiap basis integral di atas yang tercantum dalam urutan. Membagi mereka tepat menjadi dua berulang-ulang sampai setiap potongan digit memiliki panjang ganjil:
Base Digits Subdivided Digit Chunks
2 01 0 1
3 012 012
4 0123 0 1 2 3
5 01234 01234
6 012345 012 345
7 0123456 0123456
8 01234567 0 1 2 3 4 5 6 7
9 012345678 012345678
10 0123456789 01234 56789
11 0123456789A 0123456789A
12 0123456789AB 012 345 678 9AB
...
16 0123456789ABCDEF 0 1 2 3 4 5 6 7 8 9 A B C D E F
...
Sekarang, untuk setiap baris dalam tabel ini, baca potongan digit yang dibagi sebagai angka di dasar baris itu, dan jumlahkan. Berikan hasilnya di base 10 untuk kenyamanan.
Sebagai contoh...
- untuk base 3 hanya ada satu nomor untuk dijumlahkan: 012 3 = 12 3 = 5 10
- untuk base 4 ada 4 angka untuk dijumlahkan: 0 4 + 1 4 + 2 4 + 3 4 = 12 4 = 6 10
- base 6: 012 6 + 345 6 = 401 6 = 145 10
- base 11: 0123456789A 11 = 2853116705 10
Tantangan
Tulis program yang menggunakan bilangan bulat lebih besar dari satu sebagai basis dan melakukan prosedur pembagian jumlah ini, mengeluarkan jumlah akhir dalam basis 10 . (Jadi jika input adalah 3
output 5
, jika input adalah 6
output 145
, dll.)
Entah menulis fungsi yang mengambil dan mengembalikan integer (atau string karena jumlahnya bisa cukup besar) atau menggunakan stdin / stdout untuk memasukkan dan menampilkan nilai.
Kode terpendek dalam byte menang.
Catatan
- Anda dapat menggunakan fungsi konversi basis bawaan atau yang diimpor.
- Tidak ada batas atas nilai input (selain masuk akal
Int.Max
). Nilai input tidak berhenti di 36 hanya karena "Z" berhenti di sana .
Jawaban:
CJam,
1715Bekerja jika ada baris tambahan di input.
Versi yang lebih jelas bagi mereka yang tidak tahu
x & -x
:Bagaimana itu bekerja
sumber
x & -x
sangat pintar.Python,
8278Hah?
Jumlah kelompok digit yang dihasilkan oleh subdivison, G , hanyalah kekuatan terbesar dari dua yang membagi jumlah digit (yaitu basis), b . Ini diberikan oleh G = b ^ (b & (b - 1)) , di mana ^ adalah bitwise-XOR. Jika Anda terbiasa dengan fakta bahwa n adalah kekuatan dua iff n & (n - 1) = 0 maka itu harus cukup mudah untuk melihat alasannya. Jika tidak, selesaikan beberapa kasus (dalam biner) dan itu akan menjadi jelas.
Jumlah digit per kelompok, g , hanya b / G .
Grup digit pertama, 012 ... (g-1) , sebagai angka dalam basis b , adalah .
Grup berikutnya, g (g + 1) ... (2g-1) , sebagai angka dalam basis b , adalah jumlah .
Lebih umum, n kelompok -th (zero-based), sebagai nomor dalam basis b , a n , adalah .
Ingatlah bahwa ada kelompok G , maka jumlah semua kelompok adalah
yang dihitung oleh program.
sumber
~
:b/G-i-1
bisab/g+~i
dan(G-1)*b/2
bisa~-G*b/2
CJam (snapshot), 19 byte
Perhatikan bahwa rilis stabil terbaru (0.6.2) memiliki bug yang dapat menyebabkan
mf
mengembalikan bilangan bulat bukan Longs. Cukup paradoks, ini dapat dielakkan dengan casting ke integer (:i
).Untuk menjalankan ini dengan CJam 0.6.2 (mis., Dengan penerjemah online ), Anda harus menggunakan kode berikut:
Atau, Anda dapat mengunduh dan membuat snapshot terbaru dengan menjalankan perintah berikut:
Uji kasus
Bagaimana itu bekerja
sumber
Haskell,
746955contoh:
sumber
CJam, 41 byte
Ini pada dasarnya adalah solusi Ell di CJam:
Cobalah online di sini
Kiriman asli saya:
Tidak berfungsi dengan benar untuk basis 11 ke atas
Akan mencoba untuk melihat apakah saya bisa membuatnya bekerja untuk basis 11 dan di atas, tanpa menambah ukuran.
sumber
Mathematica, 114 byte (atau 72 byte)
Hm, ini lebih lama dari yang saya kira:
Dan ungolfed:
Atau, jika saya hanya mem-porting rumus bagus Ell, itu 72 byte:
sumber
J - 22 char
Berfungsi mengambil argumen tunggal (sebut saja
y
untuk keperluan golf ini) di sebelah kanan.Pertama kita gunakan
1&q:
untuk mendapatkan jumlah berapa kaliy
dibagi 2, dan kemudian bagi-y
2 sebanyak itu. Ini memberi kita negatif dari lebar yang kita perlu untuk membagi hal-hal menjadi, yang sempurna, karena]\
akan mengambil potongan tumpang tindih jika argumennya positif, dan non-tumpang tindih jika itu negatif.Jadi kemudian kita berpisah
i.y
— bilangan bulat dari 0 ke —y-1
menjadi vektor dengan lebar ini, dan gunakan#.
untuk mengubahnya dari basisy
ke basis 10. Akhirnya,+/
lakukan penjumlahan, dan kita selesai.Contoh: (input pada J REPL diindentasi, output rata rata)
sumber
JavaScript,
9989 byteatau
Fungsi kedua mirip dengan fungsi Ell. Yang pertama menggunakan pendekatan yang lebih tradisional. Keduanya berukuran 89 karakter.
Coba di sini: http://jsfiddle.net/wndv1zz8/1/
sumber
Jelly ,
109 byteCobalah online!
Pada dasarnya hanya terjemahan jawaban CJam jimmy23013, kecuali menggunakan
n & -n
langsung sebagai jumlah potongan untuk dipecah menjadi.(Tidak
ð
ada hubungannya dengan pemetaan:ḅ
hanya vektorisasi atas argumen kirinya, danð
ada untuk memisahkanḅS
sebagai rantai diad baru yang mengambil hasilḶœsÇ
sebagai argumen kiri dan argumen ke tautan utama sebagai argumen kanannya.)sumber