nからbの次の累乗はどれくらい離れていますか?


32

させるnおよびはbより大きい正の整数です1

nからの次の累乗までの距離を出力しbます。

ためn=5b=3、次の電源3から5IS 93^2 = 9)、出力されるように9 - 5 = 4

ためn=8b=2、次の電源2から8IS 162^4 = 16)、出力されるように16 - 8 = 8。注nの力である2。この例では

テストケース:

  n b output
212 2 44
563 5 62
491 5 134
424 3 305
469 8 43
343 7 2058
592 7 1809
289 5 336
694 3 35
324 5 301
  2 5 3

これはです。バイト単位の最短回答が優先されます。標準の抜け穴が適用されます。

回答:


16

ゼリー 4  3 バイト

ạæċ

二進リンク服用n左側にし、b右側にその結果を返します。

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

どうやって?

ạæċ - Link: number n, number b | n,b ∈ ℕ
 æċ - ceiling n to the next power of b
ạ   - absolute difference between n and that

4
取り消し線4は、まだ通常の4です。(
Uriel

2
@Uriel But  ;)
HyperNeutrino

tfwの最初の最初の考えは「ああ、それæċだ!」「うわー、これはすっごく難しい...」の代わりに
エリック・ザ・アウトゴルファー

ああ、それは歴史に存在しないかもしれませんが、私は4バイターから変更しました。それはæċ_⁸
ジョナサンアラン

@JonathanAllan歴史に載っていなかったので意味がありませんでした。だから編集しました。
エリックアウトゴルファー

8

x86-64アセンブリ(Windows x64呼び出し規約)、14 13バイト

効率の悪い(しかし洗練された!)反復アプローチ(インスピレーションは@Neilの功績による):

               HowFarAway PROC
6A 01             push   1
58                pop    rax         ; temp = 1
               Loop:
0F AF C2          imul   eax, edx    ; temp *= b
39 C8             cmp    eax, ecx
72 F9             jb     Loop        ; keep looping (jump) if temp < n
29 C8             sub    eax, ecx    ; temp -= n
C3                ret                ; return temp
               HowFarAway ENDP

上記の関数は、2つの整数パラメーターnECXレジスターに渡される)とb(レジスターに渡される)を取りEDX、単一の整数結果(レジスター内)を返しますEAX。Cから呼び出すには、次のプロトタイプを使用します。

unsigned HowFarAway(unsigned n, unsigned b);

これは、32ビット整数の範囲に制限されています。完全に長いレジスタを使用して64ビット整数をサポートするように簡単に変更できますが、これらの命令をエンコードするにはより多くのバイトがかかります。:-)


だから、4バイト未満でeaxを1に設定することはできませんか?
ニール

うーん… 正気のプログラマーが使用する通常の方法ではありませんが、3バイトで+ できます。しかし...その後、乗算をスキップする必要はありません。そのため、をドロップできるため、それでも合理的な節約になります。push 1pop raxjmp
コーディグレー

ああ、私はバイトを離れてゴルフする方法がなければならないと知っていました!
ニール

TIOデモを使用して、LinuxのSysV呼び出し規約でも同じことができます。
デジタル外傷

もちろんできます。少なくとも最初の2つの整数パラメーターをレジスターに渡す任意の呼び出し規約を使用して実行できます。System V、Win x64、Win32 __fastcallなど。レジスタが変更されるだけなので、1つを選択する必要がありました。コインが「Windows」になりました。
コーディグレー

6

C(gcc)39 35バイト

エリックのおかげで新しい未定義の動作

f(n,b,i){for(i=b;b<=n;b*=i);n=b-n;}

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


f(n,b,i){for(i=b;b<n;b*=i);n=b-n;}5バイトを節約し、gccでサポートされています
Erik the Outgolfer

@EriktheOutgolferどうしてb-=n
リーキー修道女

@LeakyNunこれは最初の引数なので、戻り値を保存する必要があります。
エリックアウトゴルファー

うーん、あなたはコードを更新しませんでした。
エリックアウトゴルファー

b-=nの順序を入れ替えればできますか?bn
ザカリー

6

Dyalog APL、10バイト

@ZacharyTのおかげで2バイト節約

⊢-⍨⊣*1+∘⌊⍟

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

