Akar kuadrat jarak dari bilangan bulat

20

Diberikan angka desimal k, temukan bilangan bulat terkecil nsehingga akar kuadrat nberada dalam kbilangan bulat. Namun, jaraknya harus nol - ntidak bisa menjadi kuadrat sempurna.

Diberikan k, bilangan desimal atau pecahan (mana yang lebih mudah bagi Anda), sehingga 0 < k < 1, menghasilkan bilangan bulat positif terkecil nsehingga perbedaan antara akar kuadrat ndan bilangan bulat terdekat dengan akar kuadrat nkurang dari atau sama dengan ktetapi bukan nol .

Jika ibilangan bulat terdekat dengan akar kuadrat n, Anda mencari di nmana pertama 0 < |i - sqrt(n)| <= k.

Aturan

  • Anda tidak dapat menggunakan implementasi nomor non-integer bahasa yang tidak memadai untuk meremehkan masalah.
  • Jika tidak, Anda dapat mengasumsikan bahwa ktidak akan menyebabkan masalah dengan, misalnya, pembulatan titik mengambang.

Uji Kasus

.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

Input kasus uji yang dipisahkan koma:

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

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Stephen
sumber

Jawaban:

18

Bahasa Wolfram (Mathematica) , 34 byte

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

Cobalah online!

Penjelasan

Hasilnya harus dari bentuk m2±1 untuk beberapa mN . Mengatasi ketidakmerataan m2+1mkdanmm21k, kita dapatkanm1k22k danm1+k22k masing-masing. Jadi hasilnyamin(1-k22k2+1,1+k22k2-1).

alephalpha
sumber
8

Python , 42 byte

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

Cobalah online!

Berdasarkan rumus alephalpha ini , secara eksplisit memeriksa jika kita berada di m2-1 atau m2+1 kasus melalui kondisi k<1/k%2<2-k.

Python 3.8 dapat menyimpan byte dengan penugasan sebaris.

Python 3.8 , 41 byte

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

Cobalah online!

Ini mengalahkan solusi rekursif saya:

50 byte

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

Cobalah online!

Tidak
sumber
4

05AB1E , 16 byte

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

Port of @alephalpha 's Mathematica answer , dengan inspirasi dari @Sok 's Pyth answer , jadi pastikan untuk mengunggulkan keduanya!

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)
Kevin Cruijssen
sumber
Rapi, terima kasih telah menghubungkan jawaban yang memiliki rumus yang digunakan. Saya melakukan senam mental mencoba mencari tahu rumus dari sintaksis aneh 05AB1E.
Magic Gurita Guci
3

JavaScript (ES7),  51  50 byte

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

Cobalah online!

(gagal untuk kasus uji yang membutuhkan terlalu banyak rekursi)


Versi non-rekursif,  57  56 byte

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

Cobalah online!

Atau untuk 55 byte :

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

Cobalah online!

(tapi yang ini lebih lambat)

Arnauld
sumber
3

J , 39 29 byte

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

NB. Versi yang lebih singkat ini hanya menggunakan rumus @ alephalpha.

Cobalah online!

39 byte, asli, kekuatan kasar

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

Cobalah online!

Menangani semua test case

Yunus
sumber
3

Japt , 18 16 byte

-2 byte dari Shaggy

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

Cobalah online!

Khusus ASCII
sumber
Mungkin lebih singkat menggunakan solusi Arnauld
ASCII-only
Oh ... tentu saja saya bisa membalikkan itu: |. Juga itu %1 &&tidak menyenangkan, tidak yakin apakah menggunakan solusi Arnauld akan lebih pendek (mungkin tidak)
ASCII-only
16 byte oleh pemindahan Z¬u1ke Zpada awal fungsi.
Shaggy
Metode lain tampaknya menjadi 26:[1,-1]®*U²Ä /U/2 c ²-Z} rm
ASCII-satunya
3

Pyth, 22 21 byte

hSm-^.Ech*d^Q2yQ2d_B1

Coba online di sini , atau verifikasi semua uji sekaligus di sini .

Port lain dari jawaban alephalpha yang luar biasa , pastikan untuk memberi mereka dukungan!

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

Sunting: Disimpan satu byte, terima kasih kepada Kevin Cruijssen

