ระยะห่างรูทสแควร์จากจำนวนเต็ม


20

กำหนดตัวเลขทศนิยมkให้หาจำนวนเต็มที่น้อยที่สุดnซึ่งสแควร์รูทของnอยู่ภายในkจำนวนเต็ม อย่างไรก็ตามระยะทางควรเป็นศูนย์ - nไม่สามารถเป็นรูปสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบได้

ป.ร. ให้kไว้เป็นจำนวนทศนิยมหรือเศษส่วน (แล้วแต่จำนวนใดจะง่ายสำหรับคุณ) เช่น0 < k < 1เอาท์พุทจำนวนเต็มบวกที่เล็กที่สุดnที่แตกต่างระหว่างสแควร์รูทของnและจำนวนเต็มที่ใกล้เคียงกับสแควร์รูทของnน้อยกว่าหรือเท่ากับkแต่ไม่ใช่ศูนย์ .

ถ้า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 (Mathematica) , 34 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ผลที่ตามมาจะต้องอยู่ในรูปแบบm2±1สำหรับบางmN N การแก้ความไม่เท่าเทียมm2+1mkและmm21kเราได้รับm1k22kและm1+k22kตามลำดับ ดังนั้นผลลัพธ์คือmin(1k22k2+1,1+k22k21))


8

Pythonขนาด 42 ไบต์

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

ลองออนไลน์!

ขึ้นอยู่กับสูตรของ alephalphaอย่างชัดเจนตรวจสอบถ้าเราอยู่ในm21หรือm2+1k<1/k%2<2-kกรณีที่ผ่านเงื่อนไข

Python 3.8 สามารถบันทึกไบต์ด้วยการกำหนดแบบอินไลน์

Python 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 's คำตอบ Mathematica , ด้วยแรงบันดาลใจจาก@Sok ' s คำตอบ Pythเพื่อให้แน่ใจว่าจะ upvote ทั้งสองของพวกเขา!

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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
Magic Octopus Urn

3

JavaScript (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

Japté , 18 16 ไบต์

-2 ไบต์จากShaggy

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

ลองออนไลน์!


อาจจะสั้นลงโดยใช้โซลูชันของ Arnauld
ASCII เท่านั้นเท่านั้น

สับเล็ก ๆ น้อย ๆ จะช่วยประหยัดไบต์
ปุย

โอ้ ... แน่นอนว่าฉันจะได้กลับรายการนั้น: | นอกจากนี้ที่%1 &&น่ารังเกียจไม่แน่ใจว่าถ้าใช้โซลูชันของ Arnauld จะสั้นลง (อาจไม่)
ASCII- เท่านั้น

16 ไบต์โดยกำหนดใหม่Z¬u1ไป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นอกจากนี้ Pythen ไม่มีการสร้างขั้นต่ำแทนที่จะเรียงลำดับ & รับก่อน
Kevin Cruijssen

1
@KevinCruijssen ลำดับของทั้งสององค์ประกอบนั้นไม่สำคัญเนื่องจากเราใช้เวลาน้อยที่สุดถึงแม้ว่าฉันจะไม่สามารถนึกถึงวิธีการสร้างคู่ใน 3 ไบต์ จับดีในการเปลี่ยนเป็น- ... dแม้ว่าที่ช่วยฉันไบต์! ขอบคุณ
Sok

@KevinCruijssen ยังไม่มีฟังก์ชั่นขั้นต่ำสุดหรือไบต์เดียวน่าเสียดาย: o (
Sok

1
อ่าแน่นอน คุณแมกว่าค่าดังนั้นมันไม่สำคัญถ้ามันหรือ[1,-1] [-1,1]ผมได้รับการเปรียบเทียบ*dและ-dกับคำตอบ 05AB1E ของฉันที่ฉันไม่ได้ใช้แผนที่ แต่สามารถลบ / คูณอาร์เรย์ 2 มิติจาก / กับอีกอาร์เรย์ 2 มิติดังนั้นผมจึงไม่จำเป็นต้องใช้แผนที่ ดีใจที่ฉันสามารถช่วยในการบันทึกไบต์ในกรณีที่ :) และขอบคุณสำหรับแรงบันดาลใจสำหรับคำตอบ 05AB1E ของฉัน
Kevin Cruijssen

3

Perl 6 , 34 33 29 ไบต์

-1 ไบต์ขอบคุณ Grimy

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

ลองออนไลน์!


-1 ไบต์โดยการแทนที่ด้วย>= >รากที่สองของจำนวนเต็มเป็นจำนวนเต็มหรือไม่ลงตัวดังนั้นกรณีความเท่าเทียมจึงไม่สามารถเกิดขึ้นได้
Grimmy

1
@Grimy ขอบคุณดูเหมือนว่าจะได้รับอนุญาตตามกฎการท้าทาย (แม้ว่าจำนวนจุดลอยตัวจะมีเหตุผลเสมอไป)
nwellnhof

2

APL (Dyalog Unicode) , 27 ไบต์SBCS

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

ลองออนไลน์!

รถไฟ Monadic รับหนึ่งอาร์กิวเมนต์ นี่คือพอร์ตของคำตอบของ 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 # Interactive คอมไพเลอร์) , 89 85 71 ไบต์

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

ลองออนไลน์!

-4 ไบต์ต้องขอบคุณ Kevin Cruijssen!


คุณสามารถบันทึกไบต์โดยใส่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;}
Kevin Cruijssen

นอกจากนี้ยัง0d+สามารถลบออกได้ใช่ไหม
Kevin Cruijssen

@KevinCruijssen ใช่ฉันทำได้ฉันลืมไปnแล้วว่าเป็นสองเท่าแล้ว
ศูนย์รวมแห่งความไม่รู้


1

Java 8, 85 ไบต์

n->{double i=1,p;for(;Math.abs(Math.round(p=Math.sqrt(i))-p)>n|p%1==0;i++);return i;}

คำตอบ C # .NET ของพอร์ตของEmbodimentOfIgnorance

ลองออนไลน์

Math.roundสามารถเลือกเป็นแบบนี้ แต่โชคร้ายที่มันเหมือนกันไบต์นับ:

n->{double i=1,p;for(;Math.abs((int)((p=Math.sqrt(i))+.5)-p)>n|p%1==0;i++);return i;}

ลองออนไลน์


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โค้ดกอล์ฟหรือไม่? เนื่องจากอักขระบางตัวของคุณต้องการมากกว่าหนึ่งไบต์ ผมไม่ได้หมายถึงจู้จี้เลือกฉันอย่างแท้จริงสงสัย :)
schroffl

คำถามที่ดี! "byte" ในการเล่นกอล์ฟเกี่ยวข้องกับขนาดไฟล์ขั้นต่ำที่จำเป็นในการจัดเก็บโปรแกรม ข้อความที่ใช้ในการเห็นภาพไบต์เหล่านั้นสามารถเป็นไบต์ใด ๆ ฉันเลือกCode Page 437เพื่อให้เห็นภาพสคริปต์ของฉัน แต่ส่วนที่สำคัญคือไบต์จริงที่กำหนดซอร์สโค้ด
maxb

ตัวอย่างที่ดีของจำนวนตัวอักษรและหมายเลขของไบต์ความแตกต่างกันคือนี้คำตอบ ที่นี่'ԓ'ตัวละครเป็นจริง 2 ไบต์ แต่ส่วนที่เหลือเป็น 1 ไบต์อักขระ
สูงสุด

1

Forth (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 ไบต์

ฉันยังไม่ได้จัดการเพื่อรับ terser อะไรกว่าวิธีการเดียวกันกับ 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

Japt , 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.