n到b的下一个幂有多远?


32

nb为大于的正整数1

输出n到的下一个幂的距离b

对于n=5b=33from 的下一个幂593^2 = 9),所以输出是9 - 5 = 4

对于n=8b=22from 的下一个幂8162^4 = 16),所以输出是16 - 8 = 8。请注意,在此示例n2,这是的幂。

测试用例:

  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

这是。以字节为单位的最短答案将获胜。有标准漏洞

Answers:


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您最初的最初想法是“哦æċ!” 而不是“哇,这太难了……”
Outgolfer的Erik

哦,它在历史上可能不存在,但是我确实从4字节改变了。是æċ_⁸
Jonathan Allan

@JonathanAllan既然它不在历史上,那是没有意义的,这就是为什么我将其编辑出来。
独行侠埃里克(Erik the Outgolfer)'17年

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

上面的函数接受两个整数参数n(传递到ECX寄存器中)和b(传递到EDX寄存器中),并返回单个整数结果(在EAX寄存器中)。要从C调用它,您将使用以下原型:

unsigned HowFarAway(unsigned n, unsigned b);

限于32位整数的范围。通过使用完整的长寄存器,可以轻松地对其进行修改以支持64位整数,但是对那些指令进行编码将花费更多的字节。:-)


因此,您不能将eax设置为少于4个字节的数字吗?
尼尔

嗯……不是理智的程序员会用的任何正常方式,但是您只能+ 3个字节。但是...那么您不必跳过乘法运算,因此这仍然是一个合理的节省,因为您可以删除。push 1pop raxjmp
科迪·格雷

啊,我知道一定有办法打高尔夫球!
尼尔

您可以使用Linux上的SysV调用约定(通过TIO演示)执行相同的操作
Digital Trauma

当然可以。您可以使用任何至少在寄存器中传递前两个整数参数的调用约定来实现。系统V,Win x64,Win32 __fastcall等。寄存器刚刚更改,我不得不选择一个。硬币出现在“ Windows”上。
科迪·格雷

6

C(gcc)39 35字节

借助Erik,新的未定义行为

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呢?
Leaky Nun

@LeakyNun因为这是将返回值保存到的第一个参数。
越野选手埃里克(Erik the Outgolfer)'17年

嗯,您没有更新代码。
乡村大佬埃里克(Erik the Outgolfer)'17年

你可以做b-=n,如果你交换的顺序bn
扎卡里

6

Dyalog APL,10个字节

@ZacharyT节省了2个字节

⊢-⍨⊣*1+∘⌊⍟

在线尝试!

注意到n作为右边的参数,并b为左参数。

计算。b⌊logbn + 1⌋ - n


好的,我正要发布这个确切的解决方案
Kritixi Lithos

@KritixiLithos我在地板技巧上很难过。您认为它可以制成火车吗?
Uriel

是啊,它可以:⊣-⍨⊢*1+∘⌊⍟⍨
扎卡里

@ZacharyT好人!
Uriel

我得到⊢-⍨⊣*1+∘⌊⍟10个字节,但参数交换了,所以这n是右参数,b而左参数是。我使用ZacharyT的技巧1+∘⌊来将其降低到这一程度。
Kritixi Lithos

6

R38 34字节

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

匿名函数。将b的所有值存储为[0,n]范围内所有值的幂,然后从每个n的子集中减去n,再返回最小值。

TIO具有非代理版本,称为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字节

-4个字节,感谢MickyT

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堆栈底部,掉头,弹出堆栈顶部(b^(counter)),然后增加计数器
  • IP在^w,程序继续。

在线观看!

在线尝试!


1
使用相同的过程,只是走不同的路Pwp.I|-.;)^0@O?|uq;<
MickyT

@MickyT天才!我觉得每次提交Cubix答案时,您都会删除4或5个字节...
Giuseppe


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:也可与过滤器一起使用,但不幸的是不会保存任何字节。
Emigna

