Znajdź najbliższy numer dwukwadratowy

18

Liczba dwuwymiarowa to liczba, która jest czwartą potęgą innej liczby całkowitej, na przykład: 3^4 = 3*3*3*3 = 81

Biorąc pod uwagę liczbę całkowitą jako dane wejściowe, wypisz najbliższą liczbę dwuwymiarową.

Oto pierwsze 15 podwójnych kwadratów:

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

To jest więc najmniej bajtów wygrywa w każdym języku

To jest OEIS A000583

Skidsdev
źródło
Warto zauważyć, że to się nigdy nie zwiąże, ponieważ sekwencja naprzemiennie przedstawia liczby nieparzyste i parzyste.
Okx,
5
możesz zmienić nazwę na „Znajdź najbliższy zenzizenzic”. en.wiktionary.org/wiki/zenzizenzic
Destructible Lemon
1
@Mayube Koniecznie tak, ponieważ sekwencja jest sprawiedliwa n^4i nzmienia się na znak.
Martin Ender,
2
Że nomenklatura dwukwadratowy jest niejasna: przed widząc zawartość pytanie, myślałem, że to były 2 x n²numery: 2, 8, 18, 32, 50, 72, 98, ...
sergiol
2
Czy to nie nazywa się „kwartylem”? ( Merriam-Webster , Wikisłownik )
Olivier Grégoire

Odpowiedzi:

15

Python 3 , 35 bajtów

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

Wypróbuj online!

Jak to działa

Wartość n, przy której wyjście przełącza się z ( k - 1) 4 na k 4, spełnia √ (√n - 3/4) + 1/2 = k lub n = ((k - 1/2) 2 + 3 / 4) 2 = ( k 2 - k + 1) 2 = (( k - 1) 4 + k 4 + 1) / 2, czyli dokładnie pierwsza liczba całkowita bliższa k 4 .

(Działa dla wszystkich n ≤ 4504699340341245 = (8192 4 + 8193 4 - 7) / 2> 2 52 , po czym zaokrąglanie zmiennoprzecinkowe zaczyna go łamać, nawet jeśli działa matematycznie dla wszystkich n .)

Anders Kaseorg
źródło
Możesz zapisać bajt, roundjeśli przełączysz się na Python 2, który zaokrągla wszystkie .5 w górę.
xnor
8

Oktawa , 35 bajtów

To wyzwanie wymagało podejścia opartego na konwolucji.

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

Wypróbuj online!

Wyjaśnienie

Wyrażenie (1:n).^4tworzy wektor wiersza [1 16 81 256 ... n^4].

Ten wektor jest następnie spleciony z [1 1]/2, co jest równoważne z obliczeniem średniej ruchomej bloków wielkości 2. Zakłada to domyślnie, że wektor jest wypełniony po lewej i po prawej stronie 0. Tak więc pierwsza wartość w wyniku to 0.5(średnia niejawna 0i 1), druga to 8.5(średnia 1i 16) itd.

Na przykład dla n = 9wyniku conv((1:n).^4,[1 1]/2)jest

0.5 8.5 48.5 168.5 440.5 960.5 1848.5 3248.5 5328.5 3280.5

Porównanie n>...daje wynik

1 1 0 0 0 0 0 0 0 0 0

i zastosowanie sum(...)daje 2. Oznacza to, że nprzekracza dokładnie 2punkt środkowy między liczbami dwukwadratowymi (w tym dodatkowy punkt środkowy 0.5). Wreszcie ^4podnosi to 4, aby doprowadzić do rezultatu 16.

Luis Mendo
źródło
2
Jest jeszcze bardziej golfowy!
flawr
7

Haskell , 51 49 bajtów

Funkcja monad ftw!

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

Wypróbuj online!

Wyjaśnienie:

                                (^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)
wada
źródło
6

MATL , 6 bajtów

t:4^Yk

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe 9jako przykład.

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
źródło
5

Neim , 5 bajtów

𝐈4𝕎S𝕔

Wyjaśnienie:

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

Wypróbuj online!

