整数对数


12

鉴于整数N , P > 1,找到最大的整数M这样P ^ M ≤ N

输入/输出:

输入为2个整数NP。输出将是整数M

例子:

4, 5 -> 0
33, 5 -> 2
40, 20 -> 1
242, 3 -> 4 
243, 3 -> 5 
400, 2 -> 8
1000, 10 -> 3

笔记:

输入将始终有效,即它将始终是大于1的整数。

学分:

该名称的信誉归@cairdcoinheringaahing所有。最后3个示例由@Nitrodon提供,改进说明的功劳归@Giuseppe所有。


3
我知道我们(PPCG社区)似乎对很小的事情过于挑剔,但是真诚地希望像我这样的言论可以使挑战变得更好!现在已经解决了,我很乐意投票,并删除了我之前的评论。
朱塞佩

9
这就是为什么我们建议首先将挑战发布到The Sandbox中的另一个原因,以便您可以收到有用的反馈,发布重大挑战并获得许多高质量的答案,而不必大惊小怪(例如,近票和反对票)。:)
Giuseppe

2
您随时可以在一般的PPCG聊天室中发帖要求您提供有关沙盒挑战的反馈,以吸引他们更多的注意力。
朱塞佩

12
由于舍入误差,即使对于(1000,10)这样的简单情况,几乎所有基于浮点数学的当前答案都会产生错误的结果,因此我添加了另一个测试用例。
nwellnhof '18

3
@MPW,所有回复均被删除,我的建议已被编辑到帖子中,因此它们不再相关。
朱塞佩

Answers:


8

脑高射炮,74个字节

(({}<>)[()])({()<(({})<({([{}]()({}))([{}]({}))}{})>){<>({}[()])}{}>}[()])

在线尝试!

这使用与标准Brain-Flak正整数除法算法相同的概念。

# Push P and P-1 on other stack
(({}<>)[()])

# Count iterations until N reaches zero:
({()<

  # While keeping the current value (P-1)*(P^M) on the stack:
  (({})<

    # Multiply it by P for the next iteration
    ({([{}]()({}))([{}]({}))}{})

  >)

  # Subtract 1 from N and this (P-1)*(P^M) until one of these is zero
  {<>({}[()])}{}

# If (P-1)*(P^M) became zero, there is a nonzero value below it on the stack
>}

# Subtract 1 from number of iterations
[()])

7

JavaScript(ES6),22个字节

@Neil节省了8个字节

以currying语法接受输入(p)(n)

p=>g=n=>p<=n&&1+g(n/p)

在线尝试!


6

Excel,18个字节

=TRUNC(LOG(A1,A2))

在A1处输入“ n”,在A2处输入“ p”。


我认为您可以使用INT函数代替TRUNC节省2个字节。
pajonk

4

果冻,3个字节

bḊL

这不使用浮点运算,因此不存在精度问题。

在线尝试!

怎么运行的

bḊL  Main link. Left argument: n. Right argument: p

b    Convert n to base p.
 Ḋ   Dequeue; remove the first base-p digit.
  L  Take the length.

3

视网膜0.8.2,35字节

.+
$*
+r`1*(\2)+¶(1+)$
#$#1$*1¶$2
#

在线尝试!说明:

.+
$*

将参数转换为一元。

+r`1*(\2)+¶(1+)$
#$#1$*1¶$2

如果第二个参数将第一个参数除以第一个参数,则将第一个参数替换为#加整数结果,并丢弃其余的结果。重复此操作,直到第一个参数小于第二个参数。

#

计算循环运行的次数。


3

Japt,8个字节

@<Vp°X}a

尝试一下


这真的很整洁,我还没真正在Japt中看到函数方法的好用法,这是一个很好的例子。
Nit

@Nit,我也花了很多时间来了解它们-直到最近才开始弄清楚它们的用途F.g()-但它们非常有用。
毛茸茸的


3

Perl 6、13个字节

&floor∘&log

在线尝试!

组成日志和下限的串联隐式具有2个参数,因为第一个函数日志需要2。结果是一个函数。


3
对于参数,1000, 10返回
肖恩

@Sean:呵呵,那里有趣的精度问题
Phil H,


3

R,25个字节

function(p,n)log(p,n)%/%1

在线尝试!

Pbase的对数,N并用做整数除法1,因为它比短floor()。这有点受数值精度的影响,因此我也给出了以下答案,除了可能的整数溢出外,不应该这样做。

R,31个字节

function(p,n)(x=p:0)[n^x<=p][1]

在线尝试!


1
我不知道挑战要求我们对舍入误差有多严格,但是例如,f(243,3)可能等于5时等于4。–
JDL

@JDL很公平;我相信一个完全精确的答案将是〜31个字节。
朱塞佩

1
我想你可以替换p通过p+.1在25个字节的答案,你还是会好起来的,为28个字节
JDL



2

红宝石,31个字节

好的,因此所有这些基于日志的方法都容易出现舍入错误,因此这是另一种适用于整数并且没有这些问题的方法:

->n,p{(0..n).find{|i|p**i>n}-1}

在线尝试!

