Khoảng cách căn bậc hai từ số nguyên


20

Cho một số thập phân k, tìm số nguyên nhỏ nhất nsao cho căn bậc hai nnằm trong kmột số nguyên. Tuy nhiên, khoảng cách nên là khác không - nkhông thể là một hình vuông hoàn hảo.

Cho trước k, một số thập phân hoặc một phân số (tùy theo bạn dễ dàng hơn), như vậy 0 < k < 1, xuất ra số nguyên dương nhỏ nhất nsao cho chênh lệch giữa căn bậc hai nvà số nguyên gần nhất với căn bậc hai nnhỏ hơn hoặc bằng knhưng khác không .

Nếu ilà số nguyên gần nhất với căn bậc hai của n, bạn đang tìm kiếm đầu tiên nở đâu 0 < |i - sqrt(n)| <= k.

Quy tắc

  • Bạn không thể sử dụng triển khai không đủ số ngôn ngữ của một số nguyên để tầm thường hóa vấn đề.
  • Mặt khác, bạn có thể cho rằng ksẽ không gây ra vấn đề với, ví dụ, làm tròn điểm nổi.

Các trường hợp thử nghiệm

.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

Đầu vào trường hợp thử nghiệm được phân tách bằng dấu phẩy:

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

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.

Câu trả lời:


18

Ngôn ngữ Wolfram (Mathicala) , 34 byte

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

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

Giải trình

Kết quả phải có dạng m2±1 đối với một số mN . Giải quyết các bất phương trình m2+1mkmm21k, chúng tôi nhậnm1k22km1+k22k tương ứng. Vì vậy, kết quả làmin(1k22k2+1,1+k22k21).


8

Python , 42 byte

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

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

Dựa trên công thức của alephalpha , kiểm tra rõ ràng nếu chúng ta ở trong trường hợp m21 hoặc m2+1 thông qua điều kiện k<1/k%2<2-k.

Python 3.8 có thể lưu một byte với một phép gán nội tuyến.

Python 3,8 , 41 byte

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

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

Chúng đánh bại giải pháp đệ quy của tôi:

50 byte

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

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


4

05AB1E , 16 byte

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

Cảng @alephalpha 's Mathematica câu trả lời , với cảm hứng từ @Sok ' s Pyth câu trả lời , vì vậy hãy chắc chắn để upvote cả trong số họ!

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)

Gọn gàng, cảm ơn vì đã liên kết câu trả lời có công thức được sử dụng. Tôi đang tập thể dục dụng cụ tinh thần để cố gắng tìm ra công thức từ cú pháp kỳ quặc của 05AB1E.
Bạch tuộc ma thuật Urn

3

JavaScript (ES7),  51  50 byte

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

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

(không thành công cho các trường hợp kiểm tra yêu cầu đệ quy quá nhiều)


Phiên bản không đệ quy,  57  56 byte

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

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

Hoặc cho 55 byte :

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

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

(nhưng cái này chậm hơn đáng kể)


3

J , 39 29 byte

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

Lưu ý Phiên bản ngắn hơn này chỉ đơn giản sử dụng công thức của @ alephalpha.

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

39 byte, bản gốc, lực lượng vũ phu

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

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

Xử lý tất cả các trường hợp kiểm tra


3

Japt , 18 16 byte

-2 byte từ Shaggy

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

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


Có thể ngắn hơn bằng cách sử dụng giải pháp của Arnauld
ASCII - chỉ


Ồ ... tất nhiên tôi có thể đã đảo ngược điều đó: |. Ngoài ra, điều đó %1 &&thật khó chịu, không chắc chắn nếu sử dụng giải pháp của Arnauld sẽ ngắn hơn (có thể không)
ASCII - chỉ

16 byte bởi reassigning Z¬u1để Zở phần đầu của hàm.
Shaggy

Phương thức khác có vẻ là 26:[1,-1]®*U²Ä /U/2 c ²-Z} rm
Chỉ có ASCII vào

3

Pyth, 22 21 byte

hSm-^.Ech*d^Q2yQ2d_B1

Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đây .

Một câu trả lời tuyệt vời khác của alephalpha , hãy đảm bảo cung cấp cho họ một upvote!

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

Chỉnh sửa: Đã lưu một byte, nhờ Kevin Cruijssen


1
Tôi không biết Pyth, nhưng cũng có thể tạo [-1,1]3 byte hay bạn cần một đảo ngược bổ sung để nó trở thành 4 byte? Nếu có thể trong 3 byte, bạn có thể làm điều đó, sau đó thay đổi *_dthành *d+dthành -d. Ngoài ra, Pyth không có nội dung tối thiểu, thay vì sắp xếp & lấy trước?
Kevin Cruijssen

