Encontre o número biquadrático mais próximo


18

Um número biquadrático é um número que é a quarta potência de outro número inteiro, por exemplo: 3^4 = 3*3*3*3 = 81

Dado um número inteiro como entrada, imprima o número biquadrático mais próximo.

Aqui estão os primeiros 15 quadrados duplos:

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

Isso é e o menor número de bytes em cada idioma ganha

Este é o OEIS A000583


É interessante notar que isso nunca ficará empatado, pois a sequência alterna números ímpares e pares.
Okx 10/07/19

5
você pode alterar o nome para "Encontre o zenzizenzico mais próximo". en.wiktionary.org/wiki/zenzizenzic
Destructible Lemon

1
@ Mayube É necessariamente, porque a sequência é justa n^4e nalterna no sinal.
Martin Ender

2
Essa nomenclatura de biquadrática é confuso: antes de ver os conteúdos de pergunta, eu pensei que eram os 2 x n²números: 2, 8, 18, 32, 50, 72, 98, ...
sergiol

2
Isso não é chamado de "quartic"? ( Merriam-Webster , Wikcionário )
Olivier Grégoire

Respostas:


15

Python 3 , 35 bytes

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

Experimente online!

Como funciona

O valor n no qual a saída muda de ( k - 1) 4 para k 4 satisfaz √ (√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, que é exatamente o primeiro número inteiro mais próximo de k 4 .

(Funciona para todos n ≤ 4504699340341245 = (8192 4 + 8193 4 - 7) / 2> 2 52 , após o qual o arredondamento de ponto flutuante começa a quebrá-lo, mesmo que funcione matematicamente para todos os n .)


Você pode salvar um byte roundse mudar para o Python 2, que arredonda todos os 0,5.
Xnor

8

Oitava , 35 bytes

Esse desafio precisava de uma abordagem baseada em convolução.

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

Experimente online!

Explicação

A expressão (1:n).^4produz o vetor de linha [1 16 81 256 ... n^4].

Esse vetor é então convolvido [1 1]/2, o que equivale a calcular a média deslizante dos blocos de tamanho 2. Isso implica implicitamente que o vetor é preenchido à esquerda e à direita 0. Portanto, o primeiro valor no resultado é 0.5(média de um implícito 0e 1), o segundo é 8.5(média de 1e 16), etc.

Como exemplo, para n = 9o resultado de conv((1:n).^4,[1 1]/2)é

0.5 8.5 48.5 168.5 440.5 960.5 1848.5 3248.5 5328.5 3280.5

A comparação n>...então gera

1 1 0 0 0 0 0 0 0 0 0

e aplicar sum(...)2. Isso significa que nexcede exatamente 2os pontos médios entre os números biquadráticos (incluindo o ponto médio adicional 0.5). Finalmente, ^4levanta isso 4para produzir o resultado 16,.


2
É ainda mais golfista!
flawr

7

Haskell , 51 49 bytes

Função monad ftw!

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

Experimente online!

Explicação:

                                (^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

Experimente online!

Explicação

Considere a entrada 9como um exemplo.

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𝕔

Explicação:

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

Experimente online!


2
Essa linguagem de programação parece usar caracteres Unicode ("𝕎" e "𝕔"). Esses caracteres geralmente requerem mais de um byte. Você tem certeza de que os 5 caracteres podem ser armazenados usando apenas 5 bytes?
Martin Rosenau


5

Excel, 25 bytes

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

O Excel atualiza isso para =INT((A1^0.5-3/4)^0.5+0.5)^4


1
Apenas uma nota na convenção para excel: é o padrão de fato que a função Excel e Excel VBA que take entrada do Excel.ActiveSheetobjeto levá-los a partir de célulasA1
Taylor Scott

1
@ TaylorScott, obrigado por apontar isso. Ter atualizado.
Wernisch



3

JavaScript (ES7), 42 bytes

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

Versão recursiva, 44 bytes

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

Demo



2

05AB1E , 6 bytes

LnnI.x

Experimente online!

Explicação

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*⍨⍳⍵}

Experimente online!

Quão?

o←4*⍨⍳⍵- o= intervalo ( ) 4 [vetorizar]

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

o/⍨- pegue o oelemento no índice em que ...

p=⌊/p- o pelemento mínimo é


2

Gelatina , 6 bytes

R*4ạÐṂ

Um link monádico retornando uma lista de um item ou um programa completo que imprime o resultado (usando um método ineficiente).

Experimente online!

Quão?

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

Versão 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);
}

LINK para tentar



1

R , 47 44 37 35 bytes

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

Experimente online!


você pode retornar uma função anônima (remoção f=) e em vez de x[which.min((x-n)^2)]uso which.min((x-n)^2)^4, e depois colocar f=no cabeçalho da ligação TIO para testar como aqui :)
Giuseppe

1
@ Giuseppe Oh, não há necessidade de definir xnada. Obrigado!
Maxim Mikhaylov

ah, então a única outra melhoria é receber a entrada de stdin n=scan();which.min(((1:n)^4-n)^2)^4e entrar na seção de rodapé no TIO.
Giuseppe

@ Giuseppe Thanks again! Útil saber para futuras respostas em R.
Maxim Mikhaylov



0

QBIC , 38 bytes

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

Explicação

{           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 um valor definido, pois qualquer valor maior excederá o valor int.

Versão completa / formatada:

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

Não tenho idéia do porquê de 0.75um número tão importante para isso, mas ei, o que quer que funcione.

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

Experimente online!


Isso não dará o biquadrático mais próximo. Por exemplo, ele irá retornar 256 para 151.
P.Péter
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.