정수에서 제곱근 거리


20

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

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

답변:


18

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).


8

파이썬 , 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)

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


4

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)

사용 된 수식이있는 답변을 연결해 주셔서 감사합니다. 나는 05AB1E의 항상 이상한 구문에서 공식을 찾으려고 정신 체조를하고있었습니다.
매직 문어 Urn

3

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

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

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



3

apt , 18 16 바이트

Shaggy 에서 -2 바이트

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

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


Arnauld의 솔루션을 사용하면 더 짧을 수 있습니다
ASCII 전용


아 ... 물론 나는 그것을 역전시킬 수 있었다 : |. 또한 %1 &&Arnauld의 솔루션을 사용하는 것이 더 짧을 지 확신 할 수 없습니다.
ASCII 전용

함수 시작시 재 할당 Z¬u1하여 16 바이트 Z
얽히고 설킨

다른 방법은 26으로 나타납니다.[1,-1]®*U²Ä /U/2 c ²-Z} rm
ASCII 전용

3

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 덕분에 바이트를 절약했습니다.


1
나는 Pyth를 모르지만 [-1,1]3 바이트로 만들 수 있습니까? 아니면 4 바이트가되도록 추가 리버스가 필요합니까? 이 3 바이트에 가능하면 그렇게하고 변경할 수 *_d*d+d-d. 또한 Pyth에는 정렬 및 우선 순위 대신 최소 내장 기능이 없습니까?
Kevin Cruijssen

1
@KevinCruijssen 두 요소의 순서는 최소값을 취하므로 중요하지 않지만 3 바이트로 쌍을 만드는 방법을 생각할 수는 없습니다. - ... d그래도 변경에 대한 좋은 캐치 덕분에 바이트가 절약됩니다! 감사
Sok

@KevinCruijssen 또한 불행히도 단일 바이트 최소 또는 최대 기능이 없습니다 : o (
Sok

1
아 물론 이죠 값을 매핑하므로 값이 [1,-1]또는 인지는 중요하지 않습니다 [-1,1]. 나는 지도를 사용하지 않지만 다른 2D 배열에서 2D 배열을 빼거나 곱할 수있는 내 05AB1E 답변 *d과 비교하고 -d있었으므로 맵이 필요하지 않습니다. 이 경우 바이트를 절약하는 데 도움이 될 수있어서 다행입니다. :) 그리고 내 05AB1E 답변에 대한 영감에 감사드립니다.
Kevin Cruijssen

3

펄 6 , 34 33 29 바이트

Grimy 덕분에 -1 바이트

{+(1...$_>*.sqrt*(1|-1)%1>0)}

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


로 교체 >=하여 -1 바이트 >. 정수의 제곱근은 정수이거나 비합리적이므로 평등 경우가 발생할 수 없습니다.
그리미

1
@ 그림 고마워, 이것은 도전 규칙에 따라 허용되는 것 같습니다. (물론 부동 소수점 숫자는 항상 합리적입니다.)
nwellnhof

2

APL (Dyalog Unicode) , 27 바이트 SBCS

⌊/0~⍨¯1 1+2*⍨∘⌈+⍨÷⍨1(+,-)×⍨

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

하나의 주장을 취하는 모나드 열차. 이것은 alephalpha의 답변 포트입니다 .

방법:

⌊/0~⍨¯1 1+2*⍨∘⌈+⍨÷⍨1(+,-)×⍨  Monadic train

                         ×⍨  Square of the argument
                   1(+,-)    1 ± that (returns 1+k^2, 1-k^2)
                 ÷⍨          divided by
               +⍨            twice the argument
             ∘⌈              Ceiling
          2*⍨                Squared
     ¯1 1+                   -1 to the first, +1 to the second
  0~⍨                        Removing the zeroes
⌊/                           Return the smallest

2

C # (Visual C # 대화 형 컴파일러) , 89 85 71 바이트

k=>{double n=2,p;for(;!((p=Math.Sqrt(n)%1)>0&p<k|1-p<k);n++);return n;}

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

Kevin Cruijssen 덕분에 -4 바이트!


당신은 넣어 바이트를 저장할 수 있습니다 n++루프에, 그래서는 -1반환에서 제거 할 수 있습니다 :k=>{double n=1,p;for(;Math.Abs(Math.Round(p=Math.Sqrt(0d+n))-p)>k|p%1==0;n++);return n;}
케빈 Cruijssen

또한 0d+제거 할 수 있습니까?
Kevin Cruijssen

@KevinCruijssen 네, 가능합니다. n이미 두 배인 것을 잊었습니다
무지의 구현



