En yakın iki dereceli sayıyı bulun


18

İkinci dereceden bir sayı, başka bir tamsayının dördüncü gücü olan bir sayıdır, örneğin: 3^4 = 3*3*3*3 = 81

Girdi olarak bir tamsayı verildiğinde, en yakın iki dereceli sayıyı çıktılar.

İşte ilk 15 çift kare:

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

Bu , her dilde en az bayt kazanır

Bu OEIS A000583


Dizinin tek ve çift sayıları değiştirdiği için bunun asla bağlanmayacağını belirtmek ilginçtir.
Okx

5
adı "En yakın zenzizenziciyi bul" olarak değiştirebilirsiniz. en.wiktionary.org/wiki/zenzizenzic
Destructible Lemon

1
@Mayube Zorunludur, çünkü sıra sadece n^4ve nsırayla işaretlidir.
Martin Ender

2
Bu iki dereceli isimlendirme kafa karıştırıcı: soru içeriğini görmeden önce, bunun 2 x n²rakamlar olduğunu düşündüm : 2, 8, 18, 32, 50, 72, 98, ...
sergiol

2
Buna "dörtlü" denmiyor mu? ( Merriam-Webster , Vikisözlük )
Olivier Grégoire

Yanıtlar:


15

Python 3 , 35 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Değeri , n çıkışı (geçer hangi k - 1) 4 için k 4 - + 1/2 = tatmin √ (3/4 √N) k ya da N = ((k - 1/2) 2 + 3 / 4) 2 = ( k 2 - k + 1) 2 = (( k - 1) 4 + k 4 + 1) / 2, ki bu tam olarak k 4'e daha yakın olan ilk tam sayıdır .

(Tüm n ≤ 4504699340341245 = (8192 4 + 8193 4 - 7) / 2> 2 52 için çalışır , bundan sonra tüm n için matematiksel olarak çalışmasına rağmen kayan nokta yuvarlaması onu kırmaya başlar .)


roundTüm .5'leri yukarı yuvarlayan Python 2'ye geçerseniz, bir bayt kaydedebilirsiniz .
xnor

8

Oktav , 35 bayt

Bu meydan okuma , evrişliğe dayalı bir yaklaşıma ihtiyaç duyuyordu .

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

Çevrimiçi deneyin!

açıklama

İfade (1:n).^4satır vektörü üretir [1 16 81 256 ... n^4].

Bu vektör daha sonra [1 1]/2, boyut bloklarının kayma ortalamasını hesaplamaya eşdeğer olan kıvrımlıdır 2. Bu dolaylı olarak vektörün sol ve sağ dolgulu olduğunu varsayar 0. Sonuçta ilk değer 0.5(örtük 0ve ortalama 1), ikincisi 8.5(ortalama 1ve 16), vb.

Örnek n = 9olarak 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

Karşılaştırma n>...daha sonra

1 1 0 0 0 0 0 0 0 0 0

ve uygulama sum(...)verir 2. Bu , iki dereceli sayılar arasındaki orta noktaların ntam olarak aşıldığı anlamına gelir 2(ek orta nokta dahil 0.5). Sonunda, sonucu elde ^4etmek 4için bunu yükseltir 16.


2
Hatta golfçü!
flawr

7

Haskell , 51 49 bayt

İşlev monad ftw!

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

Çevrimiçi deneyin!

Açıklama:

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

t:4^Yk

Çevrimiçi deneyin!

açıklama

Girişi 9örnek olarak ele alalım.

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 bayt

𝐈4𝕎S𝕔

Açıklama:

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

Çevrimiçi deneyin!


2
Bu programlama dili Unicode karakterleri kullanıyor gibi görünüyor ("𝕎" ve "𝕔"). Bu tür karakterler genellikle birden fazla bayt gerektirir. 5 karakterin sadece 5 bayt kullanılarak saklanabileceğinden emin misiniz?
Martin Rosenau


5

Excel, 25 bayt

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

Excel bunu şu şekilde günceller: =INT((A1^0.5-3/4)^0.5+0.5)^4


1
Excel için sadece bir not: Excel.ActiveSheetnesneden girdi alan Excel ve Excel VBA işlevinin onları hücreden alması fiili standarttırA1
Taylor Scott

1
@TaylorScott, bunu belirttiğin için teşekkürler. Güncelleyin.
Wernisch



3

JavaScript (ES7), 42 bayt

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

Özyinelemeli sürüm, 44 bayt

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

gösteri



2

05AB1E , 6 bayt

LnnI.x

Çevrimiçi deneyin!

açıklama

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 bayt

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

Çevrimiçi deneyin!

Nasıl?

o←4*⍨⍳⍵- o= aralık ( ) 4 [vectorize]

p←|⍵-⍨o- p= abs ( o- ) [vektörize]

o/⍨- oöğeyi dizinde al ...

p=⌊/p- pminimum öğe


2

Jöle , 6 bayt

R*4ạÐṂ

Bir öğenin listesini veya sonucu yazdıran tam bir programı döndüren monadik bir bağlantı (verimsiz bir yöntem kullanarak).

Çevrimiçi deneyin!

Nasıl?

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 bayt

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

Tam versiyon:

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

Denemek için LINK



1

R , 47 44 37 35 bayt

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

Çevrimiçi deneyin!


anonim bir işlev (kaldırma f=) ve x[which.min((x-n)^2)]kullanım yerine döndürebilir which.min((x-n)^2)^4ve daha sonra buradakif= testler için TIO bağlantısının başlığına koyabilirsiniz :)
Giuseppe

1
@Giuseppe Oh, tanımlamaya hiç gerek yok x. Teşekkür ederim!
Maxim Mikhaylov

ah, diğer tek gelişme girdiyi stdin'den almaktır ve girdi TIO'daki n=scan();which.min(((1:n)^4-n)^2)^4altbilgi bölümüne gider.
Giuseppe

@Giuseppe Tekrar teşekkürler! R.
Maxim Mikhaylov



0

QBIC , 38 bayt

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

açıklama

{           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 bayt

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

940'ı ayarlanmış bir değer olarak kullanırız, çünkü daha büyük herhangi bir değer int'den taşacaktır.

Tam / Biçimli Sürüm:

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 bayt

Bunun için neden 0.75bu kadar önemli bir sayı olduğu hakkında hiçbir fikrim yok , ama ne işe yarıyorsa.

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

Çevrimiçi deneyin!


Bu en yakın iki-ikinci dereceyi vermeyecektir. Örneğin, 151 için 256 geri dönecek.
P.Péter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.