ซ้ำซึ่งกันและกัน


11

สิ่งที่คุณต้องทำคือสร้างฟังก์ชั่น / โปรแกรมที่รับทศนิยมเป็นอินพุทและเอาท์พุทผลลัพธ์ของการรับส่วนกลับของส่วนที่เป็นเศษส่วนของตัวเลขซ้ำ ๆ จนกระทั่งจำนวนกลายเป็นจำนวนเต็ม

โดยเฉพาะอย่างยิ่งกระบวนการดังต่อไปนี้:

  1. ให้ x เป็นอินพุต

  2. ถ้า x เป็นจำนวนเต็มให้เอาท์พุท

  3. มิฉะนั้น:(x)} กลับไปที่ 2x1frac(x)

frac(x)เป็นองค์ประกอบที่เศษส่วนของและเท่ากับ\ เป็นพื้นของ x, ซึ่งเป็นเลขยิ่งน้อยกว่าxxxxxx

กรณีทดสอบ:

0 = 0
0.1 = 1/10 -> 10
0.2 = 1/5 -> 5
0.3 = 3/10 -> 10/3 -> 1/3 -> 3
0.4 = 2/5 -> 5/2 -> 1/2 -> 2
0.5 = 1/2 -> 2
0.6 = 3/5 -> 5/3 -> 2/3 -> 3/2 -> 1/2 -> 2
0.7 = 7/10 -> 10/7 -> 3/7 -> 7/3 -> 1/3 -> 3
0.8 = 4/5 -> 5/4 -> 1/4 -> 4
0.9 = 9/10 -> 10/9 -> 1/9 -> 9
1 = 1
3.14 = 157/50 -> 7/50 -> 50/7 -> 1/7 -> 7
6.28 = 157/25 -> 7/25 -> 25/7 -> 4/7 -> 7/4 -> 3/4 -> 4/3 -> 1/3 -> 3

สรุปสำหรับ 0 ถึง 1 ที่เพิ่มขึ้น 0.1: 0, 10, 5, 3, 2, 2, 2, 3, 4, 9, 1

นี่คือซึ่งมีจำนวนน้อยที่สุดที่จะชนะ

ชี้แจง:

  • "คะแนนโบนัส" โดยไม่มีข้อผิดพลาดในการปัดเศษ
  • ควรทำงานกับจำนวนตรรกยะที่ไม่เป็นลบ (ละเว้นข้อผิดพลาดในการปัดเศษ)
  • คุณสามารถ แต่ไม่จำเป็นต้องแสดงขั้นตอนที่ทำ
  • คุณสามารถรับข้อมูลเป็นทศนิยมเศษส่วนหรือคู่ของตัวเลขซึ่งสามารถอยู่ในสตริง

ขออภัยสำหรับปัญหาทั้งหมดนี่เป็นคำถามแรกของฉันในเว็บไซต์นี้


ความจริงที่ว่าการยกเลิกนี้เกี่ยวข้องกับความเป็นไปได้ของการแสดงทศนิยมเป็นเศษส่วนต่อเนื่อง
Leun Nun

4
เราคาดว่าจะส่งออกลอย? พวกเขาทำให้เกิดปัญหาความแม่นยำ
Leun Nun

7
คุณช่วยรายละเอียดกระบวนการมากขึ้นอีกหน่อยได้ไหม? ฉันไม่แน่ใจเกี่ยวกับสิ่งที่ "ส่วนกลับของเศษส่วนของตัวเลข" เกี่ยวข้องและกรณีทดสอบก็ไม่ได้ช่วยอะไรมากมายเช่นกัน
Ad Hoc Garf Hunter

4
เราสามารถนำจำนวนเต็มสองจำนวนมาเป็นอินพุตเพื่อแสดงจำนวนตรรกยะได้หรือไม่?
Leun Nun

1
นี่เท่ากับองค์ประกอบสุดท้ายของเศษส่วนต่อเนื่องที่เรียบง่ายของอินพุต
isaacg

คำตอบ:


5

J, 18 ไบต์

%@(-<.)^:(~:<.)^:_

