最適なベースは10です。到達しましょう。


40

入力:

0〜9の範囲の数字で構成される正の整数n

チャレンジ:

場合dは整数で最上位桁であり、数値のベースであると仮定し、D + 1。たとえば、整数が1256の場合はbase-7であると想定し、10110の場合はbase-2(バイナリ)であると想定し、159の場合は10進数であると想定します。

さて、あなたのいずれか、1まで、次の手順を実行します。到達ベース-10の整数、または一桁の整数を達する:2。

  1. 整数をbase-(d + 1)からbase-10に変換します
  2. この新しい整数のベースを検索(再び、塩基(D + 1)dは新しい数の最上位桁です)
  3. ステップ1に進みます。

例:

入力がn = 413574であると仮定します。最高桁のd = 7であるため、これは8進数(8進数)です。これを10進数に変換して137084を取得します。最高桁のd = 8であるため、これはbase-9です。これを10進数に変換して83911を取得します。最高桁は9なので、これは10進数であり、停止します。出力は83911です。

入力がn = 13552であると仮定します。最高桁はd = 5なので、これはbase-6です。これを10進数に変換して2156を取得します。最高桁d = 6であるため、これはbase-7です。これを10進数に変換して776を取得します。最高桁はd = 7なので、これはbase-8です。これを10進数に変換して510を取得します。最高桁はd = 5なので、これはbase-6です。これを10進数に変換して186を取得します。最高桁は8なので、これは9進数です。これを10進数に変換して159を取得します。最高桁は9なので、これは10進数であり、停止します。出力は159とする

入力がn = 17であると仮定します。これは、私たちに与えるだろう15、そして11、そして3を、どの我々は出力それは一桁だから。


テストケース:

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

ノート:

  • I / O、抜け穴などに関する標準ルール。入力を文字列として取得できます。
  • 説明が奨励されています
  • 組み込みのベース変換コマンドを使用できます
    • 言語の組み込みベース変換関数(存在する場合)を使用しないソリューションは、組み込み関数を使用する明白なアプローチよりもはるかに長くなる場合でも歓迎です。

どうやら、これはOEIS A091047です。


2
どうやら私は行列が大好きなので、代わりにベース変換チャレンジをしたいと思いました。
スティーヴィーグリフィン

34
「最高のベースは10」です...「10」はどのベースに書かれていますか?
オリビエグレゴワール

5
@OlivierGrégoireそれは賢いことです...私たちが最終的にどんなベースになろうとも、それはまだ有効なステートメントです!
スティーヴィーグリフィン

@StewieGriffinでも、どうやって読むの?「10」は、各ベースで異なる名前を持っています。
-user11153

10
ベース上...またはメーガンとして依存まあ、それを言うでしょう「それはベース、ノートラブルということ、その基地、バウトについてのすべてだ」 ;-)
Stewieグリフィン

回答:


20

Mathematica、56バイト

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

オンラインでお試しください!(数学を使用。)

シーケンスがどのように見えるかをチェックすると思いました:

ここに画像の説明を入力してください

そして、結果を見つけるために必要なステップ数のプロットは次のとおりです。

ここに画像の説明を入力してください

(クリックすると大きなバージョンが表示されます。n= 1000までのプロットの改訂履歴を参照してください。)

大規模な構造と微細なスケールのカオスの非常に興味深い混合物のように見えます。約30,000と60,000のギャップが広がっているのはどうしてでしょうか。


4
@StewieGriffinは左側にあるはずです。10の累乗の倍数になる数にはaが含まれるため、小さなギャップがあり9ます。したがって、それらはすでに底10にあります。しかし、30kおよび60kでは、8または7の数(チェック)その9の代わりに、多くても1つのステップの後、常にベース10になります。
マーティンエンダー

@StewieGriffin正確には、[28051、28888]の範囲のすべての数値は基数9であり、19xxx形式の数値に変換されるため、そのギャップはほぼ2倍になります。
cmaster

