Finde die nächste biquadratische Zahl


18

Eine biquadratische Zahl ist eine Zahl, die die vierte Potenz einer anderen Ganzzahl ist, zum Beispiel: 3^4 = 3*3*3*3 = 81

Geben Sie bei einer Ganzzahl als Eingabe die nächstliegende biquadratische Zahl aus.

Hier sind die ersten 15 Doppelquadrate:

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

Dies ist so dass die wenigsten Bytes in jeder Sprache gewinnen

Dies ist OEIS A000583


Interessant zu bemerken, dass dies niemals bindet, da die Sequenz ungerade und gerade Zahlen abwechselt.
Okx

5
Sie können den Namen in "Finde die nächste Zenzizenz" ändern. en.wiktionary.org/wiki/zenzizenzic
Destructible Lemon

1
@Mayube Das muss sein, denn die Reihenfolge ist gerade n^4und nwechselt im Vorzeichen.
Martin Ender

2
Diese biquadratische Nomenklatur ist verwirrend: Bevor ich den Inhalt der Frage sah, dachte ich, es 2 x n²
wären

2
Heißt das nicht "Quartic"? ( Merriam-Webster , Wiktionary )
Olivier Grégoire

Antworten:


15

Python 3 , 35 Bytes

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

Probieren Sie es online!

Wie es funktioniert

Der Wert n, bei dem der Ausgang von ( k - 1) 4 auf k 4 umschaltet, erfüllt √ (√n - 3/4) + 1/2 = k oder n = ((k - 1/2) 2 + 3 / 4) 2 = ( k 2 - k + 1) 2 = (( k - 1) 4 + k 4 + 1) / 2, was genau die erste ganze Zahl ist, die näher an k 4 ist .

(Funktioniert für alle n ≤ 4504699340341245 = (8192 4 + 8193 4 - 7) / 2> 2 52 , wonach die Gleitkommarundung beginnt, sie aufzubrechen, obwohl sie für alle n mathematisch funktioniert .)


Sie können ein Byte mit speichern, roundwenn Sie zu Python 2 wechseln, wodurch alle .5-Werte aufgerundet werden.
xnor

8

Oktave , 35 Bytes

Diese Herausforderung erforderte einen faltungsbasierten Ansatz.

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

Probieren Sie es online!

Erläuterung

Der Ausdruck (1:n).^4erzeugt den Zeilenvektor [1 16 81 256 ... n^4].

Dieser Vektor wird dann mit gefaltet [1 1]/2, was der Berechnung des gleitenden Durchschnitts der Größenblöcke entspricht 2. Dies setzt implizit voraus, dass der Vektor mit links und rechts aufgefüllt ist 0. Der erste Wert im Ergebnis ist also 0.5(Durchschnitt eines impliziten 0und 1), der zweite ist 8.5(Durchschnitt von 1und 16) usw.

Als Beispiel für n = 9das Ergebnis von conv((1:n).^4,[1 1]/2)ist

0.5 8.5 48.5 168.5 440.5 960.5 1848.5 3248.5 5328.5 3280.5

Der Vergleich n>...ergibt dann

1 1 0 0 0 0 0 0 0 0 0

und bewerben sum(...)gibt 2. Dies bedeutet, dass ngenau 2der Mittelpunkt zwischen zwei Zahlen (einschließlich des zusätzlichen Mittelpunkts 0.5) überschritten wird . Schließlich wird dies ^4erhöht 4, um das Ergebnis zu erhalten 16.


2
Es ist noch golfer!
Fehler

7

Haskell , 51 49 Bytes

Funktion monad ftw!

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

Probieren Sie es online!

Erläuterung:

                                (^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 Bytes

t:4^Yk

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe 9als Beispiel.

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 Bytes

𝐈4𝕎S𝕔

Erläuterung:

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

Probieren Sie es online!


2
Diese Programmiersprache scheint Unicode-Zeichen ("𝕎" und "𝕔") zu verwenden. Solche Zeichen erfordern normalerweise mehr als ein Byte. Sind Sie sicher, dass die 5 Zeichen nur mit 5 Bytes gespeichert werden können?
Martin Rosenau


5

Excel, 25 Bytes

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

Excel aktualisiert dies auf =INT((A1^0.5-3/4)^0.5+0.5)^4


1
Nur eine Anmerkung zur Konvention für Excel: Es ist de facto der Standard, dass Excel- und Excel VBA-Funktionen, die Eingaben vom Excel.ActiveSheetObjekt entgegennehmen, diese aus der Zelle übernehmenA1
Taylor Scott

1
@ TaylorScott, danke für den Hinweis. Aktualisiert haben.
Wernisch



3

JavaScript (ES7), 42 Byte

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

Rekursive Version, 44 Bytes

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

Demo




2

APL, 22 Bytes

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

Probieren Sie es online!

Wie?

o←4*⍨⍳⍵- o= range ( ) 4 [vektorisieren]

p←|⍵-⍨o- p= abs ( o- ) [vektorisieren]

o/⍨ - nehmen Sie die o Element am Index, wo ...

p=⌊/p- Das pminimale Element ist


2

Gelee , 6 Bytes

R*4ạÐṂ

Ein monadischer Link, der eine Liste mit einem Element zurückgibt, oder ein vollständiges Programm, das das Ergebnis druckt (unter Verwendung einer ineffizienten Methode).

Probieren Sie es online!

Wie?

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 Bytes

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

Vollversion:

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

LINK zum Ausprobieren



1

R , 47 44 37 35 Bytes

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

Probieren Sie es online!


Sie können eine anonyme Funktion zurückgeben (entfernen f=) und anstatt sie zu x[which.min((x-n)^2)]verwenden which.min((x-n)^2)^4, und sie dann wie hierf= in den Header des TIO-Links zum Testen einfügen :)
Giuseppe

1
@ Giuseppe Oh, es gibt keine Notwendigkeit, überhaupt zu definieren x. Vielen Dank!
Maxim Mikhaylov

ah, dann ist die einzige andere Verbesserung, die Eingabe von stdin zu nehmen, n=scan();which.min(((1:n)^4-n)^2)^4und die Eingabe geht in den Fußzeilenabschnitt von TIO.
Giuseppe

@ Giuseppe Nochmals vielen Dank! Nützlich für zukünftige Antworten in R.
Maxim Mikhaylov



0

QBIC , 38 Bytes

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

Erläuterung

{           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

95 Bytes

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

Wir verwenden 940 als Einstellwert, da jeder größere Wert den int überläuft.

Voll / Formatierte Version:

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

0

Ruby , 23 34 Bytes

Ich habe keine Ahnung, warum dies 0.75eine so wichtige Zahl ist, aber hey, was auch immer funktioniert.

->n{((n**0.5-0.75)**0.5).round**4}

Probieren Sie es online!


Dies wird nicht den nächsten biquadratischen geben. ZB wird es 256 für 151 zurückgeben.
P.Péter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.