Root digital (juga jumlah digital yang diulang) dari bilangan bulat positif adalah nilai (satu digit) yang diperoleh dengan proses iteratif menjumlahkan digit, pada setiap iterasi menggunakan hasil dari iterasi sebelumnya untuk menghitung jumlah digit. Proses berlanjut hingga nomor satu digit tercapai.
Sebagai contoh, root digital 65536 adalah 7 , karena 6 + 5 + 5 + 3 + 6 = 25 dan 2 + 5 = 7 .
Menyortir semua akar digital tidak masuk akal, karena hanya akan dimulai dengan banyak 1 detik.
Sebagai gantinya, kami akan membuat daftar semua bilangan bulat tunggal beserta akar digitalnya, lalu semua angka dua digit beserta akar digitalnya, lalu rangkap tiga, empat kali lipat dan seterusnya.
Sekarang, untuk masing-masing daftar tersebut, kami akan mengurutkannya sehingga semua bilangan bulat dengan akar digital 1 muncul terlebih dahulu, lalu semua bilangan bulat dengan akar digital 2 dan seterusnya. Penyortiran akan stabil, sehingga daftar bilangan bulat dengan akar digital tertentu harus dalam urutan naik setelah penyortiran.
Akhirnya kami akan menggabungkan daftar ini menjadi satu urutan tunggal. Urutan ini akan mulai dengan semua angka satu digit, lalu semua angka dua digit (diurutkan berdasarkan akar digitalnya), lalu semua angka tiga digit dan seterusnya.
Tantangan:
Ambil bilangan bulat positif n sebagai input, dan hasilkan angka ke - n dalam urutan yang dijelaskan di atas. Anda dapat memilih jika daftar tersebut adalah 0 -indeks dari 1 -indeks.
Urutannya seperti ini:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 28, 37, 46, 55, 64, 73, 82, 91, 11, 20, 29 ...
72, 81, 90, 99, 100, 109, 118, ...
981, 990, 999, 1000, 1009, 1018, 1027, ...
Kasus uji:
Kasus uji diindeks 1.
n f(n)
9 9
10 10
11 19
40 13
41 22
42 31
43 40
44 49
45 58
600 105
601 114
602 123
603 132
604 141
605 150
4050 1453
4051 1462
4052 1471
4053 1480
4054 1489
4055 1498
Lebih mudah disalin:
n = 9, 10, 11, 40, 41, 42, 43, 44, 45, 600, 601, 602, 603, 604, 605, 4050, 4051, 4052, 4053, 4054, 4055,
f(n) = 9, 10, 19, 13, 22, 31, 40, 49, 58, 105, 114, 123, 132, 141, 150, 1453, 1462, 1471, 1480, 1489, 1498
Klarifikasi:
- Anda tidak boleh menampilkan semua n elemen pertama. Anda hanya akan menampilkan tanggal n .
- Secara teoritis kode harus bekerja untuk semua bilangan bulat hingga 10 ^ 9 , tetapi tidak apa-apa jika habis pada TIO (atau penerjemah lain dengan batasan waktu) untuk input yang lebih besar dari 999 .
- Penjelasan didorong.
Ini kode-golf , jadi kode terpendek di setiap bahasa menang! Jangan berkecil hati dengan solusi lain dalam bahasa yang Anda inginkan untuk bermain golf, bahkan jika mereka lebih pendek dari yang Anda bisa kelola!
Jawaban:
Python 2 ,
7860524645 byte-6 byte berkat GB .
-1 byte terima kasih kepada Jakob .
Cobalah online!
Akhirnya mencapai bentuk tertutup, 1-diindeks.
Python 2 , 78 byte
Diindeks 0.
Cobalah online!
sumber
Python 3 , 80 byte
Cobalah online!
1-diindeks. Ini adalah yang terbaik yang bisa saya kelola di Python 3 (well, kecuali untuk byter 78 , yang merupakan port dari solusi Python 2 saya di bawah ini; saya pikir yang ini jauh lebih keren, sih). Program penuh Python 2 diuntungkan untuk tantangan khusus ini, karena
input()
kebutuhan konversi keint
dalam Python 3 (+5 byte),exec
adalah fungsi, bukan pernyataan (+2 byte) dan/
melakukan pembagian integer secara default jika argumennya adalah integer dalam Py 2 (+1 byte), jadi ini pasti lebih pendek dari jawaban porting ovs .Bagaimana itu bekerja
Mendirikan
Ini mendefinisikan fungsi rekursif f yang mengambil satu argumen integer i dan yang lain, k , yang default ke 1 . Sementara k ≤ i , fungsi f mengembalikan f (i, 10k) , mengalikan k dengan 10 setiap kali hingga menjadi lebih besar dari i .
Rentang target dan pengindeksan yang benar
Setelah rangkaian operasi ini, kita pergi dengan i , input awal dan variabel k yang mewakili kekuatan terkecil 10 lebih besar dari i . Dengan cara ini, kami dapat menghasilkan kisaran (bilangan bulat) [lantai (k / 10), k) , yang pada dasarnya mencakup semua bilangan bulat yang:
Karena kita mengabaikan bilangan bulat yang lebih kecil dari x = lantai (k / 10) , kita harus menggeser pengindeksan sehingga kita menghitung angka yang hilang. Cara yang jelas adalah dengan mengurangi jumlah mereka, x , dari i , sehingga kita indeks ke dalam daftar (setelah pengurutan, yang dijelaskan di bawah), oleh karena itu memiliki ix . Namun, karena daftar berisi 9k / 10 , item, dan pengindeksan dalam daftar di indeks -y untuk beberapa y positif menghasilkan elemen ke- y dari akhir dengan Python, ini hanya setara dengan pengindeksan dengan ik , sehingga menghemat 4 byte.
Menyortir setiap potongan berdasarkan root digital
Rumus untuk fungsi root digital adalah 1 + ((n-1) mod 9) (lihat bagian rumus Kesesuaian dari artikel Wikipedia ini ). Karena 1 cara ini akan ditambahkan ke masing-masing, itu berlebihan ketika menyortir, jadi kita pergi dengan (n-1) mod 9 . Cara
%
operator Python bekerja ketika diberi angka negatif pada RHS sangat mudah, karena kita dapat menggunakan n pymod -9 sebagai gantinya untuk menyimpan byte anther.Python 2 , 72 byte
Terinspirasi oleh pengajuan Chas Brown .
Cobalah online!
sumber
Python 2 ,
737170 byteCobalah online!
2 byte thx ke Tn. XCoder ; dan 1 byte thx ke H.PWiz .
Ini diindeks 0.
sumber
i%9
seharusnya sudah cukup daripadai%9+1
... dengan cara ini Anda mengalahkan 72 byter saya: DD:len(`~i`)
harus bekerjaJelly ,
15 14 109 byteCobalah online!
Bagaimana?
Menggunakan versi golf dari solusi bentuk tertutup yang dibuat oleh ovs dalam jawaban Python mereka ...
Rumus yang diekspos oleh ovs adalah: 9 * (n% b) + (n / b) + b - 1 di mana b = 10 lantai (log (n, 10))
Sekarang jika c adalah jumlah digit desimal n maka b-1 adalah c-1 nines dalam desimal.
Ini sama dengan sembilan kali nilai c-1 dalam desimal (misalnya
111*9=999
).Selanjutnya n / b adalah digit terdepan dari n dan n% b adalah sisa digit sebagai angka desimal.
Rumus seperti b * x + y dapat diimplementasikan sebagai konversi dari
[x,y]
dari basis b(yaitu b ^ 1 * x + b ^ 0 * y = b * x + y )
Dengan demikian kita dapat mengambil angka, n (misalnya
7045
), membaginya menjadi digit terdepan dan tertinggal, menempatkan digit terdepan di akhir ([[0,4,5],7]
), menambahkan satu ke semua digit item pertama untuk memenuhi penambahan b-1 ([[1,5,6],7]
) mengonversi ini dari daftar desimal ke integer ([156,7]
), dan mengonversi itu dari basis sembilan (1411
).Dalam implementasi di bawah ini kami menambahkan satu ke semua digit dari kedua item saat memenuhi b-1 (
[[0,4,5],8]
), konversikan dari daftar desimal ke integer ([156,8]
), konversikan dari basis sembilan (1412
) dan kemudian kurangi dengan yang ditambahkan oleh proses ini (1411
).Sebelumnya, 14 byter:
Cobalah online!
Yang ini membangun daftar hingga kekuatan 10 di atas input dengan mengurutkan angka-angka alami ini
[digitalRoot, digitCount]
kemudian menemukan nilai pada indeks yang dimasukkan.sumber
Haskell ,
9488 byteCobalah online! Diindeks 0.
Penjelasan:
Pemahaman daftar menghasilkan urutan sebagai daftar tak terbatas di mana kami indeks dengan
!!
:x
kurang dari jumlah digit saat ini dan diambil dari daftar tak terbatas[0,1,2,3, ...]
i
iterates pada rentang dari1
ke9
dan digunakan untuk menyortir oleh akar digitaln
iterates atas semua angka denganx+1
digituntil(<10)(sum.map(read.pure).show)
menghitung root digital ( lihat di sini untuk penjelasan )n
ditambahkan ke daftar jika akar digitalnya samai
.sumber
Retina , 65 byte
Cobalah online! 1-diindeks. Penjelasan:
Buat daftar garis
_
s dari 0 hingga pangkat 10 berikutnya (eksklusif).Urutkan semuanya dalam urutan root digital.
Konversi dari unary ke desimal.
Urutkan sesuai urutan panjangnya.
Ekstrak
n
elemen th.sumber
Pyth ,
36 31 25 24 2322 byte1-diindeks.
Suite uji!
Cara kerjanya (ketinggalan jaman)
sumber
05AB1E ,
1911 bytePelabuhan jawaban Python saya .
-6 byte (!) Terima kasih kepada Kevin Cruijssen .
Cobalah online!
sumber
g<°©÷¹®%9*®O<
. Di sini penjelasan yang akan saya posting untuk itu .Pyth , 23 byte
Coba di sini.
-3 Terima kasih kepada Tn. Xcoder
1-diindeks.
sumber
Perl 6 ,
6858 byteUji berdasarkan 0
Uji berdasarkan 1
Diperluas:
sumber
Ruby ,
4338 byteCobalah online!
Awalnya port jawaban Python yang sangat baik oleh ovs, kemudian disederhanakan lagi.
sumber
Java 8, 68 byte
Membosankan port jawaban Python 2 @ovs ' , jadi pastikan untuk mengungguli dia!
-1 byte terima kasih kepada @Jakob
Cobalah online.
sumber
K4 , 38 byte
Larutan:
Contoh:
Penjelasan:
Solusi Port of Jonathan Allan saat saya kehabisan memori membangun akar digital dari 1 hingga 1e9.
Bonus:
Terjemahan solusi ovs lebih sederhana tetapi lebih lama:
sumber
Jelly , 19 byte
Cobalah online!
-1 terima kasih kepada Tn. Xcoder . .
1-diindeks.
sumber
J, 24 byte
Ini diam-diam ekspresi dibungkus dalam parens untuk menandakan bahwa itu harus diperlakukan sendiri bukan sebagai bagian dari ekspresi berikut (seperti argumen).
Ungkapan '] /:' pesanan (naik '/:') array asli ']' dengan jumlah '+ /' dari digit Ekspresi
mengonversi angka menjadi vektor karakter dengan '":', lalu menerapkan kebalikannya '".' - karakter ke nomor - diterapkan ke setiap item '&>'. Jadi, 65536 -> '65536' -> 6 5 5 3 6.
Sambungan daya '^:' di dekat akhir ekspresi menerapkan kode yang baru saja kami jelaskan (di sebelah kiri) beberapa kali. Dalam hal ini, jumlah waktu yang ditentukan adalah tak terhingga '_' yang berarti tetap menerapkan sampai hasilnya berhenti berubah.
'' 0 'akhir berarti menerapkan seluruh ekspresi di sebelah kiri untuk setiap item skalar (0-dimensi) di sebelah kanan, yang akan menjadi array angka yang ingin kita terapkan ini.
sumber
Elixir , 239 byte
Cobalah online!
Penjelasan masuk (perlahan)! Saya tidak berpikir ini bisa menjadi jauh lebih pendek dari ini, tetapi saya selalu terbuka untuk saran
sumber
Perl 5
-pF
, 27 byteCobalah online!
Menggunakan formula @ ovs dan penjelasan @ JonathanAllen untuk menghasilkan potongan kode yang bagus.
sumber