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.


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!


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ą.


.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

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.


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ą.


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.


@ 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.



2

Galaretka , 8 bajtów

®İ$%1$©¿

Wypróbuj online!

Niedokładności zmiennoprzecinkowe.


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


2

JavaScript ES6, 25 bajtów

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

Zadzwoń f(a,b)poa/b


Jeśli gcd(a,b)=1można usunąć/b
l4m2


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 

⍵-⌊⍵1|⍵dla jednego bajtu
Uriel

@Uriel dziękuję ... Więc bajty są jak rozwiązanie J
RosLuP



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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.