查找最近的二次数


18

双二次数是另一个整数的四次幂的数字,例如: 3^4 = 3*3*3*3 = 81

给定一个整数作为输入,输出最接近的二次数。

这是前15个双平方:

1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000, 14641, 20736, 28561, 38416, 50625

这是因此每种语言中的最少字节数获胜

这是OEIS A000583


有趣的是,由于序列会交替使用奇数和偶数,因此这将永远不会造成麻烦。
Okx

5
您可以将名称更改为“查找最近的zenzizenzic”。en.wiktionary.org/wiki/zenzizenzic
破坏的柠檬

1
@Mayube确实可以,因为序列是正义的n^4并且n在符号上交替。
Martin Ender

2
二次方程式的术语令人困惑:在看到问题内容之前,我认为是2 x n²数字:
2、8、18、32、50、72、98

2
那不是所谓的“四次方”吗?(Merriam-Webster维基词典
OlivierGrégoire17年

Answers:


15

Python 3,35个字节

lambda n:int((n**.5-.75)**.5+.5)**4

在线尝试!

怎么运行的

输出从(k − 1)4切换到k 4的值n满足√(√n− 3/4)+ 1/2 = kn =((k − 1/2)2 + 3 / 4)2 =((k 2 - k + 1)2 =((k -1)4 + k 4 +1)/ 2,恰好是更接近k 4的第一个整数。

(适用于所有Ñ ≤4504699340341245 =(8192 4 + 8193 4 - 7)/ 2> 2 52,在这之后的浮点舍入开始打破它,即使它的工作原理数学上对所有Ñ。)


round如果您切换到Python 2(可将所有.5向上取整),则可以保存一个字节。
xnor

8

八度,35字节

这一挑战需要基于卷积的方法。

@(n)sum(n>conv((1:n).^4,[1 1]/2))^4

在线尝试!

说明

该表达式(1:n).^4产生行向量[1 16 81 256 ... n^4]

然后将此向量与卷积进行卷积[1 1]/2,等效于计算大小块的滑动平均值2。隐式地假定该向量用左右填充0。所以结果中的第一个值是0.5(隐式0和的平均值1),第二个为8.51和的平均值16),依此类推。

例如,对于n = 9的结果conv((1:n).^4,[1 1]/2)

0.5 8.5 48.5 168.5 440.5 960.5 1848.5 3248.5 5328.5 3280.5

然后比较n>...得出

1 1 0 0 0 0 0 0 0 0 0

sum(...)给予给予2。这意味着在双二次数之间(包括附加的中点),n正好超过了2中点0.5。最后,^4提出这个4产生结果,16


2
甚至更高尔夫!
瑕疵的

7

Haskell51 49字节

功能monad ftw!

f n=snd.minimum$(abs.(n-)<$>)>>=zip$(^4)<$>[1..n]

在线尝试!

说明:

                                (^4)<$>[1..n] -- creates a list of fourth powers
            (abs.(n-)<$>)>>=zip               -- creates a list of |n-(4th powers)| and
                                              -- zips it with the 4th powers list
    minimum                                   -- finds the minimum
                                              -- (only first tuple entry matters)
snd                                           -- exctracts the second entry (the 4th power)

6

MATL,6个字节

t:4^Yk

在线尝试!

说明

以输入9为例。

t    % Implicitly input n. Duplicate         
     % STACK: 9, 9
:    % Range [1 2 ... n]
     % STACK: 9, [1 2 3 4 5 6 7 8 9]
4^   % Raise to 4, element-wise
     % STACK: 9, [1 16 81 256 625 1296 2401 4096 6561]
Yk   % Closest element. Implicitly display
     % STACK: 16

5

Neim,5个字节

𝐈4𝕎S𝕔

说明:

𝐈       Inclusive range [1 .. input]
  𝕎    Raise to the  v  power
 4                   4th
     𝕔  Select the value closest to
    S   the input

在线尝试!


2
这种编程语言似乎使用Unicode字符(“𝕎”和“𝕔”)。此类字符通常需要一个以上的字节。您确定5个字符只能使用5个字节存储吗?
Martin Rosenau

3
@MartinRosenau Neim 使用自定义代码页
Okx

5

Excel,25个字节

=INT((A1^.5-3/4)^.5+.5)^4

Excel将其更新为 =INT((A1^0.5-3/4)^0.5+0.5)^4


1
只是关于excel惯例的注释:Excel和Excel VBA函数从Excel.ActiveSheet对象中获取输入是它们从单元格中获取的事实上的标准A1
Taylor Scott 2002年

1
@TaylorScott,感谢您指出这一点。已更新。
Wernisch '17


4

Brachylog,9个字节

;I≜+.~^₄∧

在线尝试!

说明

;I≜          I = 0 / I = 1 / I = -1 / I = 2 / etc. on backtracking
   +.        Output = Input + I
    .~^₄     Output = Something to the power 4
        ∧

3

JavaScript(ES7),42个字节

x=>(n=x**.25|0,x-(k=n**4)<++n**4-x?k:n**4)

递归版本,44字节

f=(x,k,b)=>(a=k**4)>x?a-x>x-b?b:a:f(x,-~k,a)

演示版



2

05AB1E,6个字节

LnnI.x

在线尝试!

说明

LnnI.x
L      # Push [1 .. input]
 nn    # Raise every element to the 4th power
   I   # Push input
    .x # Closest element in the array to input

2

APL,22字节

{o/⍨p=⌊/p←|⍵-⍨o←4*⍨⍳⍵}

在线尝试!

怎么样?

o←4*⍨⍳⍵- o= range(4 [向量化]

p←|⍵-⍨o- p= abs(o- [向量化]

o/⍨-将o元素放在索引处,...

p=⌊/p- p最小元素是


2

果冻,6 个字节

R*4ạÐṂ

一个单子链接,返回一个项目的列表,或者一个打印结果的完整程序(使用效率低的方法)。

在线尝试!

怎么样?

R*4ạÐṂ - Link: number, n
R      - range(n) -> [1,2,3,...,n]
 *4    - raise to the fourth power -> [1,16,81,...,n**4]
    ÐṂ - filter keep those (only ever one) minimal:
   ạ   -   absolute difference (with n)
       - if a full program: implicit print (one item lists print their content).


1

C ++,96个字节

int Q(int N){int i=1;while (pow(i,4)<N){i++;}if (pow(i,4)-N>N-pow(i-1,4)){i--;}return pow(i,4);}

完整版:

int Q(int N)
{
    int i = 1;

    while (pow(i, 4) < N)
    {
        i++;
    }

    if (pow(i, 4)-N > N-pow(i - 1, 4))
        i--;

    return pow(i,4);
}

链接尝试



1

R47 44 37 35字节

n=scan();which.min(((1:n)^4-n)^2)^4

在线尝试!


您可以返回一个匿名函数(removing f=)而不是x[which.min((x-n)^2)]use which.min((x-n)^2)^4,然后放入f=TIO链接的标头中进行测试:)
Giuseppe

1
@Giuseppe哦,根本不需要定义x。谢谢!
Maxim Mikhaylov

嗯,那么唯一的改进就是从stdin接收输入,n=scan();which.min(((1:n)^4-n)^2)^4并且输入进入TIO的页脚部分。
朱塞佩

@Giuseppe再次感谢!很有必要知道在未来R.答案
马克西姆米哈伊洛夫



0

QBIC,38个字节

{p=q^4~p>:|~p-a>a-o|_Xo\_Xp]\o=p┘q=q+1

说明

{           DO infinitely
p=q^4       Set p to q quad (q starts out as 1)
~p>:|       IF p exceeds the input THEN
~p-a>a-o    check the distance to p and to o (the last quad) and
|_Xo        PRINT o, or
\_Xp        PRINT p accordingly
]           END IF
\o=p        ELSE  ( p <= input) store p in o to keep track of this quad
┘q=q+1      and raise q for the next iteration



0

C#,95个字节

namespace System.Linq{n=>new int[940].Select((_,i)=>i*i*i*i).OrderBy(i=>Math.Abs(i-n)).First()}

我们使用940作为设置值,因为任何较大的值都会溢出int。

完整/格式化版本:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<int, int> f = n => new int[940].Select((_, i) => i * i * i * i).OrderBy(i => Math.Abs(i - n)).First();

            for (int i = 1; i <= Int32.MaxValue; ++i)
                Console.WriteLine($"{i} = {f(i)}");

            Console.ReadLine();
        }
    }
}

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.