1

MathGolf , 16 바이트

²_b*α)½╠ü²1bαm,╓

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

이 솔루션의 열렬한 팬이 아닙니다. 대부분의 답변에서 사용하는 것과 동일한 공식을 기반으로하는 05AB1E 솔루션의 포트입니다.

설명

²                  pop a : push(a*a)
 _                 duplicate TOS
  b                push -1
   *               pop a, b : push(a*b)
    α              wrap last two elements in array
     )             increment
      ½            halve
       ╠           pop a, b, push b/a
        ü          ceiling with implicit map
         ²         pop a : push(a*a)
          1        push 1
           b       push -1
            α      wrap last two elements in array
             m     explicit map
              ,    pop a, b, push b-a
               ╓   min of list

모든 기호 byte가 코드 골프에서 고려 됩니까? 일부 문자에는 단일 바이트 이상이 필요하기 때문입니다. 나는 nit-pick을 의미하지 않는다. 나는 정말로 궁금하다. :)
schroffl

좋은 질문! 골프에서 "바이트"는 프로그램을 저장하는 데 필요한 최소 파일 크기와 관련이 있습니다. 해당 바이트를 시각화하는 데 사용되는 텍스트는 임의의 바이트 일 수 있습니다. 스크립트를 시각화하기 위해 코드 페이지 437 을 선택 했지만 중요한 부분은 소스 코드를 정의하는 실제 바이트입니다.
maxb

문자의 수와 다른되는 바이트 수의 좋은 예는 대답. 여기서 'ԓ'문자는 실제로 2 바이트이지만 나머지는 1 바이트 문자입니다.
maxb

1

넷째 (gforth) , 76 바이트

: f 1 begin 1+ dup s>f fsqrt fdup fround f- fabs fdup f0> fover f< * until ;

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

설명

1에서 카운터를 시작하고 루프에서 증가시킵니다. 카운터의 제곱근의 절대 값-가장 가까운 정수가 k보다 작은 지 확인하는 각 반복

코드 설명

: f                   \ start a new word definition
  1                   \ place a counter on the stack, start it at 1
  begin               \ start and indefinite loop
    1+                \ add 1 to the counter
    dup s>f           \ convert a copy of the counter to a float
    fsqrt             \ get the square root of the counter
    fdup fround f-    \ get the difference between the square root and the next closes integer
    fabs fdup         \ get the absolute value of the result and duplicate
    f0>               \ check if the result is greater than 0 (not perfect square)
    fover f<          \ bring k to the top of the float stack and check if the sqrt is less than k
    *                 \ multiply the two results (shorter "and" in this case)
  until               \ end loop if result ("and" of both conditions) is true
;                     \ end word definition

1

젤리 , 13 바이트

나는 alephalpha와 같은 접근법보다 더 터무니없는 것을 얻지 못했습니다
-그의 Mathematica 답변 을 공감하십시오. !

²;N$‘÷ḤĊ²_Ø+Ṃ

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

방법?

²;N$‘÷ḤĊ²_Ø+Ṃ - Link: number, n (in (0,1))
²             - square n        -> n²
   $          - last two links as a monad:
  N           -   negate        -> -(n²)
 ;            -   concatenate   -> [n², -(n²)]
    ‘         - increment       -> [1+n², 1-(n²)]
      Ḥ       - double n        -> 2n
     ÷        - divide          -> [(1+n²)/n/2, (1-(n²))/n/2]
       Ċ      - ceiling         -> [⌈(1+n²)/n/2⌉, ⌈(1-(n²))/n/2⌉]
        ²     - square          -> [⌈(1+n²)/n/2⌉², ⌈(1-(n²))/n/2⌉²]
          Ø+  - literal         -> [1,-1]
         _    - subtract        -> [⌈(1+n²)/n/2⌉²-1, ⌈(1-(n²))/n/2⌉²+1]
            Ṃ - minimum         -> min(⌈(1+n²)/n/2⌉²-1, ⌈(1-(n²))/n/2⌉²+1) 

1

apt , 14 바이트

_=¬aZ¬r¹©U¨Z}a

시도 해봐

_=¬aZ¬r¹©U¨Z}a     :Implicit input of integer U
_                  :Function taking an integer Z as an argument
 =                 :  Reassign to Z
  ¬                :    Square root of Z
   a               :    Absolute difference with
    Z¬             :      Square root of Z
      r            :      Round to the nearest integer
       ¹           :  End reassignment
        ©          :  Logical AND with
         U¨Z       :  U greater than or equal to Z
            }      :End function
             a     :Return the first integer that returns true when passed through that function

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