最小のゼロレスベース


28

正の整数が与えられた場合n、先行ゼロなしb >= 2nin base の表現にbaが含まれない最小のベースを出力します0。あなたはb <= 256すべての入力に対してそれを仮定するかもしれません。

テストケース

1 -> 2 (1)
2 -> 3 (2)
3 -> 2 (11)
4 -> 3 (11)
5 -> 3 (12)
6 -> 4 (12)
7 -> 2 (111)
10 -> 4 (22)
17 -> 3 (122)
20 -> 6 (32)
50 -> 3 (1212)
100 -> 6 (244)
777 -> 6 (3333)
999 -> 4 (33213)
1000 -> 6 (4344)
1179360 -> 23 ([12, 9, 21, 4, 4])
232792560 -> 23 ([15, 12, 2, 20, 3, 13, 1])
2329089562800 -> 31 ([20, 3, 18, 2, 24, 9, 20, 22, 2])
69720375229712477164533808935312303556800 -> 101 ([37, 17, 10, 60, 39, 32, 21, 87, 80, 71, 82, 14, 68, 99, 95, 4, 53, 44, 10, 72, 5])
8337245403447921335829504375888192675135162254454825924977726845769444687965016467695833282339504042669808000 -> 256 ([128, 153, 236, 224, 97, 21, 177, 119, 159, 45, 133, 161, 113, 172, 138, 130, 229, 183, 58, 35, 99, 184, 186, 197, 207, 20, 183, 191, 181, 250, 130, 153, 230, 61, 136, 142, 35, 54, 199, 213, 170, 214, 139, 202, 140, 3])

1
使用している上位ベースの10、11などの値は何ですか?ゼロが含まれていますか?
スティーブン

19
@Stephen上記の数字に選択された値9は重要ではありません0
メゴ

9
これはOEIS A106370です。
エンジニアトースト

1
@タイタスそれは良い点です。ベースを合理的なものに制限します。
メゴ

1
@Mego:232792560を試してください。これは2,3、...、20のlcmであるため、20以下のすべてのベースでは、最下位桁が0になります。
ネイト・エルドリッジ

回答:


15

Pyth、6バイト

f*FjQT

すべてのテストケースを確認します。

使い方

f * FjQT〜完全なプログラム。

f〜条件が真である最初の正の整数。
   jQT〜現在の要素のベースに変換された入力。
 * F〜製品。リストに0が含まれている場合、それは0です。それ以外の場合は、厳密に正です。
          0-> Falsy; > 0->真実。
        〜結果を暗黙的に出力します。

Pyth f1, 2, 3, 4, ...(1から始まる)で動作しますが、Pythは基数1(単項)の数値をゼロの束として扱うため、基数1は無視されます。


Pythのbase-1表現がすべてゼロであるという事実の素晴らしい悪用。
エリックアウトゴルファー

@EriktheOutgolferありがとう!それに関する説明を追加します。
ミスターXcoder

Pythが数字として単項表現の使用をゼロ言語だけではありませんヒント:P
MEGO

あなたが書いた0 -> Falsy; > 0 -> Truthy。それは意図的で0あり、それは両方でTruthyありFalsy、そのような状況ですか?
ブライアンJ

@BrianJ >2番目の前に記号があります。これは、00より大きいすべてが真実であることを意味します。
ミスターXcoder

11

C、 52  50バイト

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}

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

C(gcc)、 47  45バイト

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}

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


@Kevin Cruijssenの回答に対する@Nevayの提案のおかげで、2バイト節約されました!


2
後者のバージョンは、特定のコンパイラーに固執する場合でも、ランダムな運によってのみ機能します。そして、もちろん、どちらのバージョンも実際にはCではありません。
AnT17年

3
@AnTそれはCです。多くの警告を出しますが、コンパイルされます。あなたのコードで動作するコンパイラを見つけさえすれば大丈夫です
フェリペナルディバティスタ

1
@Blacksilver k%iは、ここでは3項チェックです。より読みやすいバリアントはk=(k%i?k:n*++i);、さらに明確になりますif(k%i){k=k;}else{k=n*++i;}
ケビンCruijssen

1
また、2バイトでゴルフをすることができます:i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}。すべての功績は、移植されたJava 8の回答にこの提案を投稿した@Nevayに帰属ます
ケビンCruijssen

1
@Felipe Nardi Batista:CodeGolfのルールが「コンパイルする限り」などと言っているという事実を知っています。しかし、それは「コンパイル」はどのような方法でそれがC.これであることを証明していないという事実はないC.型なしの宣言のようなものですi, k;し、f(n)C(K&R)の古代のバージョンに存在していたが、唯一の時代にするときreturnの周りに丸括弧を必要とその引数。でK&Rを使用する場合はi,k;、も使用する必要がありますreturn(i);。上記はgnucである可能性がありますが、Cではありません。
AnT17年

8

Haskell56 52 48バイト