ใน J สำนวนu ^: v ^:_หมายถึง "ใช้กริยาuในขณะที่เงื่อนไขvคืนค่าเป็นจริง

ในกรณีของเราเงื่อนไขสิ้นสุดถูกกำหนดโดย hook ~:<.ซึ่งหมายถึง "พื้นของตัวเลข<.ไม่เท่ากับ~:ตัวเลขนั้น" - ดังนั้นเราจะหยุดเมื่อกริยาหลักuคืนค่า int

uในกรณีนี้คือเบ็ดอีก-<.- จำนวนลบพื้น - มีค่าตอบแทนจะถูกป้อนเข้ากริยาซึ่งกันและกัน@%

ลองออนไลน์!


นอกจากนี้ยังมี 18 แต่มีบางส่วน imprecisions _2{(%@-<.) ::]^:a:จุดลอยเพราะความคลาดเคลื่อนสันนิษฐานว่า:
โคล

%@|~&1^:(~:<.)^:_
FrownyFrog


5

Mathematica ขนาด 36 ไบต์

Last@*ContinuedFraction@*Rationalize

การสาธิต

In[1]:= f = Last@*ContinuedFraction@*Rationalize

Out[1]= Last @* ContinuedFraction @* Rationalize

In[2]:= f[0]

Out[2]= 0

In[3]:= f[0.1]

Out[3]= 10

In[4]:= f[0.2]

Out[4]= 5

In[5]:= f[0.3]

Out[5]= 3

In[6]:= f[0.4]

Out[6]= 2

In[7]:= f[0.5]

Out[7]= 2

In[8]:= f[0.6]

Out[8]= 2

In[9]:= f[0.7]

Out[9]= 3

In[10]:= f[0.8]

Out[10]= 4

In[11]:= f[0.9]

Out[11]= 9

In[12]:= f[1]

Out[12]= 1

สิ่งที่เกิดขึ้นโดยไม่ได้Rationalize?
Greg Martin

1
@GregMartin ไม่มีRationalize, Mathematica คิดว่าไม่มีความแม่นยำเพียงพอที่จะสร้างทุกส่วนของเศษส่วนต่อเนื่อง ยกตัวอย่างเช่นเป็นเพียงContinuedFraction[0.1] {0}
Anders Kaseorg

4

Perl 6 , 42 ไบต์

{($_,{1/($_-.floor)}...*.nude[1]==1)[*-1]}

ลองออนไลน์!

nudeวิธีการส่งกลับnu merator และเด nominator ของจำนวนจริงเป็นรายการที่สององค์ประกอบ มันสั้นกว่าที่จะได้ตัวส่วนด้วยวิธีนี้กว่าเรียกdenominatorวิธีโดยตรง


4

Haskell , 47 ไบต์

นี้เต้นคำตอบข้าวสาลีของพ่อมดเพราะGHC.Realช่วยให้เราสามารถแข่งขันลวดลายบน rationals ใช้:%ตลอดจนมีชื่อที่สั้นลง

import GHC.Real
f(x:%1)=x
f x=f$1/(x-floor x%1)

ลองออนไลน์!

fใช้Rationalตัวเลขเป็นอินพุตแม้ว่า ghc อนุญาตให้เขียนในรูปแบบทศนิยมภายในความแม่นยำที่แน่นอน


4

Haskell , 40 34 ไบต์

แก้ไข:

  • -6 ไบต์: @WheatWizard ชี้ให้เห็นว่าเศษส่วนอาจได้รับเป็นสองอาร์กิวเมนต์ที่แยกต่างหาก

(ไม่สามารถต้านทานการโพสต์สิ่งนี้หลังจากเห็นคำตอบของ Haskell ด้วยการนำเข้าแบบ verbose - ตอนนี้ฉันเห็นคำตอบภาษาอื่น ๆ ก็ใช้วิธีนี้เช่นกัน)

!รับอาร์กิวเมนต์จำนวนเต็มสองตัว (ตัวเศษและตัวส่วนของเศษส่วนโดยไม่จำเป็นต้องเป็นคำที่เล็กที่สุด แต่ตัวหารต้องเป็นค่าบวก) และส่งกลับจำนวนเต็ม โทร314!100มา

