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


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


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.


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)

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

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!


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


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



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



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

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


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


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



1

R , 47 44 37 35 octets

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

Essayez-le en ligne!


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



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

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!


Cela ne donnera pas le biquadratique le plus proche. Par exemple, il retournera 256 pour 151.
P.Péter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.