b#n=n<1||mod n b>0&&b#div n b
f n=until(#n)(+1)2

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

かなり基本的ですが、短縮する良い方法は考えられません

編集:4バイトを節約してくれたLaikoniに感謝します!なぜ考えなかったのか分からない!!0。おそらくこれらの括弧を削除してみるべきでしたが||&&一緒に使用しようとすると、奇妙なエラーの漠然とした記憶があります。たぶん、私はそれを等価演算子と混同しているのかもしれません。

編集2:さらに4バイトを削ってくれてありがとう@Lynn!until今まで知らなかった方法がわかりません。


1
ほぼ同じソリューションを使用して、あなたは私を1分間倒しました。:) !!0はより短いのでhead、括弧をドロップできると思います#
ライコニ

2
犯罪的に過小評価されているため、until :: (a → Bool) → (a → a) → a → a4バイト節約さf n=until(#n)(+1)2
リン


6

、7バイト

→V▼MBtN

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

説明

→V▼MBtN
     tN    list of natural numbers starting from 2
   MB      convert the (implicit) input to each of those bases
 V▼        find the (1-based) index of the first result where the minimum digit is truthy
→          add 1 to this index





3

Java 8、61 56 54バイト

n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}

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

説明:

n->{            // Method with integer as both parameter and return-type
  int b=2,      //  Base-integer, starting at 2
      t=n;      //  Temp-integer, copy of the input
  for(;t>0;)    //  Loop as long as `t` is not 0
    t=t%b++<1?  //   If `t` is divisible by the base `b`
                //   (and increase the base `b` by 1 afterwards with `b++`)
       n        //    Set `t` to the input `n`
      :         //   Else:
       t/--b;   //    Divide `t` by the `b-1`
                //    (by decreasing the base `b` by 1 first with `--b`)
                //  End of loop (implicit / single-line body)
  return b;     //  Return the resulting base
}               // End of method

算術的アプローチを使用することで、これをゴルフにかけることができると感じています。@Steadybox 'Cのポートを使って、実際にそれを行うことができます。そして、@Nevayのおかげで2バイトずつゴルフをすることができます。

古い(61バイト)回答:

n->{int b=1;for(;n.toString(n,++b).contains("0"););return b;}

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

説明:

n->{         // Method with Integer as both parameter and return-type
  int b=1;   //  Base-integer, starting at 1
  for(;n.toString(n,++b).contains("0"););
             //  Loop as long as the input in base-`b` does contain a 0,
             //  after we've first increased `b` by 1 before every iteration with `++b`
  return b;  //  Return the resulting base
}            // End of method

2
54バイト:n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}
Nevay

2

Japt、8バイト

@ìX e}a2

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

説明

@    }a2

X関数を渡す最初の番号()を返します。2

ìX

入力番号を基本X桁の配列に変換します。

e

すべての数字が真実かどうかを確認します。


配列に次の倍数が含まれている場合、これは失敗しません10か?
シャギー

@Shaggy私の理解では、OPのコメントによれば、9を超える塩基の数字はゼロとしてカウントされないということでした。
ジャスティンマリナー

ああ、私は今それを見る。チャレンジのフレージングに問題があるので(または、私は疲れすぎています!)。
シャギー

2

JavaScript(ES6)、43 41 37バイト

n=>(g=x=>x?g(x%b++?x/--b|0:n):b)(b=1)

テストケース



2

Python 2、57バイト

n=m=input()
b=2
while m:c=m%b<1;b+=c;m=(m/b,n)[c]
print b

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

-1 Felipe Nardi Batistaに感謝します。
-2 Lynnに感謝します(そして、これは彼女のソリューションのduです:D)



私はあなたが交換することができると思いwhile m>1によってwhile m(その後、私たちは結ばている!)
リン・

@Lynnそれがあなたの解決策についてコメントした理由です。それはまったく同じです。
エリックアウトゴルファー


1
@Lynn私はすでに知っていた:pさもなければ、あなたのものを削除するように頼んだでしょう。
エリックアウトゴルファー

2

APL(Dyalog)20 19 バイト

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕

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

いつものように、チャットを手伝ってくれて、コードをTIOで動作させる@Adámに感謝します。また、1バイトを節約します。

これはtradfn(あるトラッド itional F unctio N)体。それを使用するには、名前(TIOのヘッダーフィールドにある)を割り当て、s(名前の前に1つ、TIOのフッターフィールドに1つ)で囲み、その名前を使用して呼び出す必要があります。クワッド()を使用してユーザーの入力を取得するためf \n input、通常の代わりにasとして呼び出されますf input

どうやって?

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕   Main function.
                  n←⎕  Assigns the input to the variable n
1+⍣{           }≢      Starting with 1, add 1 until the expression in braces is truthy
    ~0                returns falsy if 0 "is in"
                      convert
            n         the input
         ⍣¯1           to base
                      left argument (which starts at 1 and increments by 1)