ああ、わかった... :)記録のために:10のべき乗の左側にギャップがある理由を知っていた...奇妙なのはダブルサイズのギャップだけだった(なぜ30/60ではなく、20 / 40/50)。28xxx-> 19xxxの範囲の数字ですが、29xxxではなく38xxx-> 26xxxの数字です。
スティーヴィーグリフィン

10

Java 8、172 166 163 152 151 140 138 116 114 99バイト

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

入力をとして受け取りますString

@OlivierGrégoireのおかげで-64バイト。ここで、最初の172はそれほど悪くないと思った..;)

ここで試してみてください。

説明:

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
落ち着くと約束しますか?:p OK ...行こう:s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}。また、コメントは完全に無関係であるため、ほとんどのコメントを削除しました(bベース、あなたのa;そしてs私たちが取り組んでいる番号です)。
オリビエグレゴワール

1
Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));(88)でいくつかのバイトを削るためにこれを再帰しようとしましたが、私はゴルフをコーディングするのが初めてです。これはスニペットですよね?追加する必要なく、これをメソッドとして宣言する方法はありpublic String c(String s)ますか?
主ファルカード

1
あなたが必要としない@LordFarquaad publicが、私はあなたが実際に使用する必要があります怖いString c(String s){}あなたが使用してラムダを作成する場合でも、Javaの8で、再帰呼び出しのため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));}か、使用してインターフェイス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));};、それは「与える初期化子で自己参照をどちらの場合もエラー」。それにもかかわらず、非常に素晴らしいアプローチです!
ケビンCruijssen

ああ、私はそれから数バイトをアンゴルフしたと思います。しかし、助けてくれてありがとう!これを念頭に置いて前進します。
主ファルカード

8

Pyth、9バイト

ui`GhseS`

テストスイート

説明:

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

2変数のラムダを使用して1つの変数を使用する方法は少し奇妙です...エラーが発生しませんでした。ああ、二つの変数があるQQ、私はそれを取得します。
エリックアウトゴルファー

@EriktheOutgolfer正確ではありません。u3番目の入力がない場合は繰り返しまで適用されますが、3番目の入力では一定の回数適用されます。ulambdaにはGand Hがありますが、を使用する必要はありませんH
-isaacg

実際に置き換えるGH同じ結果になります...暗黙的な変数はG
エリックアウトゴルファー

@EriktheOutgolfer暗黙の変数はG、はいです。H反復ごとに0からカウントアップするため、完全に異なります。あなたが何を言っているのか本当に分かりません。次に、何が起こっているかを示すサンプルプログラムを示します。pyth.herokuapp.com
isaacg

6

JavaScript(ES6)、63 57 54 53バイト

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

ShaggyとDom Hastingsのおかげで8バイト節約

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

console.log(f("413574"))


それに私を打つ。+a>9||b<9三進法で数バイトを節約し、逆にすることができると思います。
シャギー

1
@シャギー編集:私は馬鹿だ
トム

1
トムに苦労しないでください!あなたは愚かではありませんが、あなたは間違いなく@Shaggyほど賢くありません!
スティーヴィーグリフィン

1
55バイトの代替f=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Dom Hastings

@DomHastings改善してくれてありがとう!:)
トム

5

Pythonの391の78 76 75 73バイト

@Emignaは5バイトを削ぎ落としました。@FelipeNardiBatistaは1バイトを節約しました。@RomanGräfは2バイトを節約しました

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

オンラインでお試しください!


説明

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

05AB1E10 5バイト

Magic Octopus Urnのおかげで5バイト節約

F§Z>ö

これは、大きな入力に対して非常に急速に遅くなるので、テストのために古いはるかに速いバージョンをここに残しています。アルゴリズムは同じですが、反復回数のみが異なります。