取りn右引数として、およびb左引数として。

計算します。b⌊logbn + 1⌋ - n


ニースは、私はちょうど約この厳密解投稿することだった
KritixiのLithos

@KritixiLithos私はフロアトリックに苦労しました。電車にできると思う?
ウリエル

うん、それは次のことができます⊣-⍨⊢*1+∘⌊⍟⍨
ザカリー

@ZacharyTいいね!
ウリエル

⊢-⍨⊣*1+∘⌊⍟は10バイトを取得しますが、それnは正しい引数でbあり、左の引数ですので、引数を交換しました。ZacharyTのトリック1+∘⌊を使って、ここまでそれを解決しました。
クリチキシリソス

6

R38 34バイト

pryr::f({a=b^(0:n)-n;min(a[a>0])})

匿名関数。bのすべての値を[0、n]の範囲のすべてのべき乗で保存し、それぞれからnを減算し、正の値のサブセットを計算し、minを返します。

TIOには、と呼ばれる非pryrバージョンがありf(n,b)ます。このバージョンはとして呼び出す必要がありますf(b,n)

Jarko Dubbeldamのおかげで4バイト節約できました。

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


ニース、私が念頭に置いていた再帰よりもずっと短い。
JAD

pryr::f({a=b^(0:n)-n;min(a[a>0])})数バイト短くなります。
JAD

ありがとう。pryr::f関数で新しい変数を定義するとき、私は運が悪かった。ここで機能しているようです。
BLT

2
うーん、それは常にチェックする価値があります:)あなたが何かのようなものを持っている場合sapply(x, sum)、それがsum引数に追加することは私を悩ますものです。
JAD

4

Cubix24 20バイト

MickyTのおかげで-4バイト

Pwp.I|-.;)^0@O?|uq;<

次のような入力を読み込みます n,b

2x2x2立方体に適合:

    P w
    p .
I | - . ; ) ^ 0
@ O ? | u q ; <
    . .
    . .

説明:

I|I0 :入力を読み取り、0(カウンター)をスタックにプッシュします

^w IPをループの適切な場所に配置します。

  • Pp-:計算b^(counter)nスタックの先頭に移動、計算b^(counter) - n
  • ? :負の場合は左に、0の場合はまっすぐ、正の場合は右
    • 正::O@スタックの最上部(距離)を出力して終了します。
    • 負::|?スタックのトップがゼロであるかのように進みます
  • <;qu;):IPを正しい方向に向け、スタックの一番上(負/ゼロの数字)をnポップし、スタックの一番下に移動し、uターンし、スタックの一番上をポップ(b^(counter))して、カウンターをインクリメントします
  • IPは^w現在、プログラムは継続しています。

オンラインで見る!

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


1
同じ手順を使用して、異なるパスPwp.I|-.;)^0@O?|uq;<
-MickyT

@MickyT天才!私はキュービックスの回答を提出するたびに、あなたは一緒に来て、4バイトまたは5バイトを削るような気がします...-
ジュゼッペ


2

05AB1E9 8バイト

sLmʒ‹}α¬

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

説明

s         # swap order of the inputs
 L        # range [1 ... n]
  m       # raise b to each power
   ʒ‹}    # filter, keep only the elements greater than n
      α   # calculate absolute difference with n for each
       ¬  # get the first (smallest)

1
あなたは一分で私を打ちました。それはまさに私が書いたものですが、ć代わりにを使用しました¬
ライリー

@Riley:フィルターでも動作しますが、残念ながらバイトを保存しません。
エミグナ

1
@Emignaは残念なことに、バイトを保存しません *バイトを保存します*
Erik the Outgolfer

@EriktheOutgolfer:はい、そうです。これは、暗黙的な入力がバイトを保存する奇妙な方法を利用した追加の変更でした:)
エミグナ

1
@carusocomputing:はい。実際には、フィルターの比較と絶対差の計算の両方で暗黙的に再利用できるため、「間違った」順序でバイトを保存しますn
エミグナ


2

MATL10 9バイト

yy:YAn^w-

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

説明

入力694を検討3し、例として。

y    % Implicitly take two inputs. Duplicate from below
     % STACK: 694, 3, 694
y    % Duplicate from below
     % STACK: 694, 3, 694, 3
