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

Skidsdev
quelle
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 .)

Anders Kaseorg
quelle
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.

Luis Mendo
quelle
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)
fehlerhaft
quelle
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
Luis Mendo
quelle
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!

Okx
quelle
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

Wernisch
quelle
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
4

Mathematica, 21 Bytes

Nearest[Range@#^4,#]&
Martin Ender
quelle
4

Brachylog , 9 Bytes

;I≜+.~^₄∧

Probieren Sie es online!

Erläuterung

;I≜          I = 0 / I = 1 / I = -1 / I = 2 / etc. on backtracking
   +.        Output = Input + I
    .~^₄     Output = Something to the power 4
        ∧
Tödlich
quelle
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

Arnauld
quelle
3

Oktave , 37 Bytes

@(n)interp1(t=(1:n).^4,t,n,'nearest')

Anonyme Funktion, die die Nächste-Nachbarn-Interpolation verwendet.

Probieren Sie es online!

Luis Mendo
quelle
2
-1 no conv :(
flawr
1
@flawr Does diese fühlen Sie sich besser?
Luis Mendo
1
Das tut es sehr!
Fehler
2

05AB1E , 6 Bytes

LnnI.x

Probieren Sie es online!

Erläuterung

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
Datboi
quelle
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

Uriel
quelle
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).
Jonathan Allan
quelle
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

koita_pisw_sou
quelle
1

Haskell, 35 Bytes

f n=(floor$(n**0.5-3/4)**0.5+0.5)^4

Port of Anders 'Python3 Antwort .

CR Drost
quelle
1

R , 47 44 37 35 Bytes

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

Probieren Sie es online!

Maxim Mikhaylov
quelle
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
steenbergh
quelle
0

Common Lisp, 50 Bytes

(lambda(x)(expt(floor(+(sqrt(-(sqrt x).75)).5))4))

Probieren Sie es online!

Renzo
quelle
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();
        }
    }
}
TheLethalCoder
quelle
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!

Wert Tinte
quelle
Dies wird nicht den nächsten biquadratischen geben. ZB wird es 256 für 151 zurückgeben.
P.Péter