次に、関数は結果のベースを返します。


1
先端のゴルフ:ので、n←⎕簡単な番号で、あなたが必要とする1コードの残りの部分への最初の引数として、あなただけの要素の数数えることができますn置き換えることで、(1)1⊣オンラインでお試しください!
アダム


1

R79 71 66 63 65バイト

function(n){while(!{T=T+1;all(n%/%T^(0:floor(log(n,T)))%%T)})T
T}

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

この答えは、ジュゼッペの単一ループでの再配置に基づいています。

JDLのおかげで8バイト、Giuseppeのおかげで6バイト節約されました。


1
あなたは、サブできるbためTと定義から始まり、TRUE == 1の必要性を取り除くが、b=1。同様にあなたがサブすることができますFのためにkFあるFALSE
JDL

あなたがそこで何をしたかわかる。知っておくと便利です!
NofP

1
m%/%T代わりに(整数除算)を使用して66バイト(m-m%%T)/T
ジュゼッペ

65バイト。それは少し厄介でしたが、ネストされたループを取り除くと何かが保存されると疑っていました。私はちょうどそれが1バイト以上になると思った:(
ジュゼッペ

1

MATL13 12バイト

`G@Q_YAA~}@Q

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

ルイス・メンドーのおかげで-1バイト。このプログラムはflintmax、デフォルトのデータ型がdoubleMATLであるため、2 ^ 53(、浮動小数点型で表現可能な最大連続整数)より大きいテストケースを処理しません。ただし、その数値より下の任意のゼロのないベースを見つけることができるはずです。

`            % Do while
 G           %  Push input
  @ _        %  Outputs the iteration number, negate.
     YA      %  Convert input to base given by the iteration number, the negative number is to instruct MATL we want an arbitrary high base with a integer vector rather than the default character vector we know from hexadecimal
       A~    %  If they're not all ones, repeat
         }   % But if they are equal, we finally
          @  %  Push the last base
   Q       Q %  As base 1 makes no sense, to prevent MATL from errors we always increase the iteration number by one.

@LuisMendo本当にドキュメントを読みやすくする必要があります。ありがとう。
-Sanchises

これは、より大きなテストケースでは機能しないように見えますが、MATL / Matlabについては、整数の制限が原因かどうかを知るのに十分な知識がありません。
メゴ

@Mego MATLAB R2017aで、1e6までの現在のバージョンと同等の13バイトバージョンをテストしました。どのテスト設定が問題を引き起こしましたか?
-Sanchises

最後の2つのテストケースではエラーが発生します。
メゴ

@Megoああ、私はそれらのテストケースを見たことがありませんでした。これはYA、内部的にdouble を使用するMATLの実装によるものであるため、doubleで表現可能な最大連続整数までの入力のみを処理できます(を参照flintmax)。これは答えを無効にしますか?原則として、アルゴリズムは任意のベースに対して機能します。ベース36までしか実行しない別のコマンドを明示的に回避しました。
Sanchises

0

PHP、59 + 1バイト

builtinsを使用して、最大ベース36:

for($b=1;strpos(_.base_convert($argn,10,++$b),48););echo$b;

組み込みなし、63 60 + 1バイト、任意のベース:

for($n=$b=1;$n&&++$b;)for($n=$argn;$n%$b;$n=$n/$b|0);echo$b;

パイプとして実行する-nR、オンラインで試してください



0

J、26バイト

]>:@]^:(0 e.]#.inv[)^:_ 2:

これを改善できるかどうか知りたいです。

主動詞は二項句です:

>:@]^:(0 e.]#.inv[)^:_

左側に入力が与えられ、右側に定数2が与えられます。その主動詞句は、JのDo..Whileコンストラクトを使用し、0がe.ベースyの元の引数の要素である限り、右y引数をインクリメントします。

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



0

天の川、38バイト

^^'%{255£2+>:>R&{~^?{_>:<;m_+¡}}^^^}

使用法: ./mw base.mwg -i 3


説明

code                                 explanation                    stack layout

^^                                   clear the preinitialized stack []
  '                                  push the input                 [input]
   %{                              } for loop
     255£                             push next value from 0..254   [input, base-2]
         2+                           add 2 to the get the base     [input, base]
           >                          rotate stack right            [base, input]
            :                         duplicate ToS                 [base, input, input]
             >                        rotate stack right            [input, base, input]
              R                       push 1                        [input, base, input, 1]
               &{~             }      while ToS (=remainder) is true ...
                  ^                    pop ToS                      [input, base, number]
                   ?{         }        if ToS (=quotient) ...
                     _>:<;              modify stack                [input, base, number, base]
                           m            divmod                      [input, base, quotient, remainder]
                           _+¡         else: output ToS (0) + SoS and exit
                                ^^^   pop everything but the input.

forループの代わりにwhileループを使用してこれを短縮できると確信していますが、動作させることができませんでした。



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