[©Z>öD®Q#§

オンラインでお試しください!

説明

[             # 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)

また、あなただけを使用することはできませんтFZ>ö§か?反復回数(ここに見られるように)が安定しているように見えますか?あなたが技術的な取得したい場合は、反復が上昇する速度は、おそらく対数である...あなただけのようなものを使用することができるように:DFZ>ö§と状態は、大きなために実行されませんn。または多分偶数:T.n>FZ>ö§反復回数をとして直接計算しますlog_10(n)
魔法のタコUr

@MagicOctopusUrn:ええ、あなたがそれについて言及した今、シーケンスは間違いなく線形より遅いように見えるF§Z>öので、トリックを行う必要があります。
エミグナ

削除できると思います§
エリックアウトゴルファー

@EriktheOutgolfer:残念ながらいいえ。を削除する§Z、スタックの最上位の数字の最上位の数字ではなく、スタックの最上位の数字が取得されます。
エミグナ


3

APL(Dyalog)20 16バイト

文字列を受け取って返します

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

()⍣≡ 2つの連続した用語が同一になるまで、次の関数を適用します。

⍎¨ 各文字を実行します(文字列を数字のリストに変換します)

() 次の暗黙関数を適用します:

  ⌈/ 引数の最大値を見つける

  1+ ひとつ追加

  ⊢⊥⍨ そのベースの引数を評価します

   format(文字列化、外部関数の別のアプリケーションの準備)

オンラインでお試しください!



3

Mathematica、52バイト

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

入力として非負の整数を取り、非負の整数を返す純粋な関数。Jenny_mathyの回答と同じコアメカニックFromDigits[s=IntegerDigits@#,Max@s+1]を使用しますが、反復を行うために悪用します。FixedPoint


3

Perl 6、49バイト

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

試して

拡張:

{
  (

    $_,                 # 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

ピップ、17バイト

Wa>9>YMXaaFB:1+ya

入力をコマンドライン引数として受け取ります。 オンラインでお試しください!

説明

これは楽しかったです-チェーン比較演算子を引き出す必要がありました。

数字が1桁になるまで、または9が含まれるまでループします。同等に、数字が複数桁で、かつ9が含まれない間ループします。同等に、数字が9を超え、かつ最大桁が9未満: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

パイソン260の 59 56 53バイト

フェリペナルディバティスタのおかげで4バイトを節約ovsの
おかげで3バイトを節約

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

オンラインでお試しください!

再帰ラムダを使用して、基本変換の結果を前の反復と比較します。


絶対に使用x==y and x or ...xないでください0(ベース1)。または(x==y)*x or ...
フェリペナルディバティスタ

@FelipeNardiBatista:ありがとう!x and x==y or ...うまくいかなかったものを試しましたが、これらのトリックにはあまり習熟していないので、逆にすることができるとは思いませんでした:)
エミグナ

@ovs:そうですね。ありがとう!
エミグナ

@FelipeNardiBatista "入力:0〜9の範囲の数字で構成される正の整数n。" 0は依然として有効な入力であり、コードはそれを拒否します。
マスト

@Mast:幸いなことに、0は正の整数ではないため、入力としては与えられません。
エミグナ

2

C位、257の 244 243 244 233 222バイト

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;};

C#は常に多くのバイトを必要としますが、これはばかげています。組み込みのいずれも任意のベースを処理できないため、変換を自分で計算する必要がありました。ゴルフをしていない:

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バイト

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

Javascript(ES6)、0矢印関数、74バイト

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

3
PPCGへようこそ!:)これはおそらく非常に良い答えですが、説明なしではわかりません。私(およびおそらく他の人)は、説明が含まれていない回答を支持しません。
スティーヴィーグリフィン

1
f('11')関数の後に呼び出すのはなぜですか?実際に提出物の一部ではなく、使用法のように見えるものを逃していない限り。その場合、コードセクションから取り出して説明に追加し(追加する場合)、バイトカウントを67に更新する必要があります
。– PunPun1000

1

K4バイト

溶液:

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

例:

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    

説明:

/:ビルトインを使用してベースを変換します。

{(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バイト

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

美化

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

テスト

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バイト

#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バイト

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+"")}

オンラインでお試しください!

Scala、119バイト

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+"")

オンラインでお試しください!

どちらの方法も同じように機能しますが、最初の方法x.length-1では変数を入れ、2番目の方法では入れません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.