Yaklaşık Karelerim


10

Esinlenerek bu video ile tecmath .

Herhangi bir sayının kare kökünün yaklaşıklığı x, tamsayı kare kökü s(yani, bu şekilde en büyük tam sayı s * s ≤ x) alınarak ve daha sonra hesaplanarak bulunabilir s + (x - s^2) / (2 * s). Bu yaklaşıma diyelim S(x). (Not: Bu, Newton-Raphson yönteminin bir adımının uygulanmasına eşdeğerdir).

Bu garip olmasına rağmen, S (n ^ 2 - 1) her zaman √ (n ^ 2) olacaktır, ancak genellikle çok doğru olacaktır. Bazı büyük durumlarda, bu oran>% 99,99'luk bir hassasiyete sahip olabilir.

Giriş ve çıkış

Herhangi bir uygun biçimde bir sayı alacaksınız.

Örnekler

Biçim: Giriş -> Çıkış

2 -> 1.50
5 -> 2.25
15 -> 4.00
19 -> 4.37               // actually 4.37       + 1/200
27 -> 5.20
39 -> 6.25
47 -> 6.91               // actually 6.91       + 1/300
57 -> 7.57               // actually 7.57       + 1/700
2612 -> 51.10            // actually 51.10      + 2/255
643545345 -> 25368.19    // actually 25,368.19  + 250,000,000/45,113,102,859
35235234236 -> 187710.50 // actually 187,710.50 + 500,000,000/77,374,278,481

Özellikler

  • Çıktınız en az en yakın yüzde birliğe yuvarlanmalıdır (yani, cevap 47.2851 ise, çıktıyı 47.29 alabilirsiniz)

  • Cevabın bir tam sayı olması durumunda, çıktınızda aşağıdaki sıfırların ve ondalık bir noktanın olması gerekmez (ör. 125.00, 125 ve 125.0 olarak da çıkarılabilir)

  • 1'in altındaki sayıları desteklemenize gerek yoktur.

  • Tamsayı olmayan girişleri desteklemeniz gerekmez. (ör. 1,52 vb ...)

kurallar

Standart Loopholes yasaktır.

Bu bir , bayt çok kısa cevap kazanır.



3
Not:s + (x - s^2) / (2 * s) == (x + s^2) / (2 * s)
JungHwan Min

Çözümlerim: Pyth , 25 byte ; 14 bayt
Stan Strum

En az 2 rakama kadar doğru olması gerekir mi?
totallyhuman

@totallyhuman Evet. 47.2851, 47.28 olarak temsil edilebilir, ancak artık yanlış değildir.
Stan Strum

Yanıtlar:


2

Jöle ,  8  7 bayt

Olivier Grégoire'ın basitleştirilmiş matematiksel formülü sayesinde -1 bayt - Java yanıtlarına bakın .

÷ƽ+ƽH

Çevrimiçi deneyin!

Nasıl?

÷ƽ+ƽH - Link: number, n
 ƽ     - integer square root of n  -> s
÷       - divide                    -> n / s
    ƽ  - integer square root of n  -> s
   +    - add                       -> n / s + s
      H - halve                     -> (n / s + s) / 2

7 bayt: ÷ƽ+ƽHJelly'i ilk kez kullanmaya çalışıyorum, bu yüzden yanlış olabilirim. Keşke ƽtekrar etmemek için nasıl saklayacağımı bilseydim . Bu başka bir bayt kurtarabilir.
Olivier Grégoire

Teşekkürler OlivierGrégoire! ƽɓ÷⁹+Htamsayı kökünü yeniden hesaplamaz, fakat aynı zamanda 7. ɓtakas argümanlarla yeni bir ikili zincir başlatır ve daha sonra bu zincirin doğru argümanına (yani sonucuna ƽ) işaret eder. ƽɓ÷+⁹Hburada da işe yarar.
Jonathan Allan


4

Java (OpenJDK 8) , 32 bayt

n->(n/(n=(int)Math.sqrt(n))+n)/2

Çevrimiçi deneyin!

açıklamalar

Kod buna eşdeğerdir:

double approx_sqrt(double x) {
  double s = (int)Math.sqrt(x);  // assign the root integer to s
  return (x / s + s) / 2
}

Arkasındaki matematik:

s + (x - s²) / (2 * s)  =  (2 * s² + x - s²) / (2 * s)
                        =  (x + s²) / (2 * s)
                        =  (x + s²) / s / 2
                        =  ((x + s²) / s) / 2
                        =  (x / s + s² / s) / 2
                        =  (x / s + s) / 2

Bu şartnameyi karşılamıyor gibi görünüyor: Çıktınız en az en yakın yüzüncü
seviyeye

2
En yakın yüzde birinden daha alça yuvarlanır, bu yüzden tamamen geçerlidir.
Olivier Grégoire

Ah, anladım, yanlış anlama.
Ayb4btu

4

Python 2 , 47 ... 36 bayt

@JungHwanMin sayesinde -3 bayt @HyperNeutrino sayesinde
-1 bayt @JonathanFrech sayesinde
-2 bayt
@ OlivierGrégoire sayesinde -3 bayt

def f(x):s=int(x**.5);print(x/s+s)/2

Çevrimiçi deneyin!


-2 bayt: s+(x-s*s)/s/2için(x+s*s)/s/2
Junghwan Min

Bir işlevi kullanarak -2 bayt
HyperNeutrino

@HyperNeutrino Sadece almak -1 byte
ovs

Özür Ah Yanlışlıkla test ettikten sonra bir karakter silinir ve daha sonra sonra bayt sayılır: P evet sadece -1
HyperNeutrino

İki bayt tasarruf ederek atlayıp +.0değiştiremez misiniz? /s/2/2./s
Jonathan Frech


3

R, 43 bayt 29 bayt

x=scan()
(x/(s=x^.5%/%1)+s)/2

@Giuseppe yeni denklem için teşekkürler ve tamsayı bölme çözümü ile 12 bayt golf yardım. Tarama işlev çağrısını değiştirerek, başka bir çift bayt golf ettim.

Çevrimiçi deneyin!


1
35 bayt ; daha genel olarak, TIO'nun "başlık" alanını kullanabilir f <- ve işlevi atamak için a koyabilirsiniz . Ama yine de, güzel bir çözüm, bir şansınız olduğunda R'de Golf için ipuçları okuyun !
Giuseppe



2

JavaScript (ES7), 22 bayt

x=>(s=x**.5|0)/2+x/s/2

Gerçekten bir ara değişkene ihtiyacımız yok, bu aslında şu şekilde yeniden yazılabilir:

x=>x/(x=x**.5|0)/2+x/2

Test senaryoları


2

C, 34 bayt

@Olivier Grégoire'a teşekkürler!

s;
#define f(x)(x/(s=sqrt(x))+s)/2

Yalnızca floatgirişlerle çalışır.

Çevrimiçi deneyin!

C,  41   39  37 bayt

s;
#define f(x).5/(s=sqrt(x))*(x+s*s)

Çevrimiçi deneyin!

C,  49   47   45  43 bayt

s;float f(x){return.5/(s=sqrt(x))*(x+s*s);}

Çevrimiçi deneyin!


@JungHwan Min'e iki bayt kaydettiği için teşekkürler!


1
47 bayt ; edit: Teşekkür ederim, ama bulmak için @JungHwanMin kredi.
Stan Strum



2

AWK , 47 44 38 bayt

{s=int($1^.5);printf"%.2f",$1/2/s+s/2}

Çevrimiçi deneyin!

NOT: TIO benzeri, \nçıkışı daha iyi hale getirmek için 2 ekstra bayta sahiptir . :)

Kare kökü bulmak için sqrt kullanmak için biraz hile gibi geliyor, bu yüzden burada olmayan birkaç baytlık bir sürüm var.

{for(;++s*s<=$1;);s--;printf("%.3f\n",s+($1-s*s)/(2*s))}

Çevrimiçi deneyin!


1
Peki bunun AWKward olduğunu söyleyebilirsin. Kendimi göstereceğim. değiştir
Stan Strum

'AWK' puns are fun :)
Robert Benson

yerine sqrt($1)kullanabilirsiniz$1^.5
Cabbie407

Teşekkürler @ Cabbie407 neden böyle düşünmediğimi bilmiyorum.
Robert Benson

