가장 가까운 2 차 수를 구합니다


18

2 차 수는 다른 정수의 네 번째 거듭 제곱 인 숫자입니다. 예를 들면 다음과 같습니다. 3^4 = 3*3*3*3 = 81

입력으로 정수가 주어지면 가장 가까운 2 차 수를 출력하십시오.

처음 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부호가 교대로 있기 때문에 반드시해야 합니다.
Martin Ender

2
biquadratic의 명명법이 혼동된다 : 질문 내용을보기 전에, 나는 그것이 2 x n²숫자 라고 생각했다 : 2, 8, 18, 32, 50, 72, 98, ...
sergiol

2
"quartic"이라고하지 않습니까? ( Merriam-Webster , 위키 낱말 사전 )
Olivier Grégoire

답변:


15

파이썬 3 , 35 바이트

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

온라인으로 사용해보십시오!

작동 원리

출력이 ( k -1) 4 에서 k 4로 전환되는 값 n 은 √ (√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파이썬 2로 전환하면 모든 0.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(암시 적 평균 01)이고, 두 번째 값은 8.5(평균 116)입니다.

예로서,에 대한 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

및 apply 적용 sum(...)합니다 2. 이는 이차 수 사이의 중간 점 ( n정확한 2중간 점 포함)을 정확히 초과 함을 의미합니다 0.5. 마지막으로 결과 ^44얻기 위해 이것을 올립니다 16.


2
심지어 골퍼입니다!
flawr

7

하스켈 , 51 49 바이트

기능 모나드 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

Neim , 5 바이트

𝐈4𝕎S𝕔

설명:

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

온라인으로 사용해보십시오!


2
이 프로그래밍 언어는 유니 코드 문자 ( "𝕎"및 "𝕔")를 사용하는 것 같습니다. 이러한 문자에는 일반적으로 2 바이트 이상이 필요합니다. 5 바이트 만 사용하여 5자를 저장할 수 있습니까?
Martin Rosenau


5

Excel, 25 바이트

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

엑셀 업데이트 =INT((A1^0.5-3/4)^0.5+0.5)^4


1
엑셀에 대한 관례에 대한 참고 사항 : Excel.ActiveSheet객체 에서 입력을받는 Excel 및 Excel VBA 함수가 셀에서 가져 오는 것이 사실상 표준입니다.A1
Taylor Scott

1
@TaylorScott, 지적 해 주셔서 감사합니다. 업데이트했습니다.
Wernisch



3

자바 스크립트 (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)

데모




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

LINK 링크



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 링크의 헤더에 넣을 수 있습니다.
Giuseppe

1
@ 주세페 아, 전혀 정의 할 필요가 없습니다 x. 감사합니다!
Maxim Mikhaylov

아, 그러면 다른 개선 사항은 stdin에서 입력을 가져 오는 것이며 입력은 n=scan();which.min(((1:n)^4-n)^2)^4TIO의 바닥 글 섹션으로 이동합니다.
주세페

@Giuseppe 감사합니다! R의 미래 답변을 아는 데 유용
Maxim Mikhaylov



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

더 큰 값은 int를 오버플로하므로 940을 설정 값으로 사용합니다.

풀 / 포맷 버전 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.