Kareköklerin devam eden fraksiyonlarının belirlenmesi


13

Devamı fraksiyon bir dizi naşağıdaki biçimde bir parçasıdır:


hangi yakınsak n.

Sekansı abir devamı fraksiyonunda tipik olarak yazılır: [a 0 ; bir 1 , bir 2 , bir 3 , ... bir n ].
Bizimkini aynı şekilde yazacağız, ancak noktalı virgül arasındaki yinelenen bölümle.

Amacınız kare kökünün devam eden kısmını geri döndürmektir n.
Girdi: Bir tam sayı n,. nasla mükemmel bir kare olmayacak.
Çıkış: sürekli fraksiyonu sqrt(n).

Test Durumları:
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

En kısa kod kazanır. İyi şanslar!


1
Çıktının test senaryolarıyla aynı formatta olması gerekiyor mu?
grc

Hayır. Noktalı virgül kullandığınız sürece sorun değil.
beary605

Hm, doğru cevapları almak, kesirin ne zaman durduğunu bilmekte zorlanıyor. Gerçekten <sub> 0 </sub> orijinal girdinin iki katı kadar basit midir?
JoeFish

Evet, sınır bu.
beary605

@ beary605 teşekkürler. Çok daha fazla okuma yapıyorum ve şimdi bir kare kökün devam eden fraksiyonunun biraz özel bir durum olduğunu görüyorum. Büyüleyici şeyler! Hala kayan nokta sürümü üzerinde çalışıyor.
JoeFish

Yanıtlar:


3

GolfScript ( 66 60 karakter)

~:^,{.*^>}?(:?';'[1?{^1$.*-@/?@+.2$/@@1$%?\- 1$(}do;;]','*1$

Uyarı: içinde çoğu yerleşik yerine ?temsil eden değişken vardır floor(sqrt(input)). Ama ilki yerleşik.

Stdin üzerine girdi alır ve stdout'a çıktılar.

Algoritmanın Psuedocode'u (şu anda okuyucu için bir alıştırma olarak bırakılan doğruluk kanıtı):

n := input()
m := floor(sqrt(n))
output(m)
x := 1
y := m
do
  x := (n - y * y) / x
  output((m + y) / x)
  y := m - (m + y) % x
while (x > 1)

Yine kendimi a byığına bindiren ve yığına çıkan tek bir operatör isterken buluyorum a/b a%b.


1
GS öğrenmeye ihtiyacım olduğunu söyleyebilirim ... ama ihtiyaç burada bir kelime çok güçlü;)
boothby

1
@ boothby, deli olma. Hayatınız GS olmadan tamamlanmayacak;)
Peter Taylor

3

Python, 95 97 (ama doğru ...)

Bu sadece tamsayı aritmetiği ve kat bölme kullanır. Bu, tüm pozitif tamsayı girişleri için doğru sonuçlar verecektir, ancak eğer bir kişi uzun kullanmak istiyorsa, bir karakter eklemeleri gerekir; örneğin m=a=0L. Ve elbette ... zavallı adamın taban katının sona ermesi için bir milyon yıl bekle.

z=x=m=1
while n>m*m:m+=1
m=y=m-1
l=()
while-z<x:x=(n-y*y)/x;y+=m;l+=y/x,;y=m-y%x;z=-1
print c,l

Çıktı:

n=139
11 (1, 3, 1, 3, 7, 1, 1, 2, 11, 2, 1, 1, 7, 3, 1, 3, 1, 22)

edit: şimdi Peter Taylor'ın algoritmasını kullanarak. Çok do...whileeğlenceliydi.


Amaç nedir *(c*c-n)?
Peter Taylor

@PeterTaylor, meydan okumayı yeterince dikkatle okumadım ve kodun mükemmel kareler için çalışmasını sağladım.
boothby

2

Python, 87 82 80

x=r=input()**.5
while x<=r:print"%d"%x+",;"[x==r],;x=1/(x%1)
print`int(r)*2`+";"

Bir tamsayı alır ve şöyle çıktı verir:

4; 2, 1, 3, 1, 2, 8;