但是回到对数,虽然目前尚不清楚我们必须支持输入的精度,但是我认为这个小技巧可以解决几乎所有“现实”数字的舍入问题:

Ruby,29个字节

->n,p{Math.log(n+0.1,p).to_i}

在线尝试!





2

05AB1E,6个字节

Lm¹›_O

在线尝试!


这对其他所有人似乎都不公平
Floris

1
@Floris比赛是在每种语言的提交之间进行,而不是在两种语言之间进行,对吗?
user202729 '18

@ user202729是和否。在我看来,最后,“最短的代码胜出”。但是我注意到还有2字节的解决方案……这些高尔夫语言让我震惊。
弗洛里斯'18

1
@Floris“不要让代码高尔夫语言阻止您使用非代码高尔夫语言发布答案。尝试为“任何”编程语言提供尽可能简短的答案。”
user202729 '18

1
@Floris也... 甚至Excel都可以在2个内建函数中做到这一点。高尔夫语言也可以在2个内置语言中执行此操作,只是内置名称较短。没什么奇怪的。
user202729 '18


2

Pari / GP,6个字节

logint

(内置功能在2014年3月的2.7版中添加。采用两个参数,并带有可选的第三个引用,如果存在,则将其设置为结果的基数)


来自Pari / GP和Perl / ntheory的@StewieGriffin logint(x,y)给出了当前显示的7个示例的正确结果,包括1000,10的“ 3”。
DanaJ '18年

+1,但我将其计为6个字节。
查尔斯

2
您不允许使用硬编码的输入,因此它必须是一个函数(例如,作为lambda或定义)。但是,您可以只使用logint有效的计数,少计数5个字节。
ბიმო





1

Wolfram语言(Mathematica)15 10字节

Floor@*Log 

(要求输入颠倒顺序)

原始提交

⌊#2~Log~#⌋&

⌊Log@##⌋&是短一个字节
Lukas Lang

@ Mathe172,这短了一个字符,但是我算了13个字节。在UTF-8中,左楼层和右楼层分别计为3个字节。
凯利·洛德

@StewieGriffin%[10,1000]给出3。除非将输入放在小数点后,否则输入将被视为整数而不是机器号。
凯利·劳德

1

第四(gforth),35字节

: f swap s>f flog s>f flog f/ f>s ;

在线尝试!

可以通过交换预期的输入参数来节省5个字节,但问题指定N必须位于第一个位置(可以使用后缀语言表示为“ First”表示栈顶,但我会坚持使用以下规则的含义:现在)

说明

swap       \ swap the parameters to put N on top of the stack
s>f flog   \ move N to the floating-point stack and take the log(10) of N
s>f flog   \ move P to the floating-point stack and take the log(10) of P
f/         \ divide log10(N) by log10(P)
f>s        \ move the result back to the main (integer) stack, truncating in the process

1

Pyth,6个 4字节

s.lF

保存2个字节感谢Mmenomic
在线试玩

怎么运行的

.l是日志B(A)
说实话,我不知道它是如何F工作的。但是,如果有效,它就会起作用。
s将float截断为int以为赋予我们最大的整数M


2
1000,10作为输入给出2作为输出
Stewie Griffin

另一个类似的解决方案是/FlM
RK。

1

难怪,9个字节

|_.sS log

用法示例:

(|_.sS log)[1000 10]

说明

详细版本:

floor . sS log

这是写无点样式。sS将列表项作为参数传递给函数(在本例中为log)。


1

Gforth,31字节

SWAP S>F FLOG S>F FLOG F/ F>S .

用法

242 3 SWAP S>F FLOG S>F FLOG F/ F>S . 4 OK

在线尝试!

说明

不幸的是,FORTH使用了专用的浮点堆栈。为此,我必须SWAP(交换)输入值,以便它们以正确的顺序到达浮点堆栈。我还必须使用将值移动到该堆栈S>F。将浮点结果移回整数(F>S)时,我有免费获得截断的好处。

短版

扩展需求并以浮点格式和正确的顺序提供输入,有一个较短的版本,具有24个字节。

FLOG FSWAP FLOG F/ F>S .
3e0 242e0 FLOG FSWAP FLOG F/ F>S . 4 OK

在线尝试!


通常,对于CodeGolf答案,不允许使用摘要(除非在挑战中另有说明)。此答案要么应用功能包裹(字在Forth中): f .... ;或使用转换成一个程序,它输入KEYACCEPT
reffu

@reffu什么是代码段?在我看来,一个小的代码部分可以显示某些内容,但是这本身并没有任何意义。另一方面,我提供的代码可以正常运行,而无需更改“在线试用!”。我们应该去元吗?
Kitana '18

在这种情况下,除非您将参数放在前面,否则您发布的代码实际上将引发堆栈下溢。打高尔夫球的代码答案通常应该是一个独立的程序或函数,如果稍后调用,它会产生预期的结果。如果您在我之前的评论中单击了指向元文章的链接,则它明确提到该标准是将答案作为程序或函数,而您的答案或标准都不是。要解决这个问题就只需要另一个4个字节
reffu



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.