การหาเศษส่วนต่อเนื่องของรากที่สอง


13

ส่วนอย่างต่อเนื่องของจำนวนnเป็นส่วนหนึ่งของรูปแบบต่อไปนี้: ที่ลู่ไป


n

ลำดับaในเศษส่วนต่อเนื่องมักเขียนเป็น: [a 0 ; a 1 , 2 , a 3 , ... a n ]
เราจะเขียนแบบของเราในแบบเดียวกัน แต่ด้วยส่วนที่ซ้ำระหว่างอัฒภาค

nเป้าหมายของคุณคือการกลับส่วนอย่างต่อเนื่องของรากที่สองของ
การป้อนข้อมูล:nจำนวนเต็ม nจะไม่เป็นสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ
เอาท์พุท:sqrt(n)เศษอย่างต่อเนื่องของ

กรณีทดสอบ:
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

รหัสที่สั้นที่สุดชนะ โชคดี!


1
เอาต์พุตต้องอยู่ในรูปแบบเดียวกันกับเคสทดสอบหรือไม่?
GRC

ไม่ได้ตราบใดที่คุณมีเครื่องหมายอัฒภาคก็โอเค
beary605

หืมรับคำตอบที่ถูกต้องมีปัญหาเมื่อรู้ว่าเศษส่วนมีเหตุผลพอที่จะหยุด มันง่ายจริง ๆ หรือเปล่าที่ <sub> 0 </sub> นั้นเพิ่มขึ้นเป็นสองเท่าของ sqrt ของอินพุตดั้งเดิม?
JoeFish

ใช่นั่นคือขีด จำกัด
beary605

@ beary605 ขอบคุณ เคยอ่านมากขึ้นและตอนนี้ฉันเห็นว่าเศษส่วนต่อเนื่องของสแควร์รูทนั้นเป็นกรณีพิเศษเล็กน้อย สิ่งที่น่าสนใจ! ยังคงทำงานกับรุ่นที่ไม่ลอย
JoeFish

คำตอบ:


3

GolfScript ( 66 60 ตัวอักษร)

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

คำเตือน: ส่วนใหญ่?ในนั้นมีตัวแปรที่เป็นตัวแทนfloor(sqrt(input))มากกว่า builtin แต่สิ่งแรกคือตัวภายใน

รับอินพุตบน stdin และเอาต์พุตไปยัง stdout

Psuedocode ของอัลกอริทึม (พิสูจน์ความถูกต้องเหลืออยู่ในปัจจุบันเป็นแบบฝึกหัดสำหรับผู้อ่าน):

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)

อีกครั้งฉันพบว่าตัวเองต้องการตัวดำเนินการเดียวซึ่งใช้a bกับสแต็กและออกa/b a%bจากสแต็ก


1
ฉันจะบอกว่าฉันต้องเรียนรู้ GS จริง ๆ แต่ต้องการคำศัพท์ที่นี่แรงเกินไป)
บูธโดย

1
@boothby ไม่ต้องบ้า ชีวิตของคุณจะไม่สมบูรณ์หากไม่มี GS;)
Peter Taylor

3

Python, 95 97 (แต่ถูกต้อง ... )

ใช้เลขจำนวนเต็มและการหารพื้นเท่านั้น สิ่งนี้จะให้ผลลัพธ์ที่ถูกต้องสำหรับอินพุตจำนวนเต็มบวกทั้งหมด แต่หากต้องการใช้ความยาวก็จะต้องเพิ่มอักขระ m=a=0Lเช่น และแน่นอน ... รอหนึ่งล้านปีที่ผ่านมาพื้นที่ของคนจนของฉันจะหายไป

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

เอาท์พุท:

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

แก้ไข: ตอนนี้ใช้อัลกอริทึมของ Peter Taylor มันdo...whileสนุกมาก


มีจุดประสงค์*(c*c-n)อะไร?
Peter Taylor

