最も近い双二次数を見つける


18

双二次数は、別の整数の4乗の数です。次に例を示します。 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^4n記号で交互に。
マーティンエンダー

2
双二次の命名法は紛らわしいです:質問の内容を見る前に、私はそれが2 x n²数字だと思いました:
2、8、18、32、50、72、98

2
それは「四次」と呼ばれていませんか?(メリアム-ウェブスターウィクショナリー
オリヴィエグレゴワール

回答:


15

Python 3、35バイト

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

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

使い方

出力が(k − 1)4からk 4に切り替わる値nは、√(√n− 3/4)+ 1/2 = kまたはn =((k − 1/2)2 + 3 / 4)2 =(k 2k + 1)2 =((k − 1)4 + k 4 + 1)/ 2、これはまさにk 4に近い最初の整数です。

(ワークスすべてのためのn ≤4504699340341245 =(8192 4 + 8193 4 - 7)/ 2> 2 52、それはすべてのために数学的に動作していても、それを破るを開始丸めた浮動小数点の後のN)。


roundすべての.5を切り上げるPython 2に切り替えると、バイトを保存できます。
-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(暗黙の平均01)、第二は、8.5(平均116)、等

例として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。これは、2 次数の中間点(追加の中間点を含む)nを正確2に超えることを意味し0.5ます。最後に、^4これを上げ4て結果を生成し16ます。


2
ゴルファーです!
-flawr

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)


5

ニーム、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文字を保存できますか?
マーティンローゼナウ


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
テイラー・スコット

1
@TaylorScott、それを指摘してくれてありがとう。更新しました。
ヴェルニッシュ



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

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ạÐṂ

1つのアイテムのリストを返すモナドリンク、または結果を出力する完全なプログラム(非効率的な方法を使用)。

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

どうやって?

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

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


を使用するf=代わりに匿名関数を返し(削除)、次に次のようなテストのためにTIOリンクのヘッダーに入れることができます:)x[which.min((x-n)^2)]which.min((x-n)^2)^4f=
ジュゼッペ

1
@Giuseppeああ、まったく定義する必要はありませんx。ありがとうございました!
マキシムミハイロフ

ああ、それから他の唯一の改善点は、stdinから入力を取得することでn=scan();which.min(((1:n)^4-n)^2)^4あり、入力はTIOのフッターセクションに入ります。
ジュゼッペ

@ジュゼッペありがとうございます!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()}

大きい値はintをオーバーフローさせるため、940を設定値として使用します。

完全/フォーマット済みバージョン:

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();
        }
    }
}

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