Đối ứng lặp đi lặp lại


11

Những gì bạn cần làm là tạo một hàm / chương trình lấy số thập phân làm đầu vào và đưa ra kết quả của việc liên tục lấy đối ứng của phần phân số của số, cho đến khi số đó trở thành số nguyên.

Cụ thể hơn, quy trình như sau:

  1. Đặt x là đầu vào

  2. Nếu x là một số nguyên, xuất nó.

  3. khác: . Quay trở lại 2.x1frac(x)

frac(x)x x - x x x là thành phần phân số của và bằng . là sàn của x, là số nguyên lớn nhất nhỏ hơn .xxxxx

Các trường hợp thử nghiệm:

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

Tóm tắt từ 0 đến 1 với các mức tăng 0,1: 0, 10, 5, 3, 2, 2, 2, 3, 4, 9, 1

Đây là , vì vậy ít byte nhất sẽ thắng.

Làm rõ:

  • "Điểm thưởng" không có lỗi làm tròn
  • Nên hoạt động cho bất kỳ số hữu tỷ không âm nào (bỏ qua lỗi làm tròn)
  • Bạn có thể, nhưng không phải xuất các bước đã thực hiện
  • Bạn có thể lấy đầu vào dưới dạng thập phân, phân số hoặc cặp số có thể ở trong một chuỗi.

Xin lỗi cho tất cả các vấn đề, đây là câu hỏi đầu tiên của tôi trên trang web này.


Thực tế là điều này chấm dứt liên quan chặt chẽ đến khả năng thể hiện một số thập phân trong phần tiếp tục.
Leaky Nun

4
Chúng tôi dự kiến ​​sẽ nổi đầu ra? Chúng gây ra một số vấn đề chính xác.
Leaky Nun

7
Bạn có thể chi tiết quá trình một chút nữa không? Tôi không chắc chắn về việc "đối ứng của phần phân số" đòi hỏi gì, và các trường hợp thử nghiệm cũng không giúp được gì nhiều
Post Rock Garf Hunter

4
Chúng ta có thể lấy hai số nguyên làm đầu vào để biểu diễn một số hữu tỷ không?
Rò rỉ Nun

1
Điều này bằng với phần tử cuối cùng của phần tiếp tục đơn giản của đầu vào.
isaacg

Câu trả lời:


5

J, 18 byte

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

Trong J, thành ngữ u ^: v ^:_có nghĩa là "Tiếp tục áp dụng động từ utrong khi điều kiện vtrả về đúng.

Trong trường hợp của chúng tôi, điều kiện kết thúc được xác định bởi hook ~:<., có nghĩa là "sàn của số <.không bằng ~:chính số đó" - vì vậy chúng tôi sẽ dừng khi động từ chính utrả về một int.

utrong trường hợp này là một cái móc khác -<.- số trừ sàn của nó - có giá trị trả về được đưa vào @động từ đối ứng %.

Hãy thử trực tuyến!


Cũng 18, nhưng có một số sai số điểm nổi vì dung sai có lẽ là : _2{(%@-<.) ::]^:a:.
cole

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


5

Toán học, 36 byte

Last@*ContinuedFraction@*Rationalize

Bản giới thiệu

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

Điều gì xảy ra mà không có Rationalize?
Greg Martin

1
@GregMartin Không có Rationalize, Mathematica cho rằng không có đủ độ chính xác để tạo ra tất cả các điều khoản của phân số tiếp tục. Ví dụ, ContinuedFraction[0.1]chỉ là {0}.
Anders Kaseorg

4

Perl 6 , 42 byte

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

Hãy thử trực tuyến!

Các nudephương pháp trả về nu merator và de đề cử của một số hợp lý như một danh sách hai yếu tố. Cách này ngắn hơn để lấy mẫu số theo cách này hơn là gọi denominatorphương thức trực tiếp.


4

Haskell , 47 byte

Điều này đánh bại câu trả lời của Wheat WizardGHC.Realcho phép chúng ta tạo mẫu khớp với các tỷ lệ hợp lý bằng cách sử dụng :%, cũng như có một tên ngắn hơn

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

