Tekrarlanan karşılıklı


11

Yapmanız gereken, girdi olarak ondalık sayı alan bir işlev / program oluşturmak ve sayı bir tamsayı oluncaya kadar sayının kesirli kısmının karşılığını tekrar tekrar almanın sonucunu çıkarmaktır.

Daha spesifik olarak, süreç aşağıdaki gibidir:

  1. Girdi x olsun

  2. X bir tamsayı ise çıktı alın.

  3. Aksi takdirde: x1frbirc(x) . 2'ye geri dönün.

frbirc(x) fraksiyonel bileşenidirve eşit. en büyük tam sayıyı daha x'in olan zemin,.xx-xxx

Test senaryoları:

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, 10, 5, 3, 2, 2, 2, 3, 4, 9, 1'lik artışlarla 0 ila 1 için özet

Bu , çok az bayt kazanır.

Açıklamalar:

  • Yuvarlama hatası olmadan "Bonus puan"
  • Negatif olmayan herhangi bir rasyonel sayı için çalışmalıdır (yuvarlama hatasını göz ardı ederek)
  • Yapabilirsiniz, ancak atılan adımları çıkarmak zorunda değilsiniz
  • Girdiyi bir dizede olabilen ondalık, kesir veya sayı çifti olarak alabilirsiniz.

Tüm sorunlar için özür dilerim, bu web sitesindeki ilk sorum.


Bunun sona ermesi, devam eden kesirde ondalık ifade etme olasılığı ile yakından ilgilidir.
Leaky Nun

4
Şamandıra üretmesi bekleniyor mu? Bazı hassas sorunlara neden olurlar.
Leaky Nun

7
Süreci biraz daha detaylandırabilir misiniz? "Sayının kesirli kısmının karşılıklı" ne gerektirdiğinden emin değilim ve test
senaryoları

4
Rasyonel bir sayıyı temsil etmek için girdi olarak iki tamsayı alabilir miyiz?
Leaky Nun

1
Bu, girdinin basit devam eden kısmının son öğesine eşittir.
isaacg

Yanıtlar:


5

J, 18 bayt

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

J'de deyim u ^: v ^:_, " uKoşul vdoğruyken fiili uygulamaya devam et" anlamına gelir .

Bizim durumumuzda, bitiş koşulu kanca ile tanımlanır ~:<., yani "sayının zemini sayının kendisine <.eşit değildir ~:" - bu nedenle ana fiil ubir int döndürdüğünde dururuz .

ubu durumda, -<.dönüş değeri @karşılıklı fiile beslenen başka bir kanca - sayı eksi zemini - %.

Çevrimiçi deneyin!


Ayrıca 18, fakat muhtemelen toleranslar bazı kayan nokta kaçıklığı vardır: _2{(%@-<.) ::]^:a:.
cole

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


5

Mathematica, 36 bayt

Last@*ContinuedFraction@*Rationalize

gösteri

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

Olmadan ne olur Rationalize?
Greg Martin

1
@GregMartin Olmadan Rationalize, Mathematica, devam eden kesirin tüm terimlerini oluşturmak için yeterli hassasiyet olmadığını düşünüyor. Örneğin ContinuedFraction[0.1], sadece {0}.
Anders Kaseorg

4

Perl 6 , 42 bayt

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

Çevrimiçi deneyin!

nudeYöntem döner nu merator ve de iki öğeli bir listesi olarak bir rasyonel sayı tayin eden. Paydayı bu şekilde elde etmek, denominatoryöntemi doğrudan çağırmaktan daha kısadır .


4

Haskell , 47 bayt

Bu, Buğday Sihirbazı'nın cevabını yener, çünkü daha kısa bir isme sahip olmanın yanı sıra, GHC.Realkullanarak rasyonellerde eşleştirme yapmamıza izin verir:%

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

Çevrimiçi deneyin!

fRationalghc, ondalık biçimde belirli bir kesinlik içinde yazılmasına izin verse de, sayıyı girdi olarak alır .


4

Haskell , 40 34 bayt

Düzenle:

  • -6 bayt: @WheatWizard kesir muhtemelen iki ayrı argüman olarak verilebilir belirtti.

(Haskell'in ayrıntılı ithalat ile cevaplarını gördükten sonra bunu yayınlamaya direnemedim - şimdi başka bazı dil cevaplarının da bu yöntemi kullandığını görüyorum.)

!iki tamsayı argümanı alır (kesirin pay ve paydası; en küçük terimde olmaları gerekmez, ancak payda pozitif olmalıdır) ve bir tamsayı döndürür. Olarak arayın 314!100.

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

Çevrimiçi deneyin!

  • Tip uyumsuzluğunu göz ardı ederek, n/d( dpozitif olduğu varsayılarak ) kesirli kısmı mod n d/d, bu nedenle mod n d==0, !temsili bir çare değildir d/mod n d.


@WheatWizard Hm "çift" i iki farklı argüman yerine bir çift olarak yorumladım. Sanırım bu aşırı Haskell merkezli bir yorum.
Ørjan Johansen

3

Python 3 + sympy , 67 bayt

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

Çevrimiçi deneyin!

Sympy, Python için sembolik bir matematik paketidir. Sembolik olduğu ve ikili olmadığı için, kayan nokta yanlışlıkları yoktur.



2

Jöle , 8 bayt

®İ$%1$©¿

Çevrimiçi deneyin!

Kayan nokta yanlışlıkları.


İyi şanslar 0.7 için yapıyor
Leaky Nun

@LeakyNun Bu şans ya sonsuz döngüler ya da sonsuz döngüler anlamına gelir ...
Outgolfer Erik

Kullanım Mkayan nokta yanlışlıklar düzeltmek için: P . Jelly ama keyfi hassas matematik. Yine de 0.7 döngü düzeltmez.
Hiper Nötrino

@HyperNeutrino M, Jelly'in çok eski bir versiyonudur.
Outgolfer Erik


2

JavaScript ES6, 25 bayt

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

Çağrı f(a,b)içina/b


Eğer gcd(a,b)=1kaldırabilir/b
l4m2


1

APL (Dyalog Klasik) , 18 bayt

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

Çevrimiçi deneyin!

APL NARS, 18 karakter

Uriel testi sayesinde -1 bayt

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|⍵bir bayt için
Uriel

@Uriel teşekkür ederim ... Yani baytlar J çözümü gibidir
RosLuP



0

JavaScript, 70 bayt

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

Giriş türünü bir dizeye değiştirebilirsek, 5 bayt kaydedebilir.


Bu sayı> = 10 için işe yaramaz
Shaggy

@Shaggy Destek numaralarının> 1 olması gerekiyor mu?
tsh

Evet, herhangi bir rasyonel sayı için çalışmalıdır (yuvarlama hatasını göz ardı ederek).
Solomon Ucko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.