Tìm số nhị phân gần nhất


18

Một số nhị phân là một số là lũy thừa thứ tư của một số nguyên khác, ví dụ: 3^4 = 3*3*3*3 = 81

Cho một số nguyên làm đầu vào, xuất ra số nhị phân gần nhất.

Dưới đây là 15 hình vuông đôi đầu tiên:

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

Đây là nên ít byte nhất trong mỗi ngôn ngữ sẽ thắng

Đây là OEIS A000583


Thật thú vị khi lưu ý rằng điều này sẽ không bao giờ ràng buộc, vì chuỗi xen kẽ các số lẻ và chẵn.
Okx

5
bạn có thể đổi tên thành "Tìm zenzizenzic gần nhất". vi.wiktionary.org/wiki/zenzizenzic
Lemon phá hủy

1
@Mayube Nó nhất thiết phải làm, bởi vì chuỗi chỉ là n^4nthay thế trong dấu hiệu.
Martin Ender

2
Danh pháp đó của biquadratic là khó hiểu: trước khi xem nội dung câu hỏi, tôi nghĩ đó là các 2 x n²số: 2, 8, 18, 32, 50, 72, 98, ...
sergiol

2
Đó không phải là "quartic" sao? ( Merriam-Webster , Wiktionary )
Olivier Grégoire

Câu trả lời:


15

Python 3 , 35 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Giá trị n tại đó đầu ra chuyển từ ( k - 1) 4 sang k 4 thỏa mãn (n - 3/4) + 1/2 = k hoặc n = ((k - 1/2) 2 + 3 / 4) 2 = ( k 2 - k + 1) 2 = (( k - 1) 4 + k 4 + 1) / 2, chính xác là số nguyên đầu tiên gần với k 4 hơn .

(Trình cho tất cả n ≤ = 4504699340341245 (8192 4 + 8193 4 - 7) / 2> 2 52 , sau đó dấu chấm động roundoff bắt đầu để phá vỡ nó, mặc dù nó hoạt động toán học cho tất cả n .)


Bạn có thể lưu một byte roundnếu bạn chuyển sang Python 2, làm tròn tất cả .5 lên.
xnor

8

Octave , 35 byte

Thách thức này cần một cách tiếp cận dựa trên tích chập.

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

Hãy thử trực tuyến!

Giải trình

Biểu thức (1:n).^4tạo ra vectơ hàng [1 16 81 256 ... n^4].

Vectơ này sau đó được tích hợp với [1 1]/2, tương đương với tính toán trung bình trượt của các khối kích thước 2. Điều này mặc nhiên giả định rằng vectơ được đệm trái và phải 0. Vì vậy, giá trị đầu tiên trong kết quả là 0.5(trung bình của một ẩn 01), giá trị thứ hai là 8.5(trung bình của 116), v.v.

Ví dụ, cho n = 9kết quả 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

So sánh n>...sau đó mang lại

1 1 0 0 0 0 0 0 0 0 0

và áp dụng sum(...)cho 2. Điều này có nghĩa là nvượt quá chính xác 2các số biquadratic giữa điểm (bao gồm cả điểm giữa bổ sung 0.5). Cuối cùng, ^4tăng điều này 4để mang lại kết quả , 16.


2
Nó thậm chí còn hơn cả golf!
flawr

7

Haskell , 51 49 byte

Chức năng đơn nguyên ftw!

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

Hãy thử trực tuyến!

Giải trình:

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

t:4^Yk

Hãy thử trực tuyến!

Giải trình

Hãy xem xét đầu vào 9là một ví dụ.

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 byte

𝐈4𝕎S𝕔

Giải trình:

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

Hãy thử trực tuyến!


2
Ngôn ngữ lập trình này dường như sử dụng các ký tự Unicode ("" và ""). Các ký tự như vậy thường yêu cầu nhiều hơn một byte. Bạn có chắc chắn 5 ký tự có thể được lưu trữ chỉ bằng 5 byte không?
Martin Rosenau


5

Excel, 25 byte

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

Excel cập nhật điều này thành =INT((A1^0.5-3/4)^0.5+0.5)^4


1
Chỉ là một lưu ý về quy ước cho excel: đó là tiêu chuẩn thực tế mà hàm VBA của Excel và Excel lấy đầu vào từ Excel.ActiveSheetđối tượng lấy chúng từ ôA1
Taylor Scott

1
@TaylorScott, cảm ơn bạn đã chỉ ra điều đó. Đã cập nhật.
Wernisch



3

JavaScript (ES7), 42 byte

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

Phiên bản đệ quy, 44 byte

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

Bản giới thiệu




2

APL, 22 byte

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

Hãy thử trực tuyến!

Làm sao?

o←4*⍨⍳⍵- o= phạm vi ( ) 4 [vector hóa]

p←|⍵-⍨o- p= abs ( o- ) [vector hóa]

o/⍨- lấy ophần tử tại chỉ mục trong đó ...

p=⌊/p- pyếu tố tối thiểu là


2

Thạch , 6 byte

R*4ạÐṂ

Một liên kết đơn âm trả về một danh sách của một mục hoặc một chương trình đầy đủ in kết quả (sử dụng một phương pháp không hiệu quả).

Hãy thử trực tuyến!

Làm sao?

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 byte

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

Phiên bản đầy đủ:

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

LIÊN KẾT để thử



1

R , 47 44 37 35 byte

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

Hãy thử trực tuyến!


bạn có thể trả về một hàm ẩn danh (loại bỏ f=) và thay vì x[which.min((x-n)^2)]sử dụng which.min((x-n)^2)^4, sau đó đưa f=vào tiêu đề của liên kết TIO để thử nghiệm như ở đây :)
Giuseppe

1
@Giuseppe Ồ, không cần xác định xgì cả. Cảm ơn bạn!
Maxim Mikhaylov

à, sau đó, cải tiến duy nhất khác là lấy đầu vào từ stdin n=scan();which.min(((1:n)^4-n)^2)^4và đầu vào đi vào phần chân trang trên TIO.
Giuseppe

@Giuseppe Cảm ơn một lần nữa! Hữu ích để biết câu trả lời trong tương lai trong R.
Maxim Mikhaylov



0

QBIC , 38 byte

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

Giải trình

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

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

Chúng tôi sử dụng 940 làm giá trị được đặt vì mọi giá trị lớn hơn sẽ tràn vào int.

Phiên bản đầy đủ / định dạng:

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 byte

Tôi không biết tại sao 0.75một con số quan trọng như vậy cho việc này, nhưng hey, bất cứ điều gì hoạt động.

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

Hãy thử trực tuyến!


Điều này sẽ không cung cấp cho biquadratic gần nhất. Ví dụ: nó sẽ trả lại 256 cho 151.
P.Péter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.