Memasukkan:
Bilangan bulat positif n yang terdiri dari angka dalam kisaran 0-9 .
Tantangan:
Jika d adalah digit tertinggi dalam bilangan bulat, anggap pangkalan angka tersebut adalah d +1 . Misalnya jika bilangan bulat adalah 1256 maka Anda harus menganggap itu dalam basis-7 , jika itu 10110 maka Anda harus menganggap itu basis-2 (biner), dan jika 159 maka itu adalah desimal.
Sekarang, lakukan hal berikut sampai Anda, 1: mencapai integer basis-10 , atau 2: mencapai integer satu digit.
- Konversikan bilangan bulat dari basis- (d + 1) ke basis-10
- Temukan basis dari integer baru ini (sekali lagi, base- (d + 1) di mana d adalah digit tertinggi dalam angka baru)
- Lanjutkan ke langkah 1 .
Contoh:
Asumsikan inputnya adalah n = 413574 . Digit tertinggi d = 7 , jadi ini adalah base-8 (oktal). Ubah ini menjadi desimal dan dapatkan 137084 . Digit tertinggi d = 8 , jadi ini adalah base-9 . Ubah ini menjadi desimal dan dapatkan 83911 . Digit tertinggi adalah 9 , jadi ini adalah angka desimal dan kami berhenti. Outputnya adalah 83911 .
Asumsikan inputnya adalah n = 13552 . Digit tertinggi adalah d = 5 , jadi ini adalah basis-6 . Ubah ini menjadi desimal dan dapatkan 2156 . Digit tertinggi d = 6 , jadi ini adalah base-7 . Ubah ini menjadi desimal dan dapatkan 776 . Digit tertinggi adalah d = 7 , jadi ini adalah basis-8 . Konversikan ke desimal dan dapatkan 510 . Digit tertinggi adalah d = 5 jadi ini adalah basis-6 . Ubah ini menjadi desimal dan dapatkan 186 . Digit tertinggi adalah 8 , jadi ini adalah base-9 . Ubah ini menjadi desimal dan dapatkan 159. Digit tertinggi adalah 9 , jadi ini adalah angka desimal dan kami berhenti. Outputnya adalah 159 .
Asumsikan inputnya adalah n = 17 . Ini akan memberi kita 15 , lalu 11 , lalu 3 , yang akan kita hasilkan karena itu satu digit.
Kasus uji:
5
5
17
3
999
999
87654321 (base-9 -> 42374116 in decimal -> base-7 -> 90419978 in decimal)
9041998
41253 (5505 -> 1265 -> 488 -> 404 -> 104 -> 29)
29
Catatan:
- Aturan standar tentang I / O, celah dll. Anda dapat mengambil input sebagai string
- Penjelasan didorong
- Anda dapat menggunakan perintah konversi konversi bawaan
- Solusi yang tidak menggunakan fungsi konversi basis bawaan bahasa (jika ada) diterima, bahkan jika mereka berakhir lebih lama daripada pendekatan yang jelas menggunakan fungsi builtin.
Rupanya, ini adalah OEIS A091047 .
sumber
Jawaban:
Mathematica, 56 byte
Cobalah online! (Menggunakan Matematika.)
Saya pikir saya akan memeriksa seperti apa urutannya:
Dan ini adalah plot jumlah langkah yang diperlukan untuk menemukan hasilnya:
(Klik untuk versi yang lebih besar. Lihat riwayat revisi untuk plot hanya hingga n = 1000. )
Tampak seperti campuran yang sangat menarik dari struktur skala besar dan kekacauan skala halus. Saya bertanya-tanya ada apa dengan kesenjangan yang lebih luas sekitar 30.000 dan 60.000.
sumber
9
, jadi mereka sudah ada di basis 10. Tapi untuk 30k dan 60k tampaknya angka dengan 8 atau bahkan 7 (harus check) di tempat 9 yang selalu menjadi basis 10 setelah paling banyak satu langkah.Java 8,
17216616315215114014011611699 byteMengambil input sebagai a
String
.-64 byte terima kasih kepada @ OlivierGrégoire . Dan di sini saya pikir 172 awal saya tidak terlalu buruk ..;)
Coba di sini.
Penjelasan:
sumber
s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}
. Juga saya menghapus sebagian besar komentar saya karena sama sekali tidak relevan sekarang (b
adalah basis, Andaa
; dans
adalah nomor yang sedang kami kerjakan).Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));
(88), tapi saya baru mengenal kode golf. Ini potongan, kan? Apakah ada cara untuk menyatakan ini sebagai metode tanpa perlu menambahkanpublic String c(String s)
?public
, tapi saya khawatir Anda memang harus menggunakanString c(String s){}
untuk panggilan rekursif, bahkan di Java 8. Ketika Anda membuat lambda menggunakanjava.util.function.Function<String, String> c=s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c.apply(""+b.valueOf(s,b));}
atau menggunakan antarmukainterface N{String c(String s);}N n = s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:n.c(""+b.valueOf(s,b));};
akan memberikan " referensi diri dalam initializer kesalahan "dalam kedua kasus. Namun pendekatan yang sangat bagus!Pyth, 9 byte
Suite uji
Penjelasan:
sumber
Q
danQ
, saya mengerti.u
tanpa input ketiga diterapkan hingga pengulangan, sedangkan dengan input ketiga diterapkan beberapa kali tetap.u
lambda memilikiG
danH
, tetapi Anda tidak perlu menggunakanH
.G
denganH
akan memiliki hasil yang sama ... btw variabel implisit adalahG
?G
, ya.H
dihitung dari 0 dengan setiap iterasi, sehingga sangat berbeda. Saya tidak begitu yakin apa yang Anda bicarakan. Berikut ini contoh program untuk menunjukkan kepada Anda apa yang terjadi: pyth.herokuapp.com/…JavaScript (ES6),
63 57 5453 byteDisimpan 8 byte berkat Shaggy dan Dom Hastings
sumber
+a>9||b<9
dan membalikkan terner.f=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Python 3 ,
91 78 76 7573 byte@Emigna mencukur 5 byte. @FelipeNardiBatista menyimpan 1 byte. @ RomanGräf menyimpan 2 byte
Cobalah online!
Penjelasan
sumber
05AB1E ,
105 byte5 byte disimpan berkat Magic Octopus Guci
Karena ini tumbuh lambat dengan sangat cepat untuk input besar, saya meninggalkan versi lama yang jauh lebih cepat di sini untuk pengujian. Algoritmanya sama, hanya jumlah iterasi yang berbeda.
Cobalah online!
Penjelasan
sumber
тFZ>ö§
? Melihat jumlah iterasi ( seperti yang terlihat di sini ) tampaknya dataran tinggi? Jika Anda ingin mendapatkan teknis, tingkat kenaikan iterasi mungkin adalah logaritmik ... Jadi Anda bisa menggunakan sesuatu seperti:DFZ>ö§
dan nyatakan itu tidak akan berjalan besarn
. ATAU bahkan mungkin:T.n>FZ>ö§
untuk secara langsung menghitung jumlah iterasi sebagailog_10(n)
.F§Z>ö
harus melakukan trik.§
.§
,Z
akan mengambil angka tertinggi di tumpukan alih-alih digit tertinggi di nomor di atas tumpukan.APL (Dyalog) ,
2016 byteMengambil dan mengembalikan string
(
...)⍣≡
terapkan fungsi berikut sampai dua istilah berturut-turut identik:⍎¨
mengeksekusi setiap karakter (mengubah string menjadi daftar angka)(
...)
terapkan fungsi tersembunyi berikut untuk itu:⌈/
temukan argumen maksimal1+
tambahkan satu⊢⊥⍨
mengevaluasi argumen di pangkalan itu⍕
format (stringify, sebagai persiapan untuk aplikasi fungsi luar lainnya)Cobalah online!
sumber
Ruby ,
6056 byteCobalah online!
sumber
Mathematica, 52 byte
Fungsi murni mengambil bilangan bulat negatif sebagai masukan dan mengembalikan bilangan bulat negatif. Menggunakan inti mekanik yang
FromDigits[s=IntegerDigits@#,Max@s+1]
sama dengan jawaban Jenny_mathy , tetapi mengeksploitasiFixedPoint
untuk melakukan iterasi.sumber
Perl 6 , 49 byte
Menguji
Diperluas:
sumber
PHP , 71 byte
Cobalah online!
sumber
Pip , 17 byte
Mengambil input sebagai argumen baris perintah. Cobalah online!
Penjelasan
Ini menyenangkan - saya harus menarik keluar operator perbandingan rantai.
Kami ingin mengulang sampai angka adalah satu digit ATAU berisi 9. Sama dengan itu, kami ingin mengulang sementara angka tersebut adalah beberapa digit DAN tidak mengandung angka 9. Secara setara, loop sementara angka lebih besar dari 9 DAN angka maksimum adalah kurang dari 9:
a>9>MXa
.sumber
Python 2 ,
60595653 byteDisimpan 4 byte berkat Felipe Nardi Batista
Disimpan 3 byte berkat ovs
Cobalah online!
Menggunakan lambda rekursif, membandingkan hasil konversi basis ke iterasi sebelumnya.
sumber
x==y and x or ...
karenax
tidak akan pernah0
(basis 1). atau bahkan(x==y)*x or ...
x and x==y or ...
yang tidak berhasil, tetapi saya tidak terlalu mahir dengan trik ini sehingga saya tidak menyadari bahwa saya bisa membalikkannya :)C #,
257244243244233222 byteYah, C # selalu membutuhkan banyak byte tetapi ini hanya konyol. Tidak ada built-in yang dapat menangani basis arbitrer, jadi saya harus menghitung sendiri konversi. Tidak Disatukan:
sumber
Mathematica, 92 byte
sumber
Javascript (ES6) dengan fungsi panah 0, 74 byte
sumber
f('11')
setelah fungsi? Kecuali jika saya melewatkan sesuatu yang hanya terlihat sebagai penggunaan, sebenarnya bukan bagian dari pengiriman. Jika demikian, Anda harus mengeluarkannya dari bagian kode dan memasukkannya ke dalam penjelasan Anda (ketika Anda menambahkannya) dan memperbarui jumlah byte Anda menjadi 67.K4 , 19 byte
Larutan:
Contoh:
Penjelasan:
Gunakan
/:
bawaan untuk mengonversi basis.sumber
Kotlin , 97 byte
Yg diperindahkan
Uji
TIO
TryItOnline
sumber
Japt , 25 byte
Cobalah online!
sumber
Jelly , 9 byte
Cobalah online!
sumber
C,
159157 bytesumber
Scala , 119 byte
Cobalah online!
Scala , 119 byte
Cobalah online!
Kedua metode bekerja dengan cara yang sama, tetapi yang pertama saya masukkan ke
x.length-1
dalam variabel, dan yang kedua tidak.sumber