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.