Tam Sayılara Karekök Mesafesi


20

Ondalık sayı göz önüne alındığında k, en küçük tamsayı bulmak nkarekökü böyle niçindedir ktamsayı. Ancak, mesafe sıfırdan farklı olmalıdır - nmükemmel bir kare olamaz.

Verilen kbir ondalık sayı veya bir kesir (hangisi sizin için daha kolaysa), öyle ki 0 < k < 1, en küçük pozitif tamsayıyı n, kare kökü ile kare köküne nen yakın tam sayı arasındaki farkın sıfırdan nküçük veya ona eşit olmayacağı şekilde kçıktısını verin. .

Eğer ikareköküne en yakın tam sayı ise n, ilk nyeri arıyorsunuz 0 < |i - sqrt(n)| <= k.

kurallar

  • Sorunu önemsizleştirmek için bir dilin tamsayı olmayan sayıların yetersiz uygulamasını kullanamazsınız.
  • Aksi takdirde, bunun körneğin kayan nokta yuvarlamasıyla ilgili sorunlara neden olmayacağını varsayabilirsiniz .

Test Durumları

.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

Virgülle ayrılmış test senaryosu girişleri:

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

Bu , bayt en kısa cevap kazanır.

Yanıtlar:


18

Wolfram Dili (Mathematica) , 34 bayt

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

Çevrimiçi deneyin!

açıklama

Sonuç , bazı için m2±1 biçiminde olmalıdır . Sqrt ve eşitsizliklerini çözerek , ve sırasıyla . Sonuç .mNm2+1mkmm21km1k22km1+k22kmin(1k22k2+1,1+k22k21)


8

Python , 42 bayt

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

Çevrimiçi deneyin!

Alephalpha'nın formülüne dayanarak , veya durumunda olup olmadığını açıkça kontrol ediyoruz .m21m2+1k<1/k%2<2-k

Python 3.8 satır içi atama ile bir bayt kaydedebilir.

Python 3.8 , 41 bayt

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

Çevrimiçi deneyin!

Bunlar özyinelemeli çözümü yendi:

50 bayt

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

Çevrimiçi deneyin!


4

05AB1E , 16 bayt

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

Port @alephalpha 'nın Mathematica cevabı , @Sok ' un Pyth cevabından ilham alarak , ikisini de oyladığınızdan emin olun!

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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)

Düzgün, kullanılan formülü içeren cevabı bağladığınız için teşekkürler. 05AB1E'nin sürekli garip söz dizimindeki formülü anlamaya çalışan zihinsel jimnastik yapıyordum.
Sihirli Ahtapot Urn

3

JavaScript (ES7),  51  50 bayt

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

Çevrimiçi deneyin!

(çok fazla özyineleme gerektiren test durumlarında başarısız olur)


Özyinelemesiz sürüm,  57  56 bayt

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

Çevrimiçi deneyin!

Veya 55 bayt için :

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

Çevrimiçi deneyin!

(ancak bu oldukça yavaştır)


3

J , 3929 bayt

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

NB. Bu kısa versiyon sadece @ alephalpha'nın formülünü kullanır.

Çevrimiçi deneyin!

39 bayt, orijinal, kaba kuvvet

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

Çevrimiçi deneyin!

Tüm test senaryolarını işler


3

Japt , 18 16 bayt

Shaggy'den -2 bayt

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

Çevrimiçi deneyin!


Arnauld'un çözümü kullanılarak daha kısa olabilir
ASCII-sadece


Ah ... tabii ki tersine çevirebilirdim: |. Ayrıca bu %1 &&kötü, Arnauld'un çözümünü kullanmanın daha kısa olup olmayacağından emin değilim (belki de değil)
ASCII-sadece

16 bayt yeniden atayarak Z¬u1için Zfonksiyonun başında.
Shaggy

Diğer yöntem 26 gibi görünüyor:[1,-1]®*U²Ä /U/2 c ²-Z} rm
ASCII-sadece

3

Pyth, 22 21 bayt

hSm-^.Ech*d^Q2yQ2d_B1

Buradan çevrimiçi olarak deneyin veya tüm test senaryolarını burada bir kerede doğrulayın .

Bir başka alephalpha limanı, onlara bir oy verdiğinizden emin olun!

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

Edit: Kevin Cruijssen sayesinde bir bayt kaydetti