1
@KevinCruijssen Thứ tự của hai yếu tố không quan trọng vì chúng tôi lấy mức tối thiểu, mặc dù tôi không thể nghĩ ra cách tạo cặp theo 3 byte. Một thay đổi tốt khi thay đổi nó thành - ... dmặc dù, nó giúp tôi tiết kiệm một byte! Cảm ơn
Sok

@KevinCruijssen Cũng không có một byte tối thiểu hoặc tối đa chức năng không may duy nhất: o (
Sok

1
À, tất nhiên rồi. Bạn ánh xạ các giá trị, vì vậy nó không thành vấn đề nếu nó [1,-1]hay [-1,1]. Tôi đã so sánh *d-dvới câu trả lời 05AB1E của mình, nơi tôi không sử dụng bản đồ, nhưng có thể trừ / nhân một mảng 2D từ / với một mảng 2D khác, vì vậy tôi không cần bản đồ. Vui mừng tôi có thể giúp lưu một byte trong trường hợp đó. :) Và cảm ơn cho cảm hứng cho câu trả lời 05AB1E của tôi.
Kevin Cruijssen

3

Perl 6 , 34 33 29 byte

-1 byte nhờ Grimy

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

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


-1 byte bằng cách thay thế >=bằng >. Căn bậc hai của số nguyên là số nguyên hoặc số vô tỷ, vì vậy trường hợp đẳng thức có thể xảy ra là không thể xảy ra.
Grimmy

1
@Grimy Cảm ơn, điều này dường như được cho phép theo các quy tắc thách thức. (Mặc dù số dấu phẩy động luôn luôn hợp lý, tất nhiên.)
nwellnhof

2

APL (Dyalog Unicode) , 27 byte SBCS

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

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

Monadic tàu lấy một đối số. Đây là một cảng của câu trả lời của alephalpha .

Làm sao:

⌊/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 # (Trình biên dịch tương tác Visual C #) , 89 85 71 byte

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

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

-4 byte nhờ Kevin Cruijssen!


Bạn có thể lưu một byte bằng cách đặt n++vòng lặp, do đó, -1có thể xóa khỏi vòng quay lại:k=>{double n=1,p;for(;Math.Abs(Math.Round(p=Math.Sqrt(0d+n))-p)>k|p%1==0;n++);return n;}
Kevin Cruijssen

Ngoài ra, 0d+có thể được gỡ bỏ, có thể không?
Kevin Cruijssen

@KevinCruijssen Có thể, tôi chỉ quên rằng nđã là một đôi
Hiện thân của sự thiếu hiểu biết



1

MathGolf , 16 byte

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

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

Không phải là một fan hâm mộ lớn của giải pháp này. Đó là một cổng của giải pháp 05AB1E, dựa trên cùng một công thức mà hầu hết các câu trả lời đang sử dụng.

Giải trình

²                  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

Có phải mọi biểu tượng được coi là một bytetrong golf golf? Bởi vì một số ký tự của bạn yêu cầu nhiều hơn một byte. Tôi không có ý định chọn nit, tôi thực sự đang tự hỏi :)
schroffl

Câu hỏi hay! Một "byte" trong việc chơi gôn liên quan đến kích thước tệp tối thiểu cần thiết để lưu trữ một chương trình. Văn bản được sử dụng để trực quan hóa các byte đó có thể là bất kỳ byte nào. Tôi đã chọn Mã trang 437 để trực quan hóa các tập lệnh của mình, nhưng phần quan trọng là các byte thực tế xác định mã nguồn.
maxb

Một ví dụ điển hình về số lượng ký tự và số byte khác nhau là câu trả lời này . Ở đây, 'ԓ'ký tự thực sự là 2 byte, nhưng phần còn lại là 1 ký tự.
maxb

1

Forth (gforth) , 76 byte

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

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

Giải trình

Bắt đầu một bộ đếm ở 1 và Tăng nó trong một vòng lặp. Mỗi lần lặp, nó kiểm tra xem giá trị tuyệt đối của căn bậc hai của bộ đếm - số nguyên gần nhất nhỏ hơn k

Giải thích mã

: 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

Thạch , 13 byte

Tôi đã không quản lý để có được bất cứ điều gì khó khăn hơn so với cách tiếp cận tương tự như alephalpha
- hãy đưa ra câu trả lời Mathicala của anh ấy !

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

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

Làm sao?

²;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

Japt , 14 byte

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

Thử nó

_=¬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

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.