1
Rica ederim. Diğer bazı şeyler: \nçıktı almak için gerek yok, awk olarak printf parantez gerekmez ve formül kısaltılabilir s/2+$1/s/2, sonuçlanır {s=int($1^.5);printf"%.2f",s/2+$1/s/2}. Bu yorum kaba görünüyorsa üzgünüm.
Cabbie407

1

Raket , 92 bayt

Yorum bölümündeki ipucu için @JungHwan Min'e teşekkürler

(λ(x)(let([s(integer-sqrt x)])(~r(exact->inexact(/(+ x(* s s))(* 2 s)))#:precision'(= 2))))

Çevrimiçi deneyin!

Ungolfed

(define(fun x)
  (let ([square (integer-sqrt x)])
    (~r (exact->inexact (/ (+ x (* square square)) (* 2 square)))
        #:precision'(= 2))))

1

PowerShell , 54 bayt

param($x)($x+($s=(1..$x|?{$_*$_-le$x})[-1])*$s)/(2*$s)

Çevrimiçi deneyin! veya Bazı test senaryolarını doğrulayın

Girdiyi alır $xve sonra tam olarak istenen şeyi yapar. |?Parçası olduğu tamsayı maksimal bulur karesi zaman olduğu -less-daha-veya- egirişine qual $x, o zaman gerekli hesaplamalar. Çıktı örtük.


Vay. Windows Powershell'de insanların nasıl golf oynadığını hiç anlayamadım
Stan Strum

@StanStrum Yalnız değilsin, lol. : D
AdmBorkBork

1

Kabuk , 9 bayt

½Ṡ§+K/(⌊√

Çevrimiçi deneyin!

Bu cevapta hala çirkin bir şey var, ancak daha kısa bir çözüm bulamıyorum.

açıklama

Newton algoritmasının bir adımını uyguluyorum (aslında bu soruda önerilene eşdeğer)

½Ṡ§+K/(⌊√
  §+K/       A function which takes two numbers s and x, and returns s+x/s
 Ṡ           Call this function with the input as second argument and
      (⌊√    the floor of the square-root of the input as first argument
½            Halve the final result

Sanırım gerçek bölünme istiyorsun, değil÷
H.PWiz

@ H.PWiz whoops, ben, teşekkür ederim. Bu, başka çözümler bulmak için yapılan bir denemeden kaldı
Leo

1

Pyt , 11 10 bayt

←Đ√⌊Đ↔⇹/+₂

açıklama

code                explanation                        stack
←                   get input                          [input]
 Đ                  duplicate ToS                      [input,input]
  √⌊                calculate s                        [input,s]
    Đ               duplicate ToS                      [input,s,s]
     ↔              reverse stack                      [s,s,input]
      ⇹             swap ToS and SoS                   [s,input,s]
       /            divide                             [s,input/s]
        +           add                                [s+input/s]
         ₂          halve                              [(s+input/s)/2]
                    implicit print

Sadece bunu gördüm ve Pyth olmadığını anlayana kadar iyi bir dakika oldu. Mükemmel cevap.
Stan Strum

Evet, bir süredir düşündüğüm ve gerçekten yapmaya karar verdiğim küçük bir dil.
mudkip201

ToS yığının en üstünde mi ... ve eğer öyleyse, SoS nedir?
Stan Strum

ToS yığının en üstünde ve SoS yığında ikinci
mudkip201

Güzel, bu dile girip giremeyeceğimi göreceğim; Bunu sevdim!
Stan Strum

1

Samanyolu , 17 14 bayt

Olivier Grégoire formülünü kullanarak -3 bayt

^^':2;g:>/+2/!

Çevrimiçi deneyin!

açıklama

code              explanation                   stack layout

^^                clear preinitialized stack    []
  ':              push input and duplicate it   [input, input]
    2;            push 2 and swap ToS and SoS   [input, 2, input]
      g           nth root                      [input, s=floor(sqrt(input))]
       :          duplicate ToS                 [input, s, s]
        >         rotate stack right            [s, input, s]
         /        divide                        [s, input/s]
          +       add                           [s+input/s]
           2/     divide by 2                   [(s+input/s)/2]
             !    output                        => (s+input/s)/2

tavan yerine yer olmamalı mı?
mudkip201

@ mudkip201 Güncelleme teşekkürler
ovs

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.