n!d|m<-mod n d,m>0=d!m|0<1=div n d

ลองออนไลน์!

  • ละเว้นชนิดไม่ตรงกันส่วนบางส่วนของn/d(สมมติว่าdในเชิงบวก) จะmod n d/dดังนั้นถ้าmod n d==0, !recurses d/mod n dกับตัวแทนของ


@WheatWizard หืมมมฉันแปลว่า "pair" ว่าเป็นคู่แทนที่จะเป็นสองอาร์กิวเมนต์ที่ต่างกัน ฉันคิดว่านั่นเป็นการตีความที่เป็นศูนย์กลางของ Haskell มากเกินไป
Ørjan Johansen

3

Python 3 + sympy , 67 ไบต์

from sympy import*
k=Rational(input())
while k%1:k=1/(k%1)
print(k)

ลองออนไลน์!

Sympy เป็นชุดคณิตศาสตร์เชิงสัญลักษณ์สำหรับ Python เนื่องจากเป็นสัญลักษณ์และไม่ใช่ไบนารีจึงไม่มีความคลาดเคลื่อนของจุดลอยตัว



2

เยลลี่ 8 ไบต์

®İ$%1$©¿

ลองออนไลน์!

ความไม่ถูกต้องของจุดลอยตัว


ขอให้โชคดีสำหรับ 0.7
Leun Nun

@LeakyNun โชคนั่นหมายถึงลูปไม่สิ้นสุดหรือลูปไม่สิ้นสุด ...
Erik the Outgolfer

ใช้Mเพื่อแก้ไขความไม่ถูกต้องจุดลอยตัว: P มันเป็นเยลลี่ แต่มีความแม่นยำทางคณิตศาสตร์โดยพลการ ไม่ได้แก้ไข 0.7 ลูป
HyperNeutrino

@HyperNeutrino M เป็นรุ่นที่ล้าสมัยของ Jelly
Erik the Outgolfer



2

Haskell , 62 61 ไบต์

import Data.Ratio
f x|denominator x==1=x|u<-x-floor x%1=f$1/u

ลองออนไลน์!

ใช้Data.Ratioห้องสมุดของ Haskell สำหรับการปันส่วนความแม่นยำโดยพลการ ถ้าเพียงชื่อในตัวไม่นาน


@ H.PWiz ดี! Data.Ratioฉันได้รับการพยายามที่จะจับคู่กับรูปแบบ GHC.Realผมไม่เคยได้ยิน รู้สึกฟรีเพื่อโพสต์ว่าเป็นคำตอบของคุณเอง
Ad Hoc Garf Hunter


1

APL (Dyalog Classic)ขนาด 18 ไบต์

{1e¯9>t1|⍵:⍵⋄∇÷t}

ลองออนไลน์!

APL NARS, 18 ตัวอักษร

-1 ไบต์ด้วยการทดสอบของ Uriel

f←{1e¯9>t1|⍵:⍵⋄∇÷t}
v0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1 3.14
⎕←vf¨v
  0 0  0.1 10  0.2 5  0.3 3  0.4 2  0.5 2  0.6 2  0.7 3  0.8 4  0.9 9  1 1  3.14 7 

⍵-⌊⍵1|⍵หนึ่งไบต์
Uriel

@Uriel ขอบคุณ ... ดังนั้น bytes จึงเป็นวิธีแก้ปัญหา J
RosLuP



0

JavaScript, 70 ไบต์

x=>(y=(x+'').slice(2),p=(a,b)=>b?a%b?p(b,a%b):a/b:0,p(10**y.length,y))

หากเราสามารถเปลี่ยนประเภทอินพุตเป็นสตริงได้มันอาจบันทึกได้ 5 ไบต์


วิธีนี้ใช้ไม่ได้กับตัวเลข> = 10
Shaggy

@Shaggy รองรับตัวเลข> 1 ต้องการหรือไม่
tsh

ใช่มันควรทำงานกับจำนวนตรรกยะใด ๆ (ละเว้นข้อผิดพลาดในการปัดเศษออก)
โซโลมอน Ucko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.