:    % Range
     % STACK: 694, 3, 694, [1 2 3]
YA   % Base conversion (of 694 with "digits" given by [1 2 3]
     % STACK: 694, 3, [3 3 2 3 1 2]
n    % Number of elements
     % STACK: 694, 3, 6
^    % Power
     % 694, 729
w    % Swap
     % STACK: 729, 694
-    % Subtract. Implicitly display
^    % 35

2

JavaScript(ES6)、29バイト

Rickのアプローチと非常に似ていますが、彼の許可を得て投稿しています(そして、バイトを節約するための助けもあります)。

n=>b=>g=(x=b)=>x>n?x-n:g(x*b)

それを試してみてください

f=
n=>b=>g=(x=b)=>x>n?x-n:g(x*b)
oninput=_=>o.value=f(+i.value)(+j.value)()
o.value=f(i.value=324)(j.value=5)()
*{font-family:sans-serif;}
input{margin:0 5px 0 0;width:50px;}
<label for=i>n: </label><input id=i type=number><label for=j>b: </label><input id=j type=number><label for=o>= </label><input id=o>


2

Mathematica、24バイト

#2^⌊1/#~Log~#2⌋#2-#&

ありがとうマーティン

I / O

[343、7]

2058


1/Log@##またはを使用できます#2~Log~#。または、入力の順序を入れ替えて使用することをお勧めますLog@##
マーティンエンダー

そして、それ#^Floor[...]#よりも短いです#^(Floor[...]+1)。また、Unicode演算子Floorもあります。
マーティンエンダー

はい、はい、もちろん、これらすべてに取り組んでいます。
-J42161217

忘れないでLog@##!実際、引数の順序を入れ替えると、#^⌊Log@##⌋#-#2&-5バイトの可能性があります(私は思う)!
電卓

2

C、42 40バイト

コメンター@Steadyboxにヒントをありがとう

o;p(n,b){for(o=b;n>=b;)b*=o;return b-n;}

2
使用するfor代わりにすると、while2つのバイトを保存しますo;p(n,b){for(o=b;n>=b;)b*=o;return b-n;}
Steadybox

提案するn/b代わりにn>=b
ceilingcat

2

R、30バイト

pryr::f(b^floor(log(n,b)+1)-n)

関数を評価します

function (b, n) 
b^floor(log(n, b) + 1) - n

これは第一の電力より大きい又はより等しい取りn、次いでsubstracts nその値からを。

がの累乗である場合、次の累乗を確保するように変更ceiling(power)floor(power+1)れました。nb


1

JavaScript(ES6)、31バイト

f=(n,b,i=b)=>b>n?b-n:f(n,b*i,i)

テストケース:


カリー化することでバイトを保存することができます(私がカリー化を試みたのかnbそれとも単にカリー化したかは関係ありませんnn
ニール

@Neilに感謝しますが、その方法を理解するのに苦労しています(?)
リックヒッチコック

私が思いついた2つのバージョンがあっn=>g=(b,p=b)=>p>n?p-n:g(b,p*b)n=>b=>(g=p=>p>n?p-n:g(p*b))(b)
ニール

f=(n,i)=>g=(b=i)=>b>n?b-n:g(b*i)30バイトのために働きますか?次のように呼び出す必要がありますf(324,5)()。編集:ああ、@ Neilが私を打ち負かしました。
シャギー

@Neil、ありがとう、カレーの練習がもっと必要です。
リックヒッチコック







1

Japt、9バイト

_q}a@nVpX

オンラインでテストしてください!

説明

_  q}a@  nVpX
Z{Zq}aX{UnVpX}  // Ungolfed
                // Implicit: U, V = input integers
     aX{     }  // For each integer X in [0...1e9), take
          VpX   //   V to the power of X
        Un      //   minus U,
Z{  }           // and return the first one Z where
  Zq            //   Math.sqrt(Z) is truthy.
                //   Math.sqrt returns NaN for negative inputs, and 0 is falsy, so this is
                //   truthy iff Z is positive. Therefore, this returns the first positive
                //   value of V**X - U.
                // Implicit: output result of last expression

1
... 待つ。何?
シャギー

@Shaggy説明を追加しましたが、うまくいけばこれが役立つでしょう。
-ETHproductions

