반복적 인 왕복


11

당신이해야 할 일은 입력으로 소수를 취하는 함수 / 프로그램을 만들고 숫자가 정수가 될 때까지 숫자의 소수 부분의 역수를 반복적으로 얻은 결과를 출력하는 것입니다.

보다 구체적으로, 프로세스는 다음과 같습니다.

  1. x를 입력하자

  2. x가 정수이면 출력하십시오.

  3. 그렇지 않은 경우 : . 2로 돌아갑니다.x1frac(x)

frac(x) 는 의 분수 구성 요소이며 와 같습니다 . 가장 큰 정수 미만입니다 X의입니다 바닥, .xxxxx

테스트 사례 :

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

이것은 이므로 가장 적은 바이트가 이깁니다.

설명 :

  • 반올림 오류가없는 "보너스 포인트"
  • 음수가 아닌 합리적인 숫자에 대해 작동해야합니다 (반올림 오류 무시).
  • 할 수는 있지만 수행 한 단계를 출력 할 필요는 없습니다.
  • 문자열에있을 수있는 10 진수, 분수 또는 숫자 쌍으로 입력 할 수 있습니다.

모든 문제에 대해 죄송합니다.이 웹 사이트의 첫 번째 질문입니다.


이것이 종료된다는 사실은 소수를 연속 분수로 표현할 수있는 가능성과 밀접한 관련이 있습니다.
Leaky Nun

4
플로트를 출력 할 것으로 예상됩니까? 그들은 약간의 정확성 문제를 일으킨다.
Leaky Nun

7
프로세스를 좀 더 자세히 설명해 주시겠습니까? "숫자의 소수 부분의 역수"가 무엇인지 확실하지 않으며 테스트 사례도 그다지 도움이되지 않습니다.
Ad Hoc Garf Hunter

4
유리수를 나타 내기 위해 두 개의 정수를 입력 값으로 사용할 수 있습니까?
Leaky Nun

1
이것은 입력의 단순 연속 부분의 최종 요소와 같습니다.
isaacg

답변:


5

J, 18 바이트

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

J에서 관용구 u ^: v ^:_는 " u조건을 vtrue로 반환 하면서 동사 를 계속 적용합니다."를 의미 합니다.

우리의 경우, 종료 조건은 hook에 의해 정의되는데 ~:<., 이는 "숫자의 바닥이 숫자 자체와 <.같지 않다 "는 것을 의미합니다. ~:그래서 우리는 주 동사 u가 int를 반환 할 때 멈출 것 입니다.

u이 경우에는 다른 고리이고 -<., 그 반환 값에 공급 - 수를 뺀 층 - @상호 동사 %.

온라인으로 사용해보십시오!


또한 18이지만 공차로 인해 일부 부동 소수점 부정확성이 _2{(%@-<.) ::]^:a:있습니다.
cole

%@|~&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]is {0}입니다.
Anders Kaseorg

4

펄 6 , 42 바이트

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

온라인으로 사용해보십시오!

nude방법은 반환 merator와 , 2 요소의 목록과 같은 유리수의 추천인을. denominator메소드를 직접 호출하는 것보다이 방법으로 분모를 얻는 것이 더 짧습니다 .



4

하스켈 , 40 34 바이트

편집하다:

  • -6 바이트 : @WheatWizard는 분수가 아마도 두 개의 별도 인수로 주어질 수 있다고 지적했습니다.

(자세한 수입으로 Haskell의 답변을 본 후에는 게시하지 않을 수 없었습니다. 이제 다른 언어 답변도 본질적 으로이 방법을 사용하고 있습니다.)

!두 개의 정수 인수 (분수의 분자 및 분모; 가장 작은 용어 일 필요는 없지만 분모는 양수 여야 함)를 취하여 정수를 리턴합니다. 로 전화하십시오 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, !표현과 재귀 d/mod n d.


@WheatWizard Hm : "pair"는 두 개의 별개의 인수가 아니라 한 쌍이어야한다고 해석했습니다. 나는 이것이 하스켈 중심의 해석이라고 생각합니다.
Ørjan Johansen



2

젤리 , 8 바이트

®İ$%1$©¿

온라인으로 사용해보십시오!

부동 소수점 부정확성.


0.7 행운을 빌어 요
Leaky Nun

@LeakyNun 그 행운은 무한 루프 또는 무한 루프를 의미합니다 ...
Outgolfer Erik

사용은 M부동 소수점 부정확성을 해결하기 위해 : P를 . 그것은 젤리이지만 임의의 정밀 수학입니다. 0.7 루프를 수정하지는 않습니다.
HyperNeutrino

@HyperNeutrino M은 Jelly의 오래된 버전입니다.
에릭 Outgolfer


2

자바 스크립트 ES6, 25 바이트

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

전화 f(a,b)에 대한a/b


gcd(a,b)=1제거 할 수있는 경우/b
l4m2

2

하스켈 , 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 자

Uriel 테스트 덕분에 -1 바이트

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|⍵1 바이트
Uriel

바이트는 J 솔루션으로되도록 @Uriel는 ... 감사합니다
RosLuP


1

Stax , 8 바이트

ç▄é⌠á◙àù

실행 및 디버깅

정밀도 오류가없는 "보너스 포인트" 부동 소수점 산술이 사용되지 않습니다. 이것은 (최종적으로) stax의 내장 합리적인 유형을 사용합니다.


0

자바 스크립트, 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

그렇습니다. 모든 합리적인 숫자에 대해 작동해야합니다 (반올림 오류 무시).
Solomon Ucko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.