Найти ближайшее биквадратичное число

18

Биквадратичное число - это число, которое является четвертой степенью другого целого числа, например: 3^4 = 3*3*3*3 = 81

Если в качестве входных данных указать целое число, выведите ближайший биквадратный номер.

Вот первые 15 двойных квадратов:

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

Это поэтому побеждает меньше байтов на каждом языке

Это OEIS A000583

Skidsdev
источник
Интересно отметить, что это никогда не будет связывать, поскольку последовательность чередует нечетные и четные числа.
Okx
5
Вы можете изменить название на «Найти ближайший zenzizenzic». en.wiktionary.org/wiki/zenzizenzic
Разрушаемый лимон
1
@Mayube Это обязательно так, потому что последовательность как раз n^4и nчередуется в знаке.
Мартин Эндер
2
Эта номенклатура биквадратиков вводит в заблуждение: прежде чем увидеть содержание вопроса, я подумал, что это 2 x n²числа: 2, 8, 18, 32, 50, 72, 98, ...
sergiol
2
Разве это не называется "квартикой"? ( Merriam-Webster , Wiktionary )
Оливье Грегуар

Ответы:

15

Python 3 , 35 байт

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

Попробуйте онлайн!

Как это устроено

Значение n, при котором выход переключается с ( k - 1) 4 на k 4, удовлетворяет условию √ (√n - 3/4) + 1/2 = k или n = ((k - 1/2) 2 + 3 / 4) 2 = ( k 2 - k + 1) 2 = (( k - 1) 4 + k 4 + 1) / 2, что является точно первым целым числом, которое ближе к k 4 .

(Работает для всех n ≤ 4504699340341245 = (8192 4 + 8193 4 - 7) / 2> 2 52 , после чего округление с плавающей запятой начинает его разбивать, даже если оно работает математически для всех n .)

Андерс Касеорг
источник
Вы можете сохранить байт, roundесли переключитесь на Python 2, который округляет все .5.
xnor
8

Октава , 35 байт

Этот вызов требовал подхода, основанного на свертке.

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

Попробуйте онлайн!

объяснение

Выражение (1:n).^4создает вектор строки [1 16 81 256 ... n^4].

Этот вектор затем сворачивается с [1 1]/2, что эквивалентно вычислению скользящего среднего для блоков размера 2. Это подразумевает, что вектор дополняется слева и справа 0. Таким образом, первое значение в результате 0.5(среднее из неявного 0и 1), второе 8.5(среднее из 1и 16) и т. Д.

В качестве примера, для n = 9результата 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

Сравнение n>...тогда дает

1 1 0 0 0 0 0 0 0 0 0

и подачи sum(...)дает 2. Это означает, что оно nточно превышает 2средние точки между биквадратичными числами (включая дополнительную среднюю точку 0.5). И, наконец, ^4поднимает это , 4чтобы получить результат, 16.

Луис Мендо
источник
2
Это даже в гольф!
17
7

Haskell , 51 49 байтов

Функция монады ФТВ!

f n=snd.minimum$(abs.(n-)<$>)>>=zip$(^4)<$>[1..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)
flawr
источник
6

MATL , 6 байтов

t:4^Yk

Попробуйте онлайн!

объяснение

Рассмотрим ввод 9в качестве примера.

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

Нейм , 5 байт

𝐈4𝕎S𝕔

Объяснение:

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

Попробуйте онлайн!

Okx
источник
2
Этот язык программирования использует символы Unicode («𝕎» и «𝕔»). Такие символы обычно требуют более одного байта. Вы уверены, что 5 символов могут быть сохранены с использованием только 5 байтов?
Мартин Розенау
5

Excel, 25 байт

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

Excel обновляет это =INT((A1^0.5-3/4)^0.5+0.5)^4

Wernisch
источник
1
Просто примечание к соглашению для Excel: это де-факто стандарт, согласно которому функции Excel и Excel VBA, Excel.ActiveSheetA1
Тейлор Скотт,
1
@TaylorScott, спасибо за указание на это. Обновили.
Верниш
4

Mathematica, 21 байт

Nearest[Range@#^4,#]&
Мартин Эндер
источник
3

JavaScript (ES7), 42 байта

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

Рекурсивная версия, 44 байта

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

демонстрация

Arnauld
источник
3

Октава , 37 байт

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

Анонимная функция, использующая интерполяцию ближайшего соседа.

Попробуйте онлайн!

Луис Мендо
источник
2
-1 нет conv :(
flawr
1
@flawr Это заставляет тебя чувствовать себя лучше?
Луис Мендо
1
Это очень много делает!
flawr
2

APL, 22 байта

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

Попробуйте онлайн!

Как?

o←4*⍨⍳⍵- o= range ( ) 4 [векторизация]

p←|⍵-⍨o- p= abs ( o- ) [векторизация]

o/⍨- взять oэлемент по индексу, где ...

p=⌊/p- pминимальный элемент

Уриэль
источник
2

Желе , 6 байт

R*4ạÐṂ

Монадическая ссылка, возвращающая список из одного элемента, или полная программа, которая печатает результат (используя неэффективный метод).

Попробуйте онлайн!

Как?

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 байт

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

Полная версия:

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

ССЫЛКА, чтобы попробовать

koita_pisw_sou
источник
1

R , 47 44 37 35 байт

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

Попробуйте онлайн!

Максим Михайлов
источник
вы можете вернуть анонимную функцию (удаление f=) и вместо x[which.min((x-n)^2)]использования which.min((x-n)^2)^4, а затем поместить f=в заголовок ссылки
Giuseppe
1
@ Giuseppe О, нет нужды определять xвообще. Спасибо!
Максим Михайлов
ах, тогда единственное другое улучшение - это ввод данных из stdin, n=scan();which.min(((1:n)^4-n)^2)^4и ввод идет в раздел нижнего колонтитула на TIO.
Джузеппе
@ Giuseppe Еще раз спасибо! Полезно знать для будущих ответов в R.
Максим Михайлов
0

QBIC , 38 байт

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

объяснение

{           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
источник
0

C #, 95 байт

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

Мы используем 940 в качестве заданного значения, так как любое большее значение переполняет int.

Полная / Отформатированная версия:

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
источник
0

Рубин , 23 34 байта

Я понятия не имею, почему 0.75это так важно, но эй, что бы ни работало.

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

Попробуйте онлайн!

Значение чернил
источник
Это не даст ближайший биквадратик. Например, он вернет 256 для 151.
P.Peter