Знайдіть найближче двоквадратичне число


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


Цікаво зазначити, що це ніколи не буде зв'язано, оскільки послідовність чергує непарні і парні числа.
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 , після чого округлення з плаваючою комою починає розбивати його, хоча воно працює математично для всіх п .)


Ви можете зберегти байт, 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
Це навіть гольфіст!
недолік

7

Haskell , 51 49 байт

Функція monad ftw!

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)

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

Спробуйте в Інтернеті!


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


1
Лише примітка домовленості про excel: це фактично стандарт, що функції Excel і Excel VBA, які приймають вхід від Excel.ActiveSheetоб'єкта, беруть їх з коміркиA1
Тейлор Скотт

1
@TaylorScott, дякую за вказівку на це. Оновили.
Верніш






2

APL, 22 байти

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

Спробуйте в Інтернеті!

Як?

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

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

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

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=у заголовок посилання TIO для тестування, як тут :)
Джузеппе

1
@Giuseppe О, не потрібно взагалі визначатись x. Дякую!
Максим Михайлов

ах, тоді єдиним іншим вдосконаленням є взяття даних від stdin, n=scan();which.min(((1:n)^4-n)^2)^4і вхід переходить у розділ колонтитулу на TIO.
Джузеппе

@Giuseppe Ще раз дякую! Корисно знати для майбутніх відповідей у ​​Р.
Максим Михайлов



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



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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.