En iyi üs 10… Buna ulaşalım!


40

Giriş:

0-9 aralığında rakamlardan oluşan pozitif bir tamsayı n .

Meydan okuma:

Eğer d tamsayı en yüksek rakamdır, sayının üssü olduğunu varsayalım d + 1 . Örneğin, tamsayı 1256 ise, üs-7'de olduğunu varsaymalısınız , 10110 ise o zaman üs-2 (ikili) olduğunu varsaymalısınız , ve 159 ise, o zaman ondalıktır.

Şimdi, siz 1: temel 10 tamsayısına ulaşana veya 2: tek basamaklı tam sayıya ulaşana kadar aşağıdakileri yapın .

  1. Tamsayısını dönüştürme base (d + 1) için bir baz-10
  2. Bu yeni tamsayının tabanını bulun (tekrar, taban- (d + 1), burada d yeni sayıdaki en yüksek basamaktır)
  3. 1. adıma gidin .

Örnekler:

Girişin n = 413574 olduğunu varsayalım . En yüksek rakam d = 7 , bu yüzden bu taban 8 (sekizlik). Bunu ondalık sayıya dönüştürün ve 137084'ü alın . En yüksek rakam d = 8 , bu yüzden bu taban 9 . Bunu ondalık sayıya dönüştürün ve 83911'i edinin . En yüksek rakam 9 , bu yüzden bu sayı bir ondalık sayı ve duruyoruz. Çıkış 83911 olacaktır .

Girişin n = 13552 olduğunu varsayalım . En yüksek hane d = 5'tir , bu yüzden bu taban 6'dır . Bunu ondalık sayıya çevirip 2156'yı alın . En yüksek rakam d = 6 , bu yüzden bu taban 7 . Bunu ondalık sayıya dönüştürün ve 776'yı alın . En yüksek hane d = 7 , bu yüzden bu taban 8 . Bunu ondalık değere dönüştür ve 510 al . En yüksek hane d = 5'tir, bu yüzden bu taban 6'dır . Bunu ondalık sayýya çevir ve 186 al . En yüksek hane 8 , bu nedenle bu taban 9 . Bunu ondalık sayıya dönüştürün ve 159. En yüksek rakam 9 , bu yüzden bu sayı bir ondalık sayı ve duruyoruz. Çıktı 159 olacaktır .

Girişin n = 17 olduğunu varsayalım . Bu bize 15 , 11 , sonra 3 verecek, ki bu rakam tek bir rakam olduğundan beri çıkacak.


Test durumları:

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

Notlar:

  • G / Ç, boşluklar vb. İle ilgili standart kurallar. Girişi bir dize olarak alabilirsiniz.
  • Açıklamalar teşvik edilir
  • Yerleşik taban dönüştürme komutlarını kullanabilirsiniz
    • Dilin yerleşik temel dönüştürme işlevlerini (eğer varsa) kullanmayan çözümler, yerleşik işlevleri kullanan açık yaklaşımdan çok daha uzun olsalar da memnuniyetle karşılanır.

Görünüşe göre, bu OEIS A091047 .


2
Görünüşe göre matrisleri seviyorum , bu yüzden onun yerine temel dönüşüm mücadelesi yapacağımı düşündüm .
Stewie Griffin

34
"En iyi taban 10," ... "10" hangi tabanda yazılır?
Olivier Grégoire

5
@ OlivierGrégoire Zekice olan şey bu ... Sonumuz ne olursa olsun, yine de geçerli bir ifade olacak!
Stewie Griffin

@StewieGriffin Ama nasıl okudunuz? "10" her bazda farklı bir isme sahiptir.
user11153

10
Peki, bu tabana bağlı ... ya da Meghan’nın dediği gibi "hepsi bu tabanla ilgili," Bu tabanla uğraşma, sorun yok " ;-)
Stewie Griffin

Yanıtlar:


20

Mathematica, 56 bayt

#//.x_/;(b=Max[d=IntegerDigits@x]+1)<11:>d~FromDigits~b&

Çevrimiçi deneyin! (Matematik kullanarak.)

Dizinin neye benzediğini kontrol edeceğimi düşündüm:

görüntü tanımını buraya girin

Ve işte sonucu bulmak için atılan adımların bir grafiği:

görüntü tanımını buraya girin

(Daha büyük versiyonlar için tıklayınız. Sadece n = 1000'e kadar olan araziler için revizyon geçmişine bakınız .)

Büyük ölçekli yapı ve iyi ölçekli kaosun çok ilginç bir karışımına benziyor. 30.000 ve 60.000 civarında daha geniş boşluklarla neler olduğunu merak ediyorum.


4
@StewieGriffin sol tarafta olmalıdır. Küçük boşluklar vardır, çünkü 10'luk bir gücün katına çıkan sayılar a içerir 9, bu yüzden zaten 10 üssündedirler. Fakat 30k ve 60k için 8 veya 7 rakamlı sayılar olduğu anlaşılmaktadır ( kontrol edin) bunun yerine 9 en fazla bir adımdan sonra daima taban 10 olur.
Martin Ender

@StewieGriffin Kesin olarak, [28051, 28888] aralığındaki tüm sayılar taban 9'dur ve 19xxx biçimindeki sayılara çevrilir, bu nedenle bu boşluğu hemen hemen iki katına çıkarır.
cmaster

Ah, anladım ... :) Kayıt için: 10'ların güçlerinin sol tarafında neden boşluklar olduğunu biliyordum ... Garip olan sadece iki boyutlu boşluklardı (neden 30/60 değil, 20 / 40/50). Şimdi bu rakamların 28xxx -> 19xxx, ancak 38xxx -> 26xxx, 29xxx değil.
Stewie Griffin

10

Java 8, 172 166 163 152 151 140 138 116 114 99 bayt

s->{for(Integer b=0;b<10&s.length()>1;s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47));return s;}

Girişi a olarak alır String.

@ OlivierGrégoire sayesinde -64 bayt . Ve işte benim ilk 172'nin çok kötü olmadığını düşündüm ..;)

Burada dene.

Açıklama:

s->{                    // Method with String as parameter and return-type
  for(Integer b=0;b<10  //  Loop as long as the largest digit + 1 is not 10
      &s.length()>1;    //  and as long as `s` contains more than 1 digit
    s=""+               //   Replace `s` with the String representation of:
         b.valueOf(s,   //    `s` as a Base-`b` integer
          b=s.chars().max().getAsInt()-47)
                        //     where `b` is the largest digit in the String + 1
  );                    //  End of loop
  return s;             //  Return result-String
}                       // End of method

1
Sakin olacağına söz ver. : p Tamam ... gidelim: s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}. Ayrıca yorumlarımın çoğunu şu anda tamamen alakasız oldukları için sildim ( btemel sizin a, ve süzerinde çalıştığımız sayıdır).
Olivier Grégoire

1
Ben bazı bayt tıraş için bu recursify denedim: Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));(88), ancak kod golf yepyeni değilim. Bu bir snipppet, değil mi? Eklemeye gerek kalmadan bunu bir yöntem olarak ilan etmenin bir yolu var mı public String c(String s)?
Lord Farquaad,

1
Buna gerek yok @LordFarquaad public, ama gerçekten kullanmak gerekecektir korkuyorum String c(String s){}bir kullanarak lambda oluşturduğunuzda bile Java 8. yılında, özyinelemeli-aramalar için java.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));}kullanırken veya arayüz interface 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));};bir "verecektir in başlatıcısı kendini referansı Her iki durumda da " hata ". Ama yine de çok güzel bir yaklaşım!
Kevin Cruijssen

Ah, sanırım o zamandan birkaç byte çıkardım. Ama yardımın için teşekkürler! Bunu aklımda tutarak devam edeceğim.
Lord Farquaad

8

Pyth, 9 bayt

ui`GhseS`

Test odası

Açıklama:

ui`GhseS`
ui`GhseS`GQ    Implicit variable introduction
u         Q    Repeatedly apply the following function until the value repeats,
               starting with Q, the input.
        `G     Convert the working value to a string.
      eS       Take its maximum.
     s         Convert to an integer.
    h          Add one.
 i`G           Convert the working value to that base

Bir değişken kullanarak biten iki değişkenli bir lambayı nasıl kullanmanız biraz garip ... hata atmadı. Oh, iki değişken Qve Qonu anlıyorum.
Outgolfer Erik,

