Encuentra el número biquadratico más cercano


18

Un número biquadratico es un número que es la cuarta potencia de otro número entero, por ejemplo: 3^4 = 3*3*3*3 = 81

Dado un entero como entrada, genera el número biquadratico más cercano.

Aquí están los primeros 15 cuadrados dobles:

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

Este es el por lo que gana menos bytes en cada idioma

Esto es OEIS A000583


Es interesante notar que esto nunca se vinculará, ya que la secuencia alterna los números pares e impares.
Okx

55
puede cambiar el nombre a "Buscar el zenzizenzic más cercano". en.wiktionary.org/wiki/zenzizenzic
Destructible Lemon

1
@Mayube necesariamente lo hace, porque la secuencia es justa n^4y nalterna en signo.
Martin Ender

2
Esa nomenclatura de biquadratic es confusa: antes de ver el contenido de la pregunta, pensé que eran los 2 x n²números: 2, 8, 18, 32, 50, 72, 98, ...
sergiol

2
¿No se llama eso "cuartico"? ( Merriam-Webster , Wiktionary )
Olivier Grégoire

Respuestas:


15

Python 3 , 35 bytes

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

Pruébalo en línea!

Cómo funciona

El valor n al cual la salida cambia de ( k - 1) 4 a k 4 satisface √ (√n - 3/4) + 1/2 = k , o n = ((k - 1/2) 2 + 3 / 4) 2 = ( k 2 - k + 1) 2 = (( k - 1) 4 + k 4 + 1) / 2, que es exactamente el primer entero más cercano a k 4 .

(Funciona para todos n ≤ 4504699340341245 = (8192 4 + 8193 4 - 7) / 2> 2 52 , después de lo cual el redondeo de punto flotante comienza a romperlo, a pesar de que funciona matemáticamente para todos los n .)


Puede guardar un byte con roundsi cambia a Python 2 que redondea todos los .5.
xnor

8

Octava , 35 bytes

Este desafío necesitaba un enfoque basado en la convolución.

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

Pruébalo en línea!

Explicación

La expresión (1:n).^4produce el vector fila [1 16 81 256 ... n^4].

Este vector se convoluciona con [1 1]/2, lo que es equivalente a calcular el promedio deslizante de bloques de tamaño 2. Esto supone implícitamente que el vector está rellenado con izquierda y derecha 0. Entonces, el primer valor en el resultado es 0.5(promedio de un implícito 0y 1), el segundo es 8.5(promedio de 1y 16), etc.

Como ejemplo, para n = 9el resultado de conv((1:n).^4,[1 1]/2)es

0.5 8.5 48.5 168.5 440.5 960.5 1848.5 3248.5 5328.5 3280.5

La comparación n>...entonces produce

1 1 0 0 0 0 0 0 0 0 0

y aplicando sum(...)da 2. Esto significa que nexcede exactamente 2de los puntos medios entre los números biquadráticos (incluido el punto medio adicional 0.5). Finalmente, ^4plantea esto 4para producir el resultado 16,.


2
¡Es incluso más golfista!
flawr

7

Haskell , 51 49 bytes

Función mónada ftw!

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

Pruébalo en línea!

Explicació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)

6

MATL , 6 bytes

t:4^Yk

Pruébalo en línea!

Explicación

Considere la entrada 9como un ejemplo.

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𝕔

Explicación:

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

Pruébalo en línea!


2
Este lenguaje de programación parece usar caracteres Unicode ("𝕎" y "𝕔"). Tales caracteres generalmente requieren más de un byte. ¿Estás seguro de que los 5 caracteres se pueden almacenar usando solo 5 bytes?
Martin Rosenau


5

Excel, 25 bytes

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

Excel actualiza esto a =INT((A1^0.5-3/4)^0.5+0.5)^4


1
Solo una nota sobre la convención para excel: es el estándar de facto que las funciones de Excel y Excel VBA que toman la entrada del Excel.ActiveSheetobjeto las toman de la celdaA1
Taylor Scott

1
@ TaylorScott, gracias por señalarlo. Han actualizado
Wernisch



3

JavaScript (ES7), 42 bytes

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

Versión recursiva, 44 bytes.

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

Manifestación



2

05AB1E , 6 bytes

LnnI.x

Pruébalo en línea!

Explicación

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 bytes

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

Pruébalo en línea!

¿Cómo?

o←4*⍨⍳⍵- o= rango ( ) 4 [vectorizar]

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

o/⍨ - toma el o elemento en el índice donde ...

p=⌊/p- el pelemento mínimo es


2

Jalea , 6 bytes

R*4ạÐṂ

Un enlace monádico que devuelve una lista de un elemento, o un programa completo que imprime el resultado (usando un método ineficiente).

Pruébalo en línea!

¿Cómo?

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

Versión completa:

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

ENLACE para probar



1

R , 47 44 37 35 bytes

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

Pruébalo en línea!


puede devolver una función anónima (eliminar f=) y en lugar de x[which.min((x-n)^2)]usarla which.min((x-n)^2)^4, y luego ponerla f=en el encabezado del enlace TIO para probar como aquí :)
Giuseppe

1
@Giuseppe Oh, no hay necesidad de definir xen absoluto. ¡Gracias!
Maxim Mikhaylov

ah, entonces la única otra mejora es tomar la entrada de stdin, n=scan();which.min(((1:n)^4-n)^2)^4y la entrada va a la sección de pie de página en TIO.
Giuseppe

@Giuseppe Gracias de nuevo! Útil para saber para futuras respuestas en R.
Maxim Mikhaylov



0

QBIC , 38 bytes

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

Explicación

{           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 bytes

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

Usamos 940 como valor establecido ya que cualquier valor mayor desbordará el int.

Versión completa / formateada:

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

No tengo idea de por qué 0.75es un número tan importante para esto, pero bueno, lo que sea que funcione.

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

Pruébalo en línea!


Esto no dará el biquadratic más cercano. Por ejemplo, devolverá 256 para 151.
P.Péter
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.