繰り返される相互


11

あなたがする必要があるのは、入力として小数を取り、数が整数になるまで、小数部分の逆数を繰り返し取った結果を出力する関数/プログラムを作成することです。

より具体的には、プロセスは次のとおりです。

  1. xを入力とします

  2. xが整数の場合、それを出力します。

  3. そうでない場合:。2に戻ります。バツ1fracバツ

fracバツはの小数成分であり、等しくなります。最大整数未満であるXのある床、。バツバツバツバツバツ

テストケース:

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進数、分数、または数値のペアとして受け取ることができます。

すべての問題で申し訳ありませんが、これはこのウェブサイトでの最初の質問です。


これが終了するという事実は、小数を連続分数で表現する可能性と密接に関連しています。
リーキー修道女

4
フロートを出力する予定ですか?それらは精度の問題を引き起こします。
リーキー修道女

7
プロセスについてもう少し詳しく教えてください。私は「数値の小数部の逆数」何伴いに関してはわからないんだ、とテストケースはあまりのいずれか助けていません
ポストロックGARFハンター

4
有理数を表す入力として2つの整数を使用できますか?
リーキー修道女

1
これは、入力の単純な継続部分の最終要素に等しくなります。
-isaacg

回答:


5

J、18バイト

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

Jでは、イディオムu ^: v ^:_は「u条件vがtrueを返す間、動詞を適用し続けます。

この場合、終了条件はhookによって定義されます~:<.。これは、「数値の下限が数値自体に<.等しくない」ことを意味し~:ます。したがって、主動詞uがintを返すときに停止します。

uこの場合、もう1つのフック-<.(数値から下限値)が返され@、その戻り値は相互動詞に渡され%ます。

オンラインでお試しください!


また、18ですが、許容値のために浮動小数点の不正確さがあります_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どうなりますか?
グレッグマーティン

1
@GregMartinなしではRationalize、Mathematicaは連続分数のすべての項を生成するのに十分な精度がないと考えます。たとえば、ContinuedFraction[0.1]です{0}
アンデルスカセオルグ



4

Haskell40 34バイト

編集:

  • -6バイト:@WheatWizardは、分数はおそらく2つの別個の引数として指定できることを指摘しました。

(詳細なインポートでHaskellの回答を見た後、これを投稿することに抵抗することはできませんでした。他の言語の回答も基本的にこの方法を使用していることがわかりました。)

!2つの整数引数(分数の分子と分母。それらは最小項である必要はありませんが、分母は正でなければなりません)を受け取り、整数を返します。として呼び出します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うーん、私は「ペア」を2つの別個の引数ではなくペアであると解釈しました。それは過度にHaskell中心の解釈だと思います。
Ørjanヨハンセン



2

ゼリー、8バイト

®İ$%1$©¿

オンラインでお試しください!

浮動小数点の不正確さ。


0.7で頑張ってください
Leaky Nun

@LeakyNunその運とは、無限ループまたは無限ループのいずれかを意味します...
エリックアウトゴルファー

使用MP:浮動小数点の不正確さを修正します。それはゼリーですが、任意の精度の数学です。ただし、0.7ループは修正されません。
ハイパーニュートリノ

@HyperNeutrino MはJellyの古いバージョンです。
エリックアウトゴルファー


2

JavaScript 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

Haskell62 61バイト

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

オンラインでお試しください!

HaskellのData.Ratioライブラリを任意精度の有理数に使用します。組み込み名だけがそれほど長くない場合。


@ H.PWizナイス!私はとパターンマッチングを試みていましたData.Ratio。私は聞いたことがないGHC.Real。それをあなた自身の答えとして投稿してください。
ポストロックガーフハンター


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ソリューションのようです
-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サポート番号> 1は必要ですか?
tsh

はい、任意の有理数で機能するはずです(丸め誤差は無視します)。
ソロモンウッコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.