@EriktheOutgolfer Tam olarak değil. uüncü giriş olmadan tekrarlama yapılıncaya kadar uygulanır, üçüncü girişte ise sabit sayıda uygulanır. ulambda Gve vardır H, ancak kullanmanıza gerek yoktur H.
isaacg

Aslında Gbununla Haynı sonuç elde olurdu ... btw örtük değişken G?
Outgolfer Erik,

@EriktheOutgolfer Örtük değişken G, evet. HHer yinelemede 0'dan sayar, bu yüzden tamamen farklıdır. Neden bahsettiğinden emin değilim. İşte size neler olduğunu göstermek için örnek bir program: pyth.herokuapp.com/…
isaacg

6

JavaScript (ES6), 63 57 54 53 bayt

f=a=>a>9&(b=Math.max(...a+""))<9?f(parseInt(a,b+1)):a

Shaggy ve Dom Hastings sayesinde 8 bayt kurtarıldı

f=a=>a>9&(b=Math.max(...a+""))<9?f(parseInt(a,b+1)):a;

console.log(f("413574"))


Beni yen. Bence, birkaç baytı kurtarabilir +a>9||b<9ve üçlüyü tersine çevirirsiniz.
Shaggy

1
@Shaggy düzenleme: Aptalım
Tom

1
Kendine bu kadar sert gelme Tom! Aptal değilsin, ama kesinlikle @Shaggy kadar akıllı değilsin!
Stewie Griffin,

1
55 bayt için alternatiff=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Dom Hastings

@DomHastings Gelişmeler için teşekkürler! :)
Tom

5

Python 3 , 91 78 76 75 73 bayt

@Emigna 5 byte tıraş etti. @FelipeNardiBatista 1 bayt kurtardı. @ RomanGräf 2 bayt kaydetti

i=input()
while'9'>max(i)and~-len(i):i=str(int(i,int(max(i))+1))
print(i)

Çevrimiçi deneyin!


açıklama

i=input()                                  - takes input and assigns it to a variable i
while '9'>max(i)and~-len(i):               - repeatedly checks if the number is still base-9 or lower and has a length greater than 1
    i=str(...)                             - assigns i to the string representation of ...
          int(i,int(max(i))+1)             - converts the current number to the real base 10 and loops back again
print(i)                                   - prints the mutated i

5

05AB1E , 10 5 bayt

Magic Octopus Urn sayesinde 5 bayt kurtarıldı

F§Z>ö

Bu, büyük girdiler için çok hızlı bir şekilde yavaşladığından, test için eski ve daha hızlı sürümü burada bırakıyorum. Algoritma aynı, sadece yineleme sayısı farklı.