1

Python 42  41バイト

f=lambda a,b,v=1:(a<v)*(v-a)or f(a,b,v*b)

から始まり、厳密に超えて差を返すまでv=1繰り返し乗算する再帰関数。ba

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

注:結果はゼロになることはないため、再帰エラーを発生させることなくa>=v and f(a,b,v*b)or v-a置き換えられ(a<v)*(v-a)or f(a,b,v*b)ます。


Python 3、37バイト?

リシのアイデアを使用して...

f=lambda n,b:(n<b)*(b-n)or b*f(n/b,b)

浮動小数点演算を使用しているため(結果が実際の距離から外れている可能性があります)、
ここ試してください


tio.run/…は少し短くなりますが、フォーマット "%.0f"で結果を出力しなければならないことはおそらく不正です。
リチ

@riciニース、浮動小数点演算を使用しても問題ないと思います。代替として追加します(true b-nであると同時にゼロになることはないため、フォームを切り替えることで別のバイトを保存できn<bます)。
ジョナサンアラン



0

Lua、74 73バイト

簡単な解決策として、引数が文字列ではなく数値として扱われるように10バイトを使用しています。STDINへの出力。

編集:のスペースを削除するのを忘れてw=1 n=n+0、1バイトを節約します

n,b=...b=b+0p=b w=1n=n+0while p<=n do p=math.pow(b,w)w=w+1 end print(p-n)

説明した

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

n,b=...           -- unpack the argument into the variable n and b
b=b+0             -- set b's type to number
n=n+0             -- set n's type to number
p=b               -- set a variable to track the current value of the powered b
w=1               -- set the nth power
while p<=n        -- iterate untill the current power is greater or equals to n
do
  p=math.pow(b,w) -- raise b to the power w
  w=w+1           -- increment w
end
print(p-n)        -- outputs p minus the following power of b

私はそれだけでなくLuaのを知っているが、間にスペースではありません1し、end必要に応じて?
ザカリー

@ZacharyT Luaでは、数字で始まる16進数はインライン化できますが、有効な16進数値ではないため1end、数字として解釈され、1eエラーがスローされ1enます。これは、数字に続く[abcdef]文字が他の文字を16進値として解釈できない場合にのみw=1while発生し、エラーがスローされません。
-Katenkyo

PPCGへようこそ!
リーキー修道女

0

QBIC、23バイト

{p=:^q~p>:|_xp-b|\q=q+1

b最初にパラメーターを取り、次にを取りますn

説明

{       DO
p=:^q   SET p to input b (read as 'a' by QBIC fromt he cmd line) ** q (starts as 1)
~p>:    IF p exceeds 'n' (read as 'b' by QBIC fromt he cmd line)
|_xp-b| THEN QUIT, printing p minus b
\q=q+1  ELSE increase q, re-run

0

パイソン248の 41バイト

  • @Rodのループの単純化により7バイト節約されました!

再帰やビット調整のない完全なプログラム:

i=1;n,b=input()
while n>=i:i*=b
print i-n

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

入力形式:n, b


あなたはできるループを簡素化する 7バイト減らすために
ロッド

@Rodはそれを考えたことがなかっただろう:)。どうもありがとう!
ミスターXcoder

0

Pythonの350の、48バイト

2バイトを節約してくれたEriktheOutgolferに感謝します!

lambda n,b:b**-~int(math.log(n,b))-n
import math

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

Pythonには派手なログや天井のビルトインはありません。そのため、私はゴルフのセンスを少し取り入れた明らかなアプローチを採用しました。


import math;lambda n,b:b**-~int(math.log(n,b))-n2バイトを節約し、メタコンセンサスごとに許可されます。
エリックアウトゴルファー

@EriktheOutgolfer ceilは機能しません。
リーキー修道女

@EriktheOutgolferはの累乗ceilでは機能しないため使用しませんでしたbが、@ Urielがインポートする前に、まだバイトを保存することを指摘しました。
-notjagan

完全に問題なく再フォーマットできます。オンラインで試してください!importラムダの後に配置f=し、ヘッダーに追加します。
ミスターXcoder

@ Mr.Xcoderああ、あなたは正しいです!なぜそんなことが起こらなかったのか分かりません。
-notjagan

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