10 진수가 주어지면의 제곱근이 정수 내에 k
있도록 가장 작은 정수를 찾으십시오 . 그러나 거리는 0이 아니 어야합니다 . 완벽한 정사각형이 될 수는 없습니다.n
n
k
n
주어진 k
10 진수 또는 분수 (둘 중 쉬운 쪽) 중 0 < k < 1
가장 작은 양의 정수를 출력하여 n
제곱근 n
과 가장 가까운 정수의 제곱근의 차이 n
가 k
0 보다 작거나 같지 않도록합니다. .
경우 i
의 제곱근에 가장 가까운 정수 n
, 첫 번째 찾고있는 n
곳 0 < |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
이것은 code-golf 이므로 바이트 단위의 최단 답변이 이깁니다.
답변
Wolfram Language (Mathematica) , 34 바이트
Min[⌈.5/#+{-#,#}/2⌉^2+{1,-1}]&
설명
결과는 형태이어야
엠2±1일부
엠∈엔. 방정식 풀기
엠2+1−엠≤케이및
엠−엠2−1≤케이이면
엠≥1−케이22케이와
엠≥1+케이22케이각각. 따라서 결과는
분(⌈1−케이22케이⌉2+1,⌈1+케이22케이⌉2−1).
답변
파이썬 , 42 바이트
lambda k:((k-1/k)//2)**2+1-2*(k<1/k%2<2-k)
alephalpha의 formula 에 기반 하여 m 2 에 있는지 명시 적으로 확인
엠2−1또는
엠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=])(<.-.)@(-<.)@%:)^:_~]
모든 테스트 사례를 처리
답변
답변
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 덕분에 바이트를 절약했습니다.