Okx
źródło
2
Ten język programowania wydaje się używać znaków Unicode („𝕎” i „𝕔”). Takie znaki zwykle wymagają więcej niż jednego bajtu. Czy na pewno 5 znaków można zapisać przy użyciu tylko 5 bajtów?
Martin Rosenau,
5

Excel, 25 bajtów

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

Excel aktualizuje to do =INT((A1^0.5-3/4)^0.5+0.5)^4

Wernisch
źródło
1
Tylko uwaga na temat konwencji dla programu Excel: jest de facto standardem, że funkcje Excela i Excela VBA, które pobierają dane wejściowe z Excel.ActiveSheetobiektu, pobierają je z komórkiA1
Taylor Scott
1
@TaylorScott, dzięki za zwrócenie na to uwagi. Zaktualizowałem.
Wernisch
4

Mathematica, 21 bajtów

Nearest[Range@#^4,#]&
Martin Ender
źródło
4

Brachylog , 9 bajtów

;I≜+.~^₄∧

Wypróbuj online!

Wyjaśnienie

;I≜          I = 0 / I = 1 / I = -1 / I = 2 / etc. on backtracking
   +.        Output = Input + I
    .~^₄     Output = Something to the power 4
        ∧
Fatalizować
źródło
3

JavaScript (ES7), 42 bajty

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

Wersja rekurencyjna, 44 bajty

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

Próbny

Arnauld
źródło
3

Oktawa , 37 bajtów

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

Anonimowa funkcja korzystająca z interpolacji najbliższego sąsiada.

Wypróbuj online!

Luis Mendo
źródło
2
-1 no conv :(
flawr
1
@flawr Czy to sprawia, że ​​czujesz się lepiej?
Luis Mendo,
1
Robi to bardzo!
flawr
2

05AB1E , 6 bajtów

LnnI.x

Wypróbuj online!

Wyjaśnienie

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
źródło
2

APL, 22 bajty

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

Wypróbuj online!

W jaki sposób?

o←4*⍨⍳⍵- o= zakres ( ) 4 [wektoryzacja]

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

o/⍨- weź oelement pod indeks, w którym ...

p=⌊/p- pminimalnym elementem jest

Uriel
źródło
2

Galaretka , 6 bajtów

R*4ạÐṂ

Łącze monadyczne zwracające listę jednego elementu lub pełny program, który drukuje wynik (przy użyciu nieefektywnej metody).

Wypróbuj online!

W jaki sposób?

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
źródło
1

C ++, 96 bajtów

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

Pełna wersja:

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, aby spróbować

koita_pisw_sou
źródło
1

R , 47 44 37 35 bajtów

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

Wypróbuj online!

Maxim Michajłow
źródło
możesz zwrócić anonimową funkcję (usunięcie f=) i zamiast jej x[which.min((x-n)^2)]użyć which.min((x-n)^2)^4, a następnie umieścić f=w nagłówku linku TIO do testowania jak tutaj :)
Giuseppe
1
@Giuseppe Och, w ogóle nie trzeba definiować x. Dziękuję Ci!
Maxim Mikhaylov,
ah, wtedy jedyną poprawą jest pobieranie danych wejściowych ze standardowego wejścia, n=scan();which.min(((1:n)^4-n)^2)^4a dane wejściowe trafiają do sekcji stopki na TIO.
Giuseppe,
@Giuseppe Jeszcze raz dziękuję! Przydatne w przypadku przyszłych odpowiedzi w języku R.
Maxim Mikhaylov,
0

QBIC , 38 bajtów

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

Wyjaśnienie

{           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
źródło
0

Common Lisp, 50 bajtów

(lambda(x)(expt(floor(+(sqrt(-(sqrt x).75)).5))4))

Wypróbuj online!

Renzo
źródło
0

C #, 95 bajtów

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

Używamy 940 jako wartości ustawionej, ponieważ każda większa wartość przepełni int.

Pełna / sformatowana wersja:

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
źródło
0

Ruby , 23 lata 34 bajty

Nie mam pojęcia, dlaczego 0.75jest to tak ważna liczba, ale hej, cokolwiek działa.

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

Wypróbuj online!

Wartość tuszu
źródło
To nie da najbliższej biquadratic. Np.
Zwróci