Hãy thử trực tuyến!

flấy một Rationalsố làm đầu vào, mặc dù ghc cho phép chúng được viết theo định dạng thập phân, trong một độ chính xác nhất định.


4

Haskell , 40 34 byte

Biên tập:

  • -6 byte: @WheatWizard chỉ ra phân số có thể được đưa ra dưới dạng hai đối số riêng biệt.

(Không thể cưỡng lại việc đăng bài này sau khi thấy câu trả lời của Haskell với nhập khẩu dài dòng - bây giờ tôi thấy một số câu trả lời ngôn ngữ khác cũng chủ yếu sử dụng phương pháp này.)

!lấy hai đối số nguyên (tử số và mẫu số của phân số; chúng không cần ở các số hạng nhỏ nhất nhưng mẫu số phải dương) và trả về một số nguyên. Gọi như 314!100.

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

Hãy thử trực tuyến!

  • Bỏ qua sự không phù hợp kiểu, phần phân số của n/d(giả sử ddương) là mod n d/d, vì vậy trừ khi mod n d==0, !đệ quy với một đại diện của d/mod n d.


@WheatWizard Hừm, tôi đã giải thích "cặp" là phải là một cặp chứ không phải là hai đối số riêng biệt. Tôi cho rằng đó là một cách giải thích quá trung tâm của Haskell.
Ørjan Johansen

3

Python 3 + sympy , 67 byte

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

Hãy thử trực tuyến!

Sympy là một gói toán học tượng trưng cho Python. Bởi vì nó là biểu tượng và không phải là nhị phân, không có điểm không chính xác.



2

Thạch , 8 byte

®İ$%1$©¿

Hãy thử trực tuyến!

Điểm không chính xác nổi.


Chúc may mắn làm điều đó cho 0,7
Leaky Nun

@LeakyNun May mắn đó có nghĩa là vòng lặp vô hạn hoặc vòng lặp vô hạn ...
Erik the Outgolfer

Sử dụng Mđể sửa chữa không chính xác dấu chấm động: P . Đó là Jelly nhưng với toán học chính xác tùy ý. Không sửa lỗi vòng lặp 0,7 mặc dù.
HyperNeutrino

@HyperNeutrino M là phiên bản lỗi thời của Jelly.
Erik the Outgolfer


2

JavaScript ES6, 25 byte

f=(a,b)=>a%b?f(b,a%b):a/b

Gọi f(a,b)choa/b


Nếu gcd(a,b)=1có thể xóa/b
l4m2

2

Haskell , 62 61 byte

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

Hãy thử trực tuyến!

Sử dụng Data.Ratiothư viện của Haskell cho các lý do chính xác tùy ý. Nếu chỉ có tên dựng sẵn không quá dài.


@ H.PWiz Đẹp! Tôi đã cố gắng để phù hợp với mô hình Data.Ratio. Tôi chưa bao giờ nghe nói về GHC.Real. Hãy gửi bài đó như câu trả lời của riêng bạn.
Đăng Rock Garf Hunter


1

APL (Dyalog Classic) , 18 byte

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

Hãy thử trực tuyến!

APL NARS, 18 ký tự

-1 byte nhờ kiểm tra 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|⍵cho một byte
Uriel

@Uriel cảm ơn bạn ... Vì vậy, các byte là giải pháp J
RosLuP


1

Stax , 8 byte

ç▄é⌠á◙àù

Chạy và gỡ lỗi nó

"Điểm thưởng" không có lỗi chính xác. Không có số học dấu phẩy động được sử dụng. Điều này (cuối cùng) sử dụng loại hợp lý tích hợp sẵn của stax.


0

JavaScript, 70 byte

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

Nếu chúng ta có thể thay đổi loại đầu vào thành một chuỗi, thì nó có thể tiết kiệm 5 byte.


Điều này sẽ không hoạt động cho các số> = 10.
Shaggy

@Shaggy Có hỗ trợ số> 1 không?
tsh

Có, nó sẽ hoạt động cho bất kỳ số hữu tỷ nào (bỏ qua lỗi làm tròn).
Solomon Ucko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.