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.

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


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!


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)

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)


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


3

Japt , 18 16 byte

-2 byte dari Shaggy

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

Cobalah online!


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


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!


-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

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!


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



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

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

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) 

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.