1
不幸的是, @ Emigna 没有保存任何字节 *保存字节*
Erik the Outgolfer

@EriktheOutgolfer:是的,很好。这是利用隐式输入工作的奇怪方法节省了一个字节的另一项更改:)
Emigna

1
@carusocomputing:是的。实际上,它可以节省一个字节,以使它们以“错误”的顺序排列,因为我可以n隐式地在过滤器比较和绝对差计算中重用它们。
Emigna


2

MATL10 9字节

yy:YAn^w-

在线尝试!

说明

考虑输入6943作为一个例子。

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-#&

谢谢马丁

输入输出

[343,7]

2058


您可以使用1/Log@###2~Log~#。甚至更好地交换输入使用的顺序Log@##
Martin Ender

然后#^Floor[...]#比短#^(Floor[...]+1)。还有Unicode运算符Floor
Martin Ender

是的,当然可以。我正在处理所有这些。您很快!
J42161217 2015年

别忘了Log@##!实际上,如果交换参数顺序,则#^⌊Log@##⌋#-#2&应该有-5个字节(我认为)!
CalculatorFeline


2

R,30个字节

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

评估功能

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

它的第一个乘方大于或等于n,然后n从该值中减去。

更改ceiling(power)floor(power+1)确保如果n是的幂b,我们将使用下一个幂。


1

JavaScript(ES6),31个字节

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

测试用例:


您可以通过循环保存一个字节(无论我尝试同时循环一次nb还是一次都没关系n),因为这样可以使您不必n递归传递。
尼尔

感谢@Neil,但我在弄清楚该怎么做时有麻烦(?)
Rick Hitchcock

我想出的两个版本是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,反复乘以b直到严格超过a,然后返回差值。

在线尝试!

注意:结果永远不会为零,因此a>=v and f(a,b,v*b)or v-a可以将其替换为零(a<v)*(v-a)or f(a,b,v*b)而不会引起递归错误。


Python 3,37个字节?

使用rici的想法...

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

使用浮点算法(因此结果可能偏离其真实距离),请
在此处尝试


tio.run/…有点短,但是必须以“%.0f”格式输出结果可能会作弊。
rici

@rici很好,我认为可以使用浮点算法。我将其添加为替代方法(由于b-n永远不会同时为零,因此可以通过切换形式来保存另一个字节n<b)。
乔纳森·艾伦,



0

Lua,74 73字节

一个简单的解决方案,我使用10个字节来确保将参数视为数字,而不是字符串。输出到STDIN。

编辑:忘记删除空格w=1 n=n+0,节省一个字节

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很好,但之间的空间1end需要?
扎卡里

@ZacharyT在Lua中,如果十六进制数字以数字开头,则可以内联,1end将开始被解释为该数字,1e然后由于1en不是有效的十六进制值而引发错误。仅当数字后面的[abcdef]字母是其他字母不能解释为十六进制值-> w=1while不会引发错误时,才会发生这种情况。
Katenkyo

欢迎回到PPCG!
Leaky Nun

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

Python 3中50 48个字节

感谢EriktheOutgolfer节省了2个字节!

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

在线尝试!

Python没有任何花哨的日志或上限内置函数,因此我只是采用了明显的方法,并带有一点打高尔夫球的风格。


import math;lambda n,b:b**-~int(math.log(n,b))-n保存两个字节,并且每个元共识允许使用。
Outgolfer的埃里克(Erik)

@EriktheOutgolfer ceil无法正常工作。
Leaky Nun

我没有使用@EriktheOutgolfer,ceil因为它不适用于的幂b,但是正如@Uriel指出的,在导入之前仍会保存一个字节。
notjagan

您可以重新格式化以使其完全正常:在线尝试!。只需将放在importlambda之后,然后添加f=标题。
Xcoder先生17年

@ Mr.Xcoder啊,您是对的!我不知道为什么我没想到。
notjagan

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.