1
Pyth'i bilmiyorum, ama [-1,1]3 baytta da oluşturmak mümkün mü, yoksa 4 bayt olacak ek bir tersine mi ihtiyacınız var? O 3 bayt mümkün değilse, bunu ve sonra değişebilir *_diçin *dve +diçin -d. Ayrıca, Pyth'in önce sıralama ve alma yerine Minimum yerleşimi yok mu?
Kevin Cruijssen

1
@KevinCruijssen En azını aldığımız için iki elementin sırası önemli değil, ancak çifti 3 baytta oluşturmanın bir yolunu düşünemiyorum. Yine de bunu değiştirmek için iyi bir yakalama - ... d, bu beni bir bayt kurtarır! Teşekkürler
Sok

@KevinCruijssen Maalesef tek bir baytlık minimum veya maksimum fonksiyon yok: o (
Sok

1
Ah, elbette. Değerlerin üzerine eşlersiniz, bu yüzden [1,-1]ya da olmasının önemi yoktur [-1,1]. Ben *dve -dbir harita kullanmıyorum benim 05AB1E cevap ile karşılaştırıyordu , ama bir 2D dizi / başka bir 2D dizi ile çıkarma / çarpma, bu yüzden bir harita gerekmez. Bu durumda bir bayt kurtarmaya yardım edebildiğim için memnunum. :) Ve 05AB1E cevabımın ilham kaynağı için teşekkürler.
Kevin Cruijssen

3

Perl 6 , 34 33 29 bayt

Grimy sayesinde -1 bayt

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

Çevrimiçi deneyin!


Değiştirerek -1 bayt >=ile >. Tamsayıların karekökleri tamsayı veya irrasyoneldir, bu nedenle eşitlik durumu kanıtlanamaz.
Grimmy

1
@Grimy Teşekkürler, meydan okuma kurallarına göre buna izin verilmiş gibi görünüyor. (Tabii ki kayan nokta sayıları her zaman rasyoneldir.)
nwellnhof

2

APL (Dyalog Unicode) , 27 bayt SBCS

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

Çevrimiçi deneyin!

Monadik tren bir argüman alıyor. Bu bir alephalpha cevabı limanı .

Nasıl:

⌊/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 # (Görsel C # Etkileşimli Derleyici) , 89 85 71 bayt

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

Çevrimiçi deneyin!

Kevin Cruijssen sayesinde -4 bayt!


n++Döngü içine koyarak bir bayt kaydedebilirsiniz , böylece -1dönüşten kaldırılabilir: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

Ayrıca, 0d+kaldırılabilir, değil mi?
Kevin Cruijssen

@KevinCruijssen Evet n, zaten bir çift olduğunu unuttum
Bilgisizlik



1

MathGolf , 16 bayt

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

Çevrimiçi deneyin!

Bu çözümün büyük bir hayranı değil. Çoğu yanıtın kullandığı formüle dayanan 05AB1E çözümünün bir bağlantı noktasıdır.

açıklama

²                  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

Her sembol bytegolf kodunda bir olarak kabul edilir mi? Çünkü bazı karakterleriniz tek bir bayttan fazlasını gerektiriyor.
Nit

İyi soru! Golfteki bir "bayt", bir programı saklamak için gereken minimum dosya boyutuyla ilgilidir. Bu baytları görselleştirmek için kullanılan metin herhangi bir bayt olabilir. Komut dosyalarımı görselleştirmek için Kod seçtim , ancak önemli olan kaynak kodu tanımlayan gerçek bayt.
maxb

Karakter sayısının ve farklı olan bayt sayısının iyi bir örneği bu cevaptır. Burada 'ԓ'karakter aslında 2 bayt, ancak geri kalanı 1 bayt karakter.
maxb

1

İleri (gforth) , 76 bayt

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

Çevrimiçi deneyin!

açıklama

1'de bir sayaç başlatır ve bir döngü içinde artırır. Her yineleme sayacın kare kökünün mutlak değerinin olup olmadığını kontrol eder - en yakın tam sayı k'den küçüktür

Kod Açıklaması

: 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

Jöle , 13 bayt

Alephalpha ile aynı yaklaşımdan başka bir şey almayı başaramadım
- git onun Mathematica cevabını oyla !

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

Çevrimiçi deneyin!

Nasıl?

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

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

Dene

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.