Powtarzająca się wzajemność

11

To, co musisz zrobić, to utworzyć funkcję / program, który przyjmuje liczbę dziesiętną jako dane wejściowe i wyprowadza wynik wielokrotnego przyjmowania odwrotności ułamkowej części liczby, aż liczba stanie się liczbą całkowitą.

Mówiąc dokładniej, proces wygląda następująco:

  1. Niech x będzie wejściem

  2. Jeśli x jest liczbą całkowitą, wyślij ją.

  3. W przeciwnym razie: x1farzado(x) . Wróć do 2.

farzado(x) jest ułamkowym składnikiemx jest równex-x . x to podłoga x, która jest największą liczbą całkowitą mniejszą niżx .

Przypadki testowe:

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

Podsumowanie dla 0 do 1 w krokach co 0,1: 0, 10, 5, 3, 2, 2, 2, 3, 4, 9, 1

To jest , więc wygrywa najmniej bajtów.

Wyjaśnienia:

  • „Punkty bonusowe” za brak błędu zaokrąglenia
  • Powinien działać dla każdej nieujemnej liczby wymiernej (ignorując błąd zaokrąglenia)
  • Możesz, ale nie musisz generować podjętych kroków
  • Dane wejściowe można przyjmować jako liczbę dziesiętną, ułamkową lub parę liczb, które mogą być ciągiem.

Przepraszamy za wszystkie problemy, to moje pierwsze pytanie na tej stronie.

Solomon Ucko
źródło
Fakt, że to się kończy, jest ściśle związany z możliwością wyrażenia dziesiętnego w ułamku ciągłym.
Leaky Nun
4
Czy spodziewamy się, że wydamy zmiennoprzecinkowe? Powodują problemy z precyzją.
Leaky Nun
7
Czy mógłbyś bardziej szczegółowo opisać ten proces? Nie jestem pewien, co pociąga za sobą „odwrotność ułamkowej części liczby”, a przypadki testowe też niewiele pomagają
Ad Hoc Garf Hunter
4
Czy możemy przyjąć dwie liczby całkowite jako dane wejściowe do przedstawienia liczby wymiernej?
Leaky Nun
1
Jest to równe końcowemu elementowi prostej kontynuowanej części wkładu.
isaacg

Odpowiedzi:

5

J, 18 bajtów

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

W języku J idiom u ^: v ^:_oznacza „Stosuj czasownik, udopóki warunek vzwróci wartość prawda.

W naszym przypadku warunek końcowy jest zdefiniowany przez hak ~:<., co oznacza, że ​​„podłoga liczby <.nie jest równa ~:samej liczbie” - więc zatrzymamy się, gdy czasownik główny uzwróci liczbę całkowitą.

uw tym przypadku jest inny haczyk -<.- liczba minus jego podłoga - którego wartość zwracana jest wprowadzana do @czasownika wzajemnego %.

Wypróbuj online!

Jonasz
źródło
Również 18, ale ma pewne niedokładności pływających punkt przypuszczalnie z powodu tolerancji: _2{(%@-<.) ::]^:a:.
cole
%@|~&1^:(~:<.)^:_
FrownyFrog
5

Python 3 , 101 bajtów

