정수에서 제곱근 거리 또는 분수 (둘

10 진수가 주어지면의 제곱근이 정수 내에 k있도록 가장 작은 정수를 찾으십시오 . 그러나 거리는 0이 아니 어야합니다 . 완벽한 정사각형이 될 수는 없습니다.nnkn

주어진 k10 진수 또는 분수 (둘 중 쉬운 쪽) 중 0 < k < 1가장 작은 양의 정수를 출력하여 n제곱근 n과 가장 가까운 정수의 제곱근의 차이 nk0 보다 작거나 같지 않도록합니다. .

경우 i의 제곱근에 가장 가까운 정수 n, 첫 번째 찾고있는 n0 < |i - sqrt(n)| <= k.

규칙

  • 언어의 정수가 아닌 숫자의 불충분 한 구현을 사용하여 문제를 사소하게 만들 수 없습니다.
  • 그렇지 않으면 k부동 소수점 반올림과 같은 문제가 발생하지 않는다고 가정 할 수 있습니다 .

테스트 사례

.9         > 2
.5         > 2
.4         > 3
.3         > 3
.25        > 5
.2         > 8
.1         > 26
.05        > 101
.03        > 288
.01        > 2501
.005       > 10001
.003       > 27888
.001       > 250001
.0005      > 1000001
.0003      > 2778888
.0001      > 25000001
.0314159   > 255
.00314159  > 25599
.000314159 > 2534463

쉼표로 구분 된 테스트 케이스 입력 :

0.9, 0.5, 0.4, 0.3, 0.25, 0.2, 0.1, 0.05, 0.03, 0.01, 0.005, 0.003, 0.001, 0.0005, 0.0003, 0.0001, 0.0314159, 0.00314159, 0.000314159

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.



답변

Wolfram Language (Mathematica) , 34 바이트

Min[⌈.5/#+{-#,#}/2⌉^2+{1,-1}]&

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

설명

결과는 형태이어야

2±1

일부

. 방정식 풀기

2+1케이

21케이

이면

1케이22케이

1+케이22케이

각각. 따라서 결과는

(1케이22케이2+1,1+케이22케이21)

.


답변

파이썬 , 42 바이트

lambda k:((k-1/k)//2)**2+1-2*(k<1/k%2<2-k)

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

alephalpha의 formula 에 기반 하여 m 2 에 있는지 명시 적으로 확인

21

또는

2+1

조건을 통해 케이스k<1/k%2<2-k.

Python 3.8은 인라인 할당으로 바이트를 저장할 수 있습니다.

파이썬 3.8 , 41 바이트

lambda k:((a:=k-1/k)//2)**2-1+2*(a/2%1<k)

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

이들은 내 재귀 솔루션을 이겼습니다.

50 바이트

f=lambda k,x=1:k>.5-abs(x**.5%1-.5)>0 or-~f(k,x+1)

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


답변

05AB1E , 16 바이트

nD(‚>I·/înTS·<-ß

@alephalpha 포트 Mathematica 답변 에서 영감 @Sok 의 Pyth 응답 , 그래서 둘 다 찬성 투표하십시오!

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

n                 # Take the square of the (implicit) input
                  #  i.e. 0.05 → 0.0025
 D(‚              # Pair it with its negative
                  #  i.e. 0.0025 → [0.0025,-0.0025]
    >             # Increment both by 1
                  #  i.e. [0.0025,-0.0025] → [1.0025,0.9975]
     I·           # Push the input doubled
                  #  i.e. 0.05 → 0.1
       /          # Divide both numbers with this doubled input
                  #  i.e. [1.0025,0.9975] / 0.1 → [10.025,9.975]
        î         # Round both up
                  #  i.e. [10.025,9.975] → [11.0,10.0]
         n        # Take the square of those
                  #  i.e. [11.0,10.0] → [121.0,100.0]
          TS      # Push [1,0]
            ·     # Double both to [2,0]
             <    # Decrease both by 1 to [1,-1]
              -   # Decrease the earlier numbers by this
                  #  i.e. [121.0,100.0] - [1,-1] → [120.0,101.0]
               ß  # Pop and push the minimum of the two
                  #  i.e. [120.0,101.0] → 101.0
                  # (which is output implicitly)


답변

자바 스크립트 (ES7),  51  50 바이트

f=(k,n)=>!(d=(s=n**.5)+~(s-.5))|d*d>k*k?f(k,-~n):n

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

(너무 많은 재귀가 필요한 테스트 케이스에 실패)


비 재귀 버전,  57  56 바이트

k=>{for(n=1;!(d=(s=++n**.5)+~(s-.5))|d*d>k*k;);return n}

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

또는 55 바이트의 경우 :

k=>eval(`for(n=1;!(d=(s=++n**.5)+~(s-.5))|d*d>k*k;);n`)

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

(그러나 이것은 상당히 느리다)


답변

J , 39 29 바이트

[:<./_1 1++:*:@>.@%~1+(,-)@*:

NB. 이 짧은 버전은 단순히 @alephalpha의 공식을 사용합니다.

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

39 바이트, 원본, 무차별 대입

2(>:@])^:((<+.0=])(<.-.)@(-<.)@%:)^:_~]

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

모든 테스트 사례를 처리


답변

apt , 18 16 바이트

Shaggy 에서 -2 바이트

_=¬u1)©U>½-½aZ}a

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


답변

Pyth, 22 21 바이트

hSm-^.Ech*d^Q2yQ2d_B1

여기 에서 온라인으로 시도 하거나 모든 테스트 사례를 한 번에 확인 하십시오. .

alephalpha의 훌륭한 답변의 또 다른 항구는 그들에게 공감대 를 제공하십시오!

hSm-^.Ech*d^Q2yQ2d_B1   Implicit: Q=eval(input())
                  _B1   [1,-1]
  m                     Map each element of the above, as d, using:
           ^Q2            Q^2
         *d               Multiply by d
        h                 Increment
       c      yQ          Divide by (2 * Q)
     .E                   Round up
    ^           2         Square
   -             d        Subtract d
 S                      Sort
h                       Take first element, implicit print

편집 : Kevin Cruijssen 덕분에 바이트를 절약했습니다.