[©Z>öD®Q#§

Çevrimiçi deneyin!

açıklama

[             # start a loop
 ©            # store a copy of the current value in the register
  Z>          # get the maximum (digit) and increment
    ö         # convert the current value to base-10 from this base
     D        # duplicate
      ®Q#     # break loop if the new value is the same as the stored value
         §    # convert to string (to prevent Z from taking the maximum int on the stack)

Ayrıca, sadece kullanamaz тFZ>ö§mısın? Yinelemelerin sayısını görmek ( burada görüldüğü gibi) plato gibi görünüyor? Eğer teknik olmak istiyorsanız, yinelemelerin yükselme oranı muhtemelen logaritmiktir ... Yani sadece şöyle bir şey kullanabilirsiniz: DFZ>ö§ve bunun çok büyük olmayacağını belirtin n. VEYA belki bile: T.n>FZ>ö§olarak yineleme sayısını doğrudan hesaplamak için log_10(n).
Magic Octopus Urn

@MagicOctopusUrn: Evet, şimdi bahsettiğinize göre, sıra kesinlikle doğrusaldan daha yavaş göründüğü F§Z>öiçin, hile yapmalı.
Emigna

Bence kaldırabilirsin §.
Outgolfer Erik

@EriktheOutgolfer: Maalesef hayır. Biz kaldırırsanız §, Zyığının yerine yığının tepesine sayısında en yüksek rakam en yüksek sayı alacaktır.
Emigna


3

APL (Dyalog) , 20 16 bayt

Bir dize alır ve döndürür

((⍕⊢⊥⍨1+⌈/)⍎¨)⍣≡

()⍣≡ İki ardışık terim aynı oluncaya kadar aşağıdaki işlevi uygulayın:

⍎¨ Her karakteri çalıştır (dizgiyi sayılar listesine dönüştürür)

() Şuna aşağıdaki taktik işlevini uygulayın:

  ⌈/ argümanın en yüksek değerini bulun

  1+ bir tane ekle

  ⊢⊥⍨ bu temeldeki argümanı değerlendirebilir

   format (dış fonksiyonun başka bir uygulaması için hazırlanırken stringify)

Çevrimiçi deneyin!



3

Mathematica, 52 bayt

FromDigits[s=IntegerDigits@#,Max@s+1]&~FixedPoint~#&

Girdi olarak negatif olmayan bir tamsayı alarak ve negatif olmayan bir tamsayı döndüren saf işlev. Aynı çekirdek tamirci kullanır FromDigits[s=IntegerDigits@#,Max@s+1]olarak Jenny_mathy cevabı , ancak sömüren FixedPointyinelemeyi yapmak.


3

Perl 6 , 49 bayt

{($_,{.Str.parse-base(1+.comb.max)}...*==*).tail}

Dene

Expanded:

{
  (

    $_,                 # seed the sequence with the input

    {
      .Str
      .parse-base(      # parse in base:
        1 + .comb.max   # largest digit + 1
      )
    }

    ...                 # keep generating values until

    * == *              # two of them match (should only be in base 10)

  ).tail                # get the last value from the sequence
}


2

Pip , 17 bayt

Wa>9>YMXaaFB:1+ya

Komut satırı argümanı olarak girdi alır. Çevrimiçi deneyin!

açıklama

Bu eğlenceliydi - zincirleme karşılaştırma operatörlerini çıkarmam gerekiyor.

Sayı tek basamaklı bir rakam olana kadar döngü yapmak istiyoruz VEYA 9 içerir. Eşdeğer olarak, sayı birden çok basamaklıyken döngü yapmak istiyoruz ve 9 içermez. 9 küçüktür: a>9>MXa.

Wa>9>YMXaaFB:1+ya
                   a is 1st cmdline arg (implicit)
     YMXa          Yank a's maximum digit into the y variable
Wa>9>              While a is greater than 9 and 9 is greater than a's max digit:
         aFB:1+y    Convert a from base 1+y to decimal and assign back to a
                a  At the end of the program, print a

2

Python 2 , 60 59 56 53 bayt

Felipe Nardi Batista sayesinde 4 byte
kurtarıldı ovs sayesinde 3 byte kurtarıldı

f=lambda x,y=0:x*(x==y)or f(`int(x,int(max(x))+1)`,x)

Çevrimiçi deneyin!

Özyinelemeli bir lambda kullanarak, baz dönüşüm sonucunun önceki tekrarlamaya göre karşılaştırılması.


neden asla kullanmayacağınız x==y and x or ...gibi xkullanılmıyor 0(temel 1). veya hatta(x==y)*x or ...
Felipe Nardi Batista

@FelipeNardiBatista: Teşekkürler! x and x==y or ...Hangisinin işe yaramadığını denedim , ancak bu püf noktalarından çok da yetkin değilim, bu yüzden onu tersine çevirebileceğimin farkında değildim :)
Emigna

@ovs: Haklısın. Teşekkürler!
Emigna

@FelipeNardiBatista "Girdi: 0-9 aralığında rakamlardan oluşan pozitif bir tamsayı." 0 hala geçerli bir giriş ve kod şimdi reddediyor.
Mast

@Mast: Neyse ki bizim için 0 pozitif bir tamsayı değil, bu yüzden girdi olarak verilmeyecek.
Emigna

2

C #, 257 244 243 244 233 222 bayt

using System.Linq;z=m=>{int b=int.Parse(m.OrderBy(s=>int.Parse(s+"")).Last()+""),n=0,p=0;if(b<9&m.Length>1){for(int i=m.Length-1;i>=0;i--)n+=int.Parse(m[i]+"")*(int)System.Math.Pow(b+1,p++);return z(n+"");}else return m;};

Eh, C # her zaman çok fazla bayt alır, ancak bu sadece saçma. Yerleşiklerin hiçbiri isteğe bağlı bir temel alamıyor, bu yüzden dönüşümü kendim hesaplamak zorunda kaldım. Ungolfed:

using System.Linq;
z = m => {
int b = int.Parse(m.OrderBy(s => int.Parse(s + "")).Last()+""), n = 0, p = 0; //Get the max digit in the string
if (b < 9 & m.Length > 1) //if conditions not satisfied, process and recurse
{
    for (int i = m.Length - 1; i >= 0; i--)
        n += int.Parse(m[i] + "") * (int)System.Math.Pow(b+1, p++); //convert each base-b+1 representation to base-10
    return z(n + ""); //recurse
}
else return m; };

1

Mathematica, 92 bayt

f[x_]:=FromDigits[s=IntegerDigits@x,d=Max@s+1];(z=f@#;While[d!=10&&Length@s>1,h=f@z;z=h];z)&

1

0 ok işlevli Javascript (ES6), 74 bayt

function f(a){a>9&&b=Math.max(...a)<9&&f(parseInt(a,b+1));alert(a)}f('11')

3
PPCG'ye Hoşgeldiniz! :) Bu muhtemelen çok güzel bir cevap, ama bir açıklama yapmadan söyleyemem. Ben (ve muhtemelen başkaları) asla açıklama içermeyen cevapları geçersiz kılmam.
Stewie Griffin,

1
Neden f('11')fonksiyondan sonra arıyorsun? Sadece kullanım gibi görünen bir şeyi kaçırmıyorsam, aslında gönderimin bir parçası değil. Eğer öyleyse, kod bölümünden çıkarmanız ve açıklamanıza (bir tane eklediğinizde) koymanız ve bayt sayınızı 67'ye güncellemeniz gerekir.
PunPun1000

1

K4 , 19 bayt

Çözüm:

{(1+|/x)/:x:10\:x}/

Örnekler:

q)\
  {(1+|/x)/:x:10\:x}/413574
83911
  {(1+|/x)/:x:10\:x}/13552
159
  {(1+|/x)/:x:10\:x}/17
3
  {(1+|/x)/:x:10\:x}/41253
29    

Açıklama:

/:Tabanı dönüştürmek için yerleşik kullanın .

{(1+|/x)/:x:10\:x}/ / the solution
{                }/ / converge lambda, repeat until same result returned
            10\:x   / convert input x to base 10 (.:'$x would do the same)
          x:        / store in variable x
 (     )/:          / convert to base given by the result of the brackets
    |/x             / max (|) over (/) input, ie return largest
  1+                / add 1 to this

1

Kotlin , 97 bayt

fun String.f():String=if(length==1||contains("9"))this else "${toInt(map{it-'0'}.max()!!+1)}".f()

Beautified

fun String.f(): String = if (length == 1 || contains("9")) this else "${toInt(map { it - '0' }.max()!! + 1)}".f()

Ölçek

fun String.f():String=if(length==1||contains("9"))this else "${toInt(map{it-'0'}.max()!!+1)}".f()
val tests = listOf(
        5 to 5,
        17 to 3,
        999 to 999,
        87654321 to 9041998,
        41253 to 29
)

fun main(args: Array<String>) {
    tests.forEach { (input, output) ->
        val answer = input.toString().f()
        if (answer != output.toString()) {
            throw AssertionError()
        }
    }
}

TIO

TryItOnline




0

C, 159 157 bayt

#include <stdlib.h>
char b[99];i=0;m=-1;c(n){do{m=-1;sprintf(b,"%d",n);i=0;while(b[i]){m=max(b[i]-48,m);i++;}n=strtol(b,0,++m);}while(b[1]&&m<10);return n;}

0

Scala , 119 bayt

if(x.max==57|x.length==1)x else{val l=x.length-1
f((0 to l).map(k=>(((x(k)-48)*math.pow(x.max-47,l-k))) toInt).sum+"")}

Çevrimiçi deneyin!

Scala , 119 bayt

if(x.max==57|x.length==1)x else f((0 to x.length-1).map(k=>(((x(k)-48)*math.pow(x.max-47,x.length-1-k))) toInt).sum+"")

Çevrimiçi deneyin!

Her iki yöntem de aynı şekilde çalışır, ancak ilkinde x.length-1bir değişkene koydum , ikincisinde de yapmam.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.