Trouver le numéro biquadratique le plus proche

18

Un nombre biquadratique est un nombre qui est la quatrième puissance d'un autre entier, par exemple: 3^4 = 3*3*3*3 = 81

Étant donné un entier en entrée, affichez le nombre biquadratique le plus proche.

Voici les 15 premiers doubles carrés:

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

C'est donc le moins d'octets dans chaque langue gagne

C'est OEIS A000583

Skidsdev
la source
Il est intéressant de noter que cela ne sera jamais lié, car la séquence alterne les nombres pairs et impairs.
Okx
5
vous pouvez changer le nom en "Trouver le zenzizenzic le plus proche". en.wiktionary.org/wiki/zenzizenzic
Destructible Lemon
1
@Mayube C'est forcément le cas, car la séquence est juste n^4et nalterne en signe.
Martin Ender
2
Cette nomenclature du biquadratique est déroutante: avant de voir le contenu de la question, je pensais que c'était les 2 x n²chiffres: 2, 8, 18, 32, 50, 72, 98, ...
sergiol
2
N'est-ce pas appelé "quartique"? ( Merriam-Webster , Wiktionnaire )
Olivier Grégoire

Réponses:

15

Python 3 , 35 octets

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

Essayez-le en ligne!

Comment ça fonctionne

La valeur n à laquelle la sortie passe de ( k - 1) 4 à k 4 satisfait √ (√n - 3/4) + 1/2 = k , ou n = ((k - 1/2) 2 + 3 / 4) 2 = ( k 2 - k + 1) 2 = (( k - 1) 4 + k 4 + 1) / 2, qui est exactement le premier entier le plus proche de k 4 .

(Fonctionne pour tous n ≤ 4504699340341245 = (8192 4 + 8193 4 - 7) / 2> 2 52 , après quoi l'arrondi à virgule flottante commence à le casser, même s'il fonctionne mathématiquement pour tout n .)

Anders Kaseorg
la source
Vous pouvez enregistrer un octet avec roundsi vous passez à Python 2 qui arrondit tous les 0,5.
xnor
8

Octave , 35 octets

Ce défi nécessitait une approche par convolution.

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

Essayez-le en ligne!

Explication

L'expression (1:n).^4produit le vecteur ligne [1 16 81 256 ... n^4].

Ce vecteur est ensuite convolué avec [1 1]/2, ce qui équivaut à calculer la moyenne glissante des blocs de taille 2. Cela suppose implicitement que le vecteur est rempli à gauche et à droite avec 0. Ainsi, la première valeur du résultat est 0.5(moyenne d'un implicite 0et 1), la seconde est 8.5(moyenne d'un 1et 16), etc.

Par exemple, pour n = 9le résultat de conv((1:n).^4,[1 1]/2)est

0.5 8.5 48.5 168.5 440.5 960.5 1848.5 3248.5 5328.5 3280.5

La comparaison n>...donne alors

1 1 0 0 0 0 0 0 0 0 0

et appliquer sum(...)donne 2. Cela signifie que ndépasse exactement 2les points médians entre les nombres biquadratiques (y compris le point médian supplémentaire 0.5). Enfin, ^4soulève cela 4pour obtenir le résultat, 16.

Luis Mendo
la source
2
C'est encore plus golfeur!
flawr
7

Haskell , 51 49 octets

Fonction monade ftw!

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

Essayez-le en ligne!

Explication:

                                (^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)
flawr
la source
6

MATL , 6 octets

t:4^Yk

Essayez-le en ligne!

Explication

Considérez l'entrée 9comme exemple.

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
la source
5

Neim , 5 octets

𝐈4𝕎S𝕔

Explication:

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

Essayez-le en ligne!

Okx
la source
2
Ce langage de programmation semble utiliser des caractères Unicode ("𝕎" et "𝕔"). Ces caractères nécessitent généralement plus d'un octet. Êtes-vous sûr que les 5 caractères peuvent être stockés en utilisant seulement 5 octets?
Martin Rosenau
5

Excel, 25 octets

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

Excel le met à jour =INT((A1^0.5-3/4)^0.5+0.5)^4

Wernisch
la source
1
Juste une note sur la convention pour Excel: c'est la norme de facto qu'Excel et la fonction VBA d'Excel qui prennent l'entrée de l' Excel.ActiveSheetobjet les prennent de la celluleA1
Taylor Scott
1
@TaylorScott, merci de l'avoir signalé. Ont mis à jour.
Wernisch
4

Mathematica, 21 octets

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

Brachylog , 9 octets

;I≜+.~^₄∧

Essayez-le en ligne!

Explication

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

JavaScript (ES7), 42 octets

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

Version récursive, 44 octets

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

Démo

Arnauld
la source
3

Octave , 37 octets

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

Fonction anonyme qui utilise l'interpolation du plus proche voisin.

Essayez-le en ligne!

Luis Mendo
la source
2
-1 no conv :(
flawr
1
@flawr Est-ce que cela vous donne le sentiment de mieux?
Luis Mendo
1
C'est très bien ainsi!
flawr
2

05AB1E , 6 octets

LnnI.x

Essayez-le en ligne!

Explication

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
la source
2

APL, 22 octets

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

Essayez-le en ligne!

Comment?

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

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

o/⍨- prendre l' oélément à l'index où ...

p=⌊/p- l' pélément minimum est

Uriel
la source
2

Gelée , 6 octets

R*4ạÐṂ

Un lien monadique renvoyant une liste d'un élément, ou un programme complet qui imprime le résultat (en utilisant une méthode inefficace).

Essayez-le en ligne!

Comment?

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
la source
1

C ++, 96 octets

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

Version complète:

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

LIEN pour essayer

koita_pisw_sou
la source
1

Haskell, 35 octets

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

Réponse Python3 du port d' Anders .

CR Drost
la source
1

R , 47 44 37 35 octets

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

Essayez-le en ligne!

Maxim Mikhaylov
la source
vous pouvez retourner une fonction anonyme (supprimer f=) et au lieu de l' x[which.min((x-n)^2)]utiliser which.min((x-n)^2)^4, puis la mettre f=dans l'en-tête du lien TIO pour tester comme ici :)
Giuseppe
1
@Giuseppe Oh, il n'est pas nécessaire de définir xdu tout. Je vous remercie!
Maxim Mikhaylov
ah, alors la seule autre amélioration est de prendre l'entrée de stdin, n=scan();which.min(((1:n)^4-n)^2)^4et l'entrée va dans la section de pied de page sur TIO.
Giuseppe
@Giuseppe Merci encore! Utile à savoir pour les réponses futures dans R.
Maxim Mikhaylov
0

QBIC , 38 octets

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

Explication

{           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
la source
0

Lisp commun, 50 octets

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

Essayez-le en ligne!

Renzo
la source
0

C #, 95 octets

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

Nous utilisons 940 comme valeur de réglage car toute valeur plus grande débordera l'int.

Version complète / formatée:

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
la source
0

Rubis , 23 34 octets

Je n'ai aucune idée pourquoi 0.75est-ce un nombre si important pour cela, mais bon, peu importe ce qui fonctionne.

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

Essayez-le en ligne!

Encre de valeur
la source
Cela ne donnera pas le biquadratique le plus proche. Par exemple, il retournera 256 pour 151.
P.Péter