x-int(x) -> x%1. Etkilendim :)
beary605

Göre √139 için yanlış sonuç verir Wolfram Alpha
ekmek kutusu

9139 için çalışacak şekilde güncelledim. Bununla birlikte, dizinin uzunluğu çok uzarsa (√139'un 18 sayı dizisi varsa), sonuç muhtemelen doğruluğu kaybetmeye başlar.
grc

Her zaman 2 * int (sqrt (a)) ile bitmesi inanılmaz ilginç buluyorum.
beary605

Daha da ilginç olan şu anda 3'ümüz 139 kodunu kırmış durumda (mayın hala golf edilmemiş ve postalanmamış).
JoeFish

2

Mathematica 33 31

c[n_]:=ContinuedFraction@Sqrt@n

Çıktı, Mathematica için daha uygun olan liste biçimindedir. Örnekler:

c[2]
c[3]
c[19]
c[139]
c[1999]

(* out *)
{1, {2}}
{1, {1, 2}}
{4, {2, 1, 3, 1, 2, 8}}
{11, {1, 3, 1, 3, 7, 1, 1, 2, 11, 2, 1, 1, 7, 3, 1, 3, 1, 22}}
{44, {1, 2, 2, 4, 1, 1, 5, 1, 5, 8, 1, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 
  1, 14, 3, 1, 1, 29, 4, 4, 2, 5, 1, 1, 17, 2, 1, 12, 9, 1, 5, 1, 43, 
  1, 5, 1, 9, 12, 1, 2, 17, 1, 1, 5, 2, 4, 4, 29, 1, 1, 3, 14, 1, 1, 
  1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 8, 5, 1, 5, 1, 1, 4, 2, 2, 1, 88}}

1
Ah adamım, bu cevabı kesinlikle bekliyordum. Devam eden kesiti kendiniz oluşturmadıkça, bunu gerçek bir cevap olarak kabul etmeyeceğim.
beary605

@ beary605 Yeterince adil.
DavidC

2
+1 Daha iyi (25 karakter)ContinuedFraction@Sqrt@#&
Dr. belisarius

Burada tam olarak ne sayıyorsunuz? Bu stdin'den girdi alan bir program mı? Çünkü kullanım şekliniz, işlev tanımı olmayan bir işlev gövdesi gibi görünüyor.
Peter Taylor

@Peter Taylor Lütfen değişikliğe bakınız.
DavidC

1

Python ( 136133 96)

Devamlı kesirler için standart yöntem, son derece golf.

a=input()**.5
D=c=int(a);b=[]
while c!=D*2:a=1/(a%1);c=int(a);b+=[c]
print D,";%s;"%str(b)[1:-1]

Tuşunu kullanarak birkaç karakter kaydedebilirsiniz while 1:. İfadelerin çoğunu while döngüsüne tek bir satıra da koyabilirsiniz.
grc

Senaryonuzu çalıştırdığımda 8 ;1;74 ve 75 için bir çıktı alıyorum ; bu doğru görünmüyor. 76'da asılı duruyor.
breadbox

^^ Evet. Kodum düzeltildi.
beary605

Bu sürüm 139 için yanlış sonuç veriyor.
breadbox

Sonra benimkini silerim ve buna beraberlik
deriz

1

C, 137

Yeni satır dahil, kendi kare kökümü yuvarlamak zorunda olmadığımı varsayarsak.

#include<math.h>
main(i,e){double d;scanf("%lf",&d);e=i=d=sqrt(d);while(i^e*2)printf("%d%c",i,e^i?44:59),i=d=1.0/(d-i);printf("%d;",i);}

Sqrt (139) için kırılır ve çıktıda ara sıra ekstra noktalı virgül içerir, ancak bu gece üzerinde çalışmak için çok yorgunum :)

5
2, 4,
19
4; 2,1,3,1,2,8;
111
10; 1,1,6,1,1,20;

1

Perl, 99 karakter

Does not 139, 151, vb 1'den 9 basamak arasında değişen sayı ile test edilmiştir üzerinde berbat.

$"=",";$%=1;$==$-=($n=<>)**.5;
push@f,$==(($s=$=*$%-$s)+$-)/($%=($n-$s*$s)/$%)until$=>$-;
say"$-;@f;"

Not: $%,, $=ve $-tümü tamsayı zorlayan değişkenlerdir.


1

APL (NARS), 111 karakter, 222 bayt

r←f w;A;a;P;Q;m
m←⎕ct⋄Q←1⋄⎕ct←P←0⋄r←,a←A←⌊√w⋄→Z×⍳w=0
L: →Z×⍳0=Q←Q÷⍨w-P×P←P-⍨a×Q⋄r←r,a←⌊Q÷⍨A+P⋄→L×⍳Q>1
Z: ⎕ct←m

F işlevi, Pell denklemini çözmek için http://mathworld.wolfram.com/PellEquation.html sayfasında bulunan algo'yu temel alır . Bu f işlevinin girdisinin tümü negatif sayıya sahip değildir (tip kesiri de). Muhtemelen bir şeyler ters gidebilir, hatırlıyorum it, nasıl gördüğümde, büyük kesir sayıları için problem var,

  √13999999999999999999999999999999999999999999999x
1.183215957E23 

böylece bir işlev sqrti () olurdu. Bu nedenle kesir girişi (ve tamsayı girişi) <10 ^ 15 olmalıdır. Ölçek:

 ⎕fmt (0..8),¨⊂¨f¨0..8
┌9───────────────────────────────────────────────────────────────────────────────────────────────────────┐
│┌2─────┐ ┌2─────┐ ┌2───────┐ ┌2─────────┐ ┌2─────┐ ┌2───────┐ ┌2─────────┐ ┌2─────────────┐ ┌2─────────┐│
││  ┌1─┐│ │  ┌1─┐│ │  ┌2───┐│ │  ┌3─────┐│ │  ┌1─┐│ │  ┌2───┐│ │  ┌3─────┐│ │  ┌5─────────┐│ │  ┌3─────┐││
││0 │ 0││ │1 │ 1││ │2 │ 1 2││ │3 │ 1 1 2││ │4 │ 2││ │5 │ 2 4││ │6 │ 2 2 4││ │7 │ 2 1 1 1 4││ │8 │ 2 1 4│││
││~ └~─┘2 │~ └~─┘2 │~ └~───┘2 │~ └~─────┘2 │~ └~─┘2 │~ └~───┘2 │~ └~─────┘2 │~ └~─────────┘2 │~ └~─────┘2│
│└∊─────┘ └∊─────┘ └∊───────┘ └∊─────────┘ └∊─────┘ └∊───────┘ └∊─────────┘ └∊─────────────┘ └∊─────────┘3
└∊───────────────────────────────────────────────────────────────────────────────────────────────────────┘
  f 19
4 2 1 3 1 2 8 
  f 54321x
233 14 1 1 3 2 1 2 1 1 1 1 3 4 6 6 1 1 2 7 1 13 4 11 8 11 4 13 1 7 2 1 1 6 6 4 3 1 1 1 1 2 1 2 3 1 1 14 466 
  f 139
11 1 3 1 3 7 1 1 2 11 2 1 1 7 3 1 3 1 22 
  +∘÷/f 139
11.78982612
  √139
11.78982612

bağımsız değişken bir sayının karesi ise, yalnızca 1 öğenin bir listesini, bu sayının sqrt değerini döndürür

  f 4
2 

Benden bağlı olurdu, "codegolf" olmadan bir egzersizde sqrti () işlevini kullanan önceki düzenleme tercih ediyorum ...


1
elbette fqve yerine tek harfli adlar kullanabilirsiniz a0. ayrıca: (a×Q)-P->P-⍨a×Q
ngn

Q←Q÷⍨- Narlar destekliyor Q÷⍨←mu?
ngn

@ngn: Ben kullanımına sevmiyorum "Q ÷ ⍨ ←" Birden atama formülün bir zincirde ... için kalır katılıyorum ... Olası diyorum ben C Tanımsız Davranışı gördüğüm için
RosLuP
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.