lambda s:g(int(s.replace(".","")),10**s[::-1].index("."))
g=lambda a,b:a and(b%a and g(b%a,a)or b//a)

Wypróbuj online!

Format: ciąg musi zawierać kropkę dziesiętną.

Leaky Nun
źródło
.replace(".","")-> .replace(*"._")zapisz 1 bajt
tsh
5

Mathematica, 36 bajtów

Last@*ContinuedFraction@*Rationalize

Próbny

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
Anders Kaseorg
źródło
Co się stanie bez Rationalize?
Greg Martin
1
@GregMartin Bez RationalizeMathematica uważa, że ​​nie ma wystarczającej precyzji, aby wygenerować wszystkie warunki ułamka ciągłego. Na przykład ContinuedFraction[0.1]jest po prostu {0}.
Anders Kaseorg
4

Perl 6 , 42 bajtów

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

Wypróbuj online!

nudeMetoda zwraca nu merator i de liczniku liczby wymiernej postaci listy dwóch elementów. Krótsze jest uzyskanie mianownika w ten sposób niż denominatorbezpośrednie wywołanie metody.

Sean
źródło
4

Haskell , 47 bajtów

To przewyższa odpowiedź Kreatora Pszenicy, ponieważ GHC.Realpozwala nam wzorować dopasowanie na racjonalnych przy użyciu :%, a także o krótszej nazwie

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

Wypróbuj online!

fprzyjmuje Rationalliczbę jako dane wejściowe, chociaż ghc pozwala na zapisywanie ich w formacie dziesiętnym z pewną dokładnością.

H.PWiz
źródło
4

Haskell , 40 34 bajtów

Edytować:

  • -6 bajtów: @WheatWizard wskazał, że ułamek można prawdopodobnie podać jako dwa osobne argumenty.

(Nie mogłem się powstrzymać od opublikowania tego po zobaczeniu odpowiedzi Haskell z pełnymi importami - teraz widzę, że niektóre odpowiedzi w innych językach również zasadniczo używają tej metody).

!pobiera dwa argumenty liczb całkowitych (licznik i mianownik ułamka; nie muszą być one w najmniejszych słowach, ale mianownik musi być dodatni) i zwraca liczbę całkowitą. Jak zadzwonić 314!100.

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

Wypróbuj online!

  • Ignorując niedopasowanie typu, ułamkowa część n/d(przy założeniu ddodatniej) jest mod n d/d, więc chyba mod n d==0, że !powtarza się z reprezentacją d/mod n d.
Ørjan Johansen
źródło
@ WellheWizard Hm dobrze, interpretowałem „parę” jako konieczność bycia parą, a nie dwoma odrębnymi argumentami. Podejrzewam, że to zbyt interpretacja Haskella.
Ørjan Johansen
3

Python 3 + sympy , 67 bajtów

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

Wypróbuj online!

Sympy to symboliczny pakiet matematyczny dla Pythona. Ponieważ jest to symboliczny, a nie binarny, nie ma niedokładności zmiennoprzecinkowych.

HyperNeutrino
źródło
3

PHP , 69 bajtów

for(;round(1e9*$a=&$argn)/1e9!=$o=round($a);)$a=1/($a-($a^0));echo$o;

Wypróbuj online!

PHP , 146 bajtów

for($f=.1;(0^$a=$argn*$f*=10)!=$a;);for(;1<$f;)($x=($m=max($a,$f))%$n=min($a,$f))?[$f=$n,$a=$x]:$f=!!$a=$m/$n;echo($o=max($a,$f))>1?$o:min($a,$f);

Wypróbuj online!

Jörg Hülsermann
źródło
2

Galaretka , 8 bajtów

®İ$%1$©¿

Wypróbuj online!

Niedokładności zmiennoprzecinkowe.

Erik the Outgolfer
źródło
Powodzenia w
grze
@LeakyNun To szczęście oznacza albo nieskończone pętle, albo nieskończone pętle ...
Erik the Outgolfer
Zastosowanie Mnaprawić nieścisłości zmiennoprzecinkowych: P . To galaretka, ale z matematyczną precyzją. Nie naprawia jednak pętli 0.7.
HyperNeutrino,
@HyperNeutrino M to zdecydowanie nieaktualna wersja Jelly.
Erik the Outgolfer
5 bajtów
caird coinheringaahing
2

JavaScript ES6, 25 bajtów

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

Zadzwoń f(a,b)poa/b

l4m2
źródło
Jeśli gcd(a,b)=1można usunąć/b
l4m2
2

Haskell , 62 61 bajtów

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

Wypróbuj online!

Korzysta z Data.Ratiobiblioteki Haskella w celu obliczenia dowolnej dokładności. Gdyby tylko wbudowane nazwy nie były tak długie.

Ad Hoc Garf Hunter
źródło
@ H.PWiz Nicea! Próbowałem dopasować wzór Data.Ratio. Nigdy o tym nie słyszałem GHC.Real. Możesz to opublikować jako własną odpowiedź.
Ad Hoc Garf Hunter
opublikowane
H.PWiz
1

APL (Dyalog Classic) , 18 bajtów

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

Wypróbuj online!

APL NARS, 18 znaków

-1 bajt dzięki testowi 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 
RosLuP
źródło
⍵-⌊⍵1|⍵dla jednego bajtu
Uriel
@Uriel dziękuję ... Więc bajty są jak rozwiązanie J
RosLuP
1

Smalltalk, 33 bajty

[(y:=x\\1)>0]whileTrue:[x:=1/y].x
Leandro Caniglia
źródło
1

Stax , 8 bajtów

ç▄é⌠á◙àù

Uruchom i debuguj

„Punkty bonusowe” za brak błędów precyzji. Nie zastosowano arytmetyki zmiennoprzecinkowej. To (w końcu) wykorzystuje wbudowany typ racjonalny stax.

rekurencyjny
źródło
0

JavaScript, 70 bajtów

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

Jeśli możemy zmienić typ danych wejściowych na ciąg znaków, może to zaoszczędzić 5 bajtów.

tsh
źródło
To nie zadziała dla liczb> = 10.
Kudłaty
@Shaggy Czy potrzebne są numery pomocnicze> 1?
tsh
Tak, powinien działać dla dowolnej liczby wymiernej (ignorując błąd zaokrąglenia).
Solomon Ucko