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

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

Anders Kaseorg
fuente
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,.

Luis Mendo
fuente
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)
falla
fuente
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
Luis Mendo
fuente
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!

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

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

Mathematica, 21 bytes

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

Brachylog , 9 bytes

;I≜+.~^₄∧

Pruébalo en línea!

Explicación

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

Arnauld
fuente
3

Octava , 37 bytes

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

Función anónima que utiliza la interpolación del vecino más cercano.

Pruébalo en línea!

Luis Mendo
fuente
2
-1 no conv :(
flawr
1
@flawr ¿ Esto te hace sentir mejor?
Luis Mendo
1
¡Lo hace mucho!
flawr
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
Datboi
fuente
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

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

koita_pisw_sou
fuente
1

R , 47 44 37 35 bytes

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

Pruébalo en línea!

Maxim Mikhaylov
fuente
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

Japt , 20 bytes

¡Esto se siente demasiado tiempo!


õp4
V®nU a
VgWaWrmU

Pruébalo

Lanudo
fuente
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
Steenbergh
fuente
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();
        }
    }
}
TheLethalCoder
fuente
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!

Tinta de valor
fuente
Esto no dará el biquadratic más cercano. Por ejemplo, devolverá 256 para 151.
P.Péter