Sok
sumber
1
Saya tidak tahu Pyth, tetapi apakah mungkin untuk membuat [-1,1]dalam 3 byte juga, atau apakah Anda perlu membalikkan tambahan sehingga menjadi 4 byte? Jika memungkinkan dalam 3 byte, Anda bisa melakukannya, lalu ubah *_dto *ddan +dto -d. Juga, apakah Pyth tidak memiliki minimum bawaan, alih-alih menyortir & mengambil dulu?
Kevin Cruijssen
1
@KevinCruijssen Urutan kedua elemen tidak penting karena kami mengambil minimum, meskipun saya tidak bisa memikirkan cara membuat pasangan dalam 3 byte. Sebuah tangkapan yang bagus untuk mengubahnya - ... d, itu menghemat satu byte! Terima kasih
Sok
@KevinCruijssen Juga sayangnya tidak ada fungsi byte minimum atau maksimum: o (
Sok
1
Ah, tentu saja. Anda memetakan nilai-nilai tersebut, jadi tidak masalah apakah itu [1,-1]atau [-1,1]. Saya membandingkan *ddan -ddengan jawaban 05AB1E saya, di mana saya tidak menggunakan peta, tetapi dapat mengurangi / melipatgandakan array 2D dari / dengan array 2D lainnya, jadi saya tidak perlu peta. Senang saya bisa membantu menghemat satu byte dalam kasus itu. :) Dan terima kasih atas inspirasi untuk jawaban 05AB1E saya.
Kevin Cruijssen
3

Perl 6 , 34 33 29 byte

-1 byte terima kasih kepada Grimy

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

Cobalah online!

nwellnhof
sumber
-1 byte dengan mengganti >=dengan >. Akar bilangan bulat bilangan bulat baik bilangan bulat atau tidak rasional, sehingga kasus kesetaraan terbukti tidak dapat terjadi.
Grimmy
1
@Grimy Terima kasih, ini sepertinya diizinkan menurut aturan tantangan. (Meskipun angka floating-point selalu rasional, tentu saja.)
nwellnhof
2

APL (Dyalog Unicode) , 27 byte SBCS

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

Cobalah online!

Kereta monadik mengambil satu argumen. Ini adalah port dari jawaban alephalpha ini .

Bagaimana:

⌊/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
J. Sallé
sumber
2

C # (Visual C # Interactive Compiler) , 89 85 71 byte

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

Cobalah online!

-4 byte terima kasih kepada Kevin Cruijssen!

Perwujudan Ketidaktahuan
sumber
Anda dapat menyimpan byte dengan meletakkannya n++di loop, sehingga -1dapat dihapus dari pengembalian: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
Juga, 0d+bisa dihapus, bukan?
Kevin Cruijssen
@KevinCruijssen Ya itu bisa, saya hanya lupa nitu sudah dobel
Perwujudan Ketidaktahuan
2

Java (JDK) , 73 70 byte

k->{double i=1,j;for(;(j=Math.sqrt(++i)%1)==0|j>=k&1-j>=k;);return i;}

Cobalah online!

-3 bytes terima kasih kepada @ceilingcat

Sara J
sumber
@ceilingcat Rapi, terima kasih.
Sara J
1

MathGolf , 16 byte

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

Cobalah online!

Bukan penggemar berat dari solusi ini. Ini adalah port dari solusi 05AB1E, yang didasarkan pada formula yang sama dengan sebagian besar jawaban yang digunakan.

Penjelasan

²                  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
maks
sumber
Apakah setiap simbol dianggap sebagai bytekode golf? Karena beberapa karakter Anda memerlukan lebih dari satu byte. Saya tidak bermaksud memilih, saya benar-benar bertanya-tanya :)
schroffl
Pertanyaan bagus! "Byte" dalam bermain golf berhubungan dengan ukuran file minimum yang diperlukan untuk menyimpan suatu program. Teks yang digunakan untuk memvisualisasikan byte tersebut dapat berupa byte. Saya telah memilih Kode untuk memvisualisasikan skrip saya, tetapi bagian yang penting adalah byte aktual yang menentukan kode sumber.
Maks
Contoh yang bagus dari jumlah karakter dan jumlah byte yang berbeda adalah jawaban ini . Di sini, 'ԓ'karakter sebenarnya 2 byte, tetapi sisanya adalah karakter 1 byte.
Maks
1

Keempat (gforth) , 76 byte

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

Cobalah online!

Penjelasan

Mulai penghitung pada 1 dan menambahkannya dalam satu lingkaran. Setiap iterasi itu memeriksa apakah nilai absolut dari akar kuadrat counter - bilangan bulat terdekat kurang dari k

Penjelasan Kode

: 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
reffu
sumber
1

Jelly , 13 byte

Saya belum berhasil mendapatkan apa pun yang lebih sulit daripada pendekatan yang sama seperti alephalpha
- naikkan jawaban Mathematica- nya !

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

Cobalah online!

Bagaimana?

²;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) 
Jonathan Allan
sumber
1

Japt , 14 byte

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

Cobalah

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