@ PeterTaylor ฉันไม่ได้อ่านความท้าทายอย่างถี่ถ้วนและทำให้โค้ดใช้งานได้กับสี่เหลี่ยมที่สมบูรณ์แบบ
บูธตาม

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`+";"

ใช้จำนวนเต็มหนึ่งตัวและให้ผลลัพธ์เช่น:

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

x-int(x) -> x%1. ฉันประทับใจ :)
beary605

ให้ผลลัพธ์ที่ผิดสำหรับ√139ตามWolfram Alpha
breadbox

ฉันได้อัปเดตให้ใช้งานได้สำหรับ√139 อย่างไรก็ตามหากความยาวของลำดับนั้นยาวขึ้นมาก (√139มีลำดับ 18 หมายเลข) ผลลัพธ์ก็อาจเริ่มหมดความแม่นยำ
grc

ฉันพบว่ามันน่าสนใจอย่างไม่น่าเชื่อที่จะสิ้นสุดใน 2 * int (sqrt (a))
beary605

ที่น่าสนใจคือตอนนี้เรา 3 คนมีรหัสที่ใช้งานไม่ได้สำหรับ 139 (ของฉันยังคงอยู่ที่ยกเลิกการตีกอล์ฟ
JoeFish

2

Mathematica 33 31

c[n_]:=ContinuedFraction@Sqrt@n

เอาต์พุตอยู่ในรูปแบบรายการซึ่งเหมาะสมกว่าสำหรับ Mathematica ตัวอย่าง:

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
โอ้มนุษย์ฉันคาดหวังคำตอบทั้งหมดนี้ ฉันจะไม่คิดว่ามันเป็นคำตอบที่แท้จริงเว้นแต่คุณจะสร้างเศษส่วนต่อเนื่องของตัวเอง
beary605

@ beary605 ยุติธรรมเพียงพอ
DavidC

2
+1 ดีขึ้น (25 ตัวอักษร)ContinuedFraction@Sqrt@#&
ดร. เบลิซาเรีย

คุณนับที่นี่ว่าอะไรกันแน่? นี่เป็นโปรแกรมที่รับอินพุตจาก stdin หรือไม่ เพราะวิธีที่คุณใช้มันดูเหมือนว่ามันเป็นฟังก์ชั่นของร่างกายโดยไม่ต้องนิยามฟังก์ชั่น
ปีเตอร์เทย์เลอร์

@Peter Taylor โปรดดูการแก้ไข
DavidC

1

Python ( 136 133 96)

วิธีการมาตรฐานสำหรับเศษส่วนต่อเนื่องกอล์ฟมาก

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]

while 1:คุณสามารถบันทึกไม่กี่ตัวอักษรโดยใช้ คุณสามารถใส่คำสั่งส่วนใหญ่ในขณะที่วนรอบในบรรทัดเดียว
grc

เมื่อฉันรันสคริปต์ของคุณฉันจะได้ผลลัพธ์8 ;1;เป็น 74 และ 75 ดูเหมือนจะไม่ถูกต้อง มันแขวนที่ 76.
breadbox

^^ ใช่ แก้ไขรหัสของฉัน
beary605

รุ่นนี้ให้ผลลัพธ์ที่ผิดสำหรับ 139.
breadbox

@boothby แล้วฉันจะลบเหมืองและเราจะเรียกมันว่าวาด :)
JoeFish

1

C, 137

รวมถึงการขึ้นบรรทัดใหม่โดยสมมติว่าฉันไม่ต้องม้วนรากที่สองของตัวเอง

#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) และมีเครื่องหมายอัฒภาคพิเศษเป็นครั้งคราวในผลลัพธ์ แต่ฉันเหนื่อยเกินไปที่จะทำงานต่อไปในคืนนี้ :)

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

1

Perl, 99 ตัวอักษร

ไม่ได้กรูขึ้น 139, 151, ฯลฯ ผ่านการทดสอบที่มีจำนวนตั้งแต่ 1 ถึง 9 หลัก

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

หมายเหตุ: $%, $=และ$-เป็นตัวแปรบังคับจำนวนเต็มทั้งหมด


1

APL (NARS) 111 ตัวอักษร 222 ไบต์

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 ขึ้นอยู่กับ algo one find ในหน้าhttp://mathworld.wolfram.com/PellEquation.html เพื่อแก้สมการ Pell ฟังก์ชั่น f นั้นมีอินพุตทั้งหมดไม่ใช่จำนวนลบ (เศษส่วนของประเภทด้วย) เป็นไปได้ว่ามีบางอย่างผิดปกติฉันจำได้ว่า√มีวิธีที่ฉันเห็นปัญหาสำหรับตัวเลขเศษส่วนขนาดใหญ่เช่น

  √13999999999999999999999999999999999999999999999x
1.183215957E23 

ดังนั้นจะมีหนึ่งฟังก์ชัน sqrti () ด้วยเหตุผลนี้อินพุตเศษส่วน (และอินพุตจำนวนเต็ม) จะต้อง <10 ^ 15 ทดสอบ:

 ⎕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

ถ้าอาร์กิวเมนต์เป็นสี่เหลี่ยมจัตุรัสของตัวเลขมันจะส่งคืนหนึ่งรายการของ 1 องค์ประกอบเท่านั้น sqrt ของตัวเลขนั้น

  f 4
2 

ถ้ามันจะขึ้นอยู่กับฉันในแบบฝึกหัดเดียวโดยไม่มี "codegolf" ฉันต้องการแก้ไขก่อนหน้าที่ใช้ function sqrti () ...


1
แน่นอนคุณสามารถใช้ชื่อตัวอักษรเดียวแทนและfq a0ยัง: (a×Q)-P->P-⍨a×Q
ngn

Q←Q÷⍨- nars รองรับQ÷⍨←หรือไม่
ngn

@ngn: ฉันไม่ชอบที่จะใช้ "Q ÷⍨←" ในห่วงโซ่ของสูตรที่ได้รับมอบหมายหลาย ... สำหรับยังคงเห็นด้วย ... เป็นไปได้ที่ฉันบอกว่าเพราะฉันเห็น C พฤติกรรมที่ไม่ได้กำหนด
RosLuP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.