Wiederholter Wechsel

11

Was Sie tun müssen, ist eine Funktion / ein Programm zu erstellen, die eine Dezimalzahl als Eingabe verwendet und das Ergebnis der wiederholten Verwendung des Kehrwerts des Bruchteils der Zahl ausgibt, bis die Zahl eine Ganzzahl wird.

Insbesondere ist der Prozess wie folgt:

  1. Sei x die Eingabe

  2. Wenn x eine Ganzzahl ist, geben Sie sie aus.

  3. Andernfalls: . Gehen Sie zurück zu 2.x1frac(x)

frac(x) ist die Bruchkomponente von x und entspricht xx . x ist der Boden von x, der die größte ganze Zahl kleiner als x .

Testfälle:

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

Zusammenfassung für 0 bis 1 in Schritten von 0,1: 0, 10, 5, 3, 2, 2, 2, 3, 4, 9, 1

Dies ist , also gewinnen die wenigsten Bytes.

Erläuterungen:

  • "Bonuspunkte" für keinen Rundungsfehler
  • Sollte für jede nicht negative rationale Zahl funktionieren (ohne Rundungsfehler)
  • Sie können, müssen aber nicht die durchgeführten Schritte ausgeben
  • Sie können die Eingabe als Dezimalzahl, Bruch oder Zahlenpaar verwenden, das sich in einer Zeichenfolge befinden kann.

Entschuldigung für alle Probleme, dies ist meine erste Frage auf dieser Website.

Solomon Ucko
quelle
Die Tatsache, dass dies endet, hängt eng mit der Möglichkeit zusammen, eine Dezimalstelle in fortgesetzten Brüchen auszudrücken.
Undichte Nonne
4
Werden wir voraussichtlich Floats ausgeben? Sie verursachen Präzisionsprobleme.
Undichte Nonne
7
Könnten Sie den Prozess etwas genauer beschreiben? Ich bin mir nicht sicher, was "Kehrwert des Bruchteils der Zahl" bedeutet, und die Testfälle helfen auch nicht viel
Post Rock Garf Hunter
4
Können wir zwei ganze Zahlen als Eingabe nehmen, um eine rationale Zahl darzustellen?
Undichte Nonne
1
Dies ist gleich dem letzten Element des einfachen fortgesetzten Bruchteils der Eingabe.
isaacg

Antworten:

5

J, 18 Bytes

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

In J u ^: v ^:_bedeutet das Idiom "Wenden Sie das Verb weiter an, uwährend die Bedingung vtrue zurückgibt.

In unserem Fall wird die Endbedingung durch den Hook definiert ~:<., was bedeutet, dass "der Boden der Zahl <.nicht gleich ~:der Zahl selbst ist" - also hören wir auf, wenn das Hauptverb uein int zurückgibt.

uIn diesem Fall handelt es sich um einen weiteren Hook -<.- die Zahl minus dem Floor - dessen Rückgabewert in @das reziproke Verb eingegeben wird %.

Probieren Sie es online aus!

Jona
quelle
Auch 18, weist aber aufgrund von Toleranzen vermutlich einige Gleitkomma-Ungenauigkeiten auf : _2{(%@-<.) ::]^:a:.
Cole
%@|~&1^:(~:<.)^:_
FrownyFrog
5

Python 3 , 101 Bytes

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)

Probieren Sie es online aus!

Format: Die Zeichenfolge muss einen Dezimalpunkt enthalten.

Undichte Nonne
quelle
.replace(".","")-> .replace(*"._")Speichern Sie 1 Byte
tsh
5

Mathematica, 36 Bytes

Last@*ContinuedFraction@*Rationalize

Demo

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
quelle
Was passiert ohne Rationalize?
Greg Martin
1
@ GregMartin Ohne Rationalizeist Mathematica der Ansicht, dass die Genauigkeit nicht ausreicht, um alle Terme des fortgesetzten Bruchs zu generieren. Zum Beispiel ContinuedFraction[0.1]ist nur {0}.
Anders Kaseorg
4

Perl 6 , 42 Bytes

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

Probieren Sie es online aus!

Die nudeMethode gibt den Nu merator und den De- Nominator einer rationalen Zahl als Zwei-Elemente-Liste zurück. Es ist kürzer, den Nenner auf diese Weise zu erhalten, als die denominatorMethode direkt aufzurufen .

Sean
quelle
4

Haskell , 47 Bytes

Dies übertrifft die Antwort von Wheat Wizard, da GHC.Realwir die Übereinstimmung von Rationals mit :%einem kürzeren Namen festlegen können

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

Probieren Sie es online aus!

fnimmt eine RationalZahl als Eingabe, obwohl ghc es erlaubt, sie in einem Dezimalformat mit einer bestimmten Genauigkeit zu schreiben.

H.PWiz
quelle
4

Haskell , 40 34 Bytes

Bearbeiten:

  • -6 Bytes: @WheatWizard wies darauf hin, dass der Bruch wahrscheinlich als zwei separate Argumente angegeben werden kann.

(Konnte nicht widerstehen, dies zu veröffentlichen, nachdem ich Haskell-Antworten mit ausführlichen Importen gesehen habe - jetzt sehe ich, dass einige andere Sprachantworten im Wesentlichen diese Methode verwenden.)

!Nimmt zwei ganzzahlige Argumente (Zähler und Nenner des Bruchs; sie müssen nicht kleinstmöglich sein, aber der Nenner muss positiv sein) und gibt eine Ganzzahl zurück. Rufen Sie an als 314!100.

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

Probieren Sie es online aus!

  • Ignoriert Typübereinstimmung, der Bruchteil von n/d(unter der Annahme , dpositiv) ist mod n d/d, so sei denn mod n d==0, !rekursiv mit einer Darstellung d/mod n d.
Ørjan Johansen
quelle
@WheatWizard Hm, ich habe "Paar" so interpretiert, dass es ein Paar sein muss und nicht zwei unterschiedliche Argumente. Ich nehme an, das ist eine übermäßig Haskell-zentrierte Interpretation.
Ørjan Johansen
3

Python 3 + Sympy , 67 Bytes

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

Probieren Sie es online aus!

Sympy ist ein symbolisches Mathematikpaket für Python. Da es symbolisch und nicht binär ist, gibt es keine Gleitkomma-Ungenauigkeiten.

HyperNeutrino
quelle
3

PHP , 69 Bytes

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

Probieren Sie es online aus!

PHP , 146 Bytes

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);

Probieren Sie es online aus!

Jörg Hülsermann
quelle
2

Gelee , 8 Bytes

®İ$%1$©¿

Probieren Sie es online aus!

Gleitkomma-Ungenauigkeiten.

Erik der Outgolfer
quelle
Viel Glück dabei für 0,7
Leaky Nun
@LeakyNun Dieses Glück bedeutet entweder Endlosschleifen oder Endlosschleifen ...
Erik der Outgolfer
Verwenden MP: Floating-Point - Ungenauigkeiten zu beheben . Es ist Gelee, aber mit willkürlicher Präzisionsmathematik. Behebt die 0.7-Schleife jedoch nicht.
HyperNeutrino
@HyperNeutrino M ist eine veraltete Version von Jelly.
Erik der Outgolfer
5 Bytes
Caird Coinheringaahing
2

JavaScript ES6, 25 Bytes

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

Rufen Sie f(a,b)ana/b

14 m2
quelle
Wenn gcd(a,b)=1kann entfernen/b
l4m2
2

Haskell , 62 61 Bytes

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

Probieren Sie es online aus!

Verwendet Haskells Data.RatioBibliothek für willkürliche Präzisionsrationalisierungen. Wenn nur die eingebauten Namen nicht so lang wären.

Post Rock Garf Hunter
quelle
@ H.PWiz Schön! Ich hatte versucht, ein Muster zu finden Data.Ratio. Ich habe noch nie davon gehört GHC.Real. Fühlen Sie sich frei, dies als Ihre eigene Antwort zu posten.
Post Rock Garf Hunter
geschrieben
H.PWiz
1

APL (Dyalog Classic) , 18 Bytes

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

Probieren Sie es online aus!

APL NARS, 18 Zeichen

-1 Byte dank Uriel-Test

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
quelle
⍵-⌊⍵1|⍵für ein Byte
Uriel
@ Uriel danke ... Also die Bytes sind wie die J-Lösung
RosLuP
1

Smalltalk, 33 Bytes

[(y:=x\\1)>0]whileTrue:[x:=1/y].x
Leandro Caniglia
quelle
1

Stax , 8 Bytes

ç▄é⌠á◙àù

Führen Sie es aus und debuggen Sie es

"Bonuspunkte" für keine Präzisionsfehler. Keine Gleitkomma-Arithmetik verwendet. Dies nutzt (endlich) den in rax eingebauten rationalen Typ.

rekursiv
quelle
0

JavaScript, 70 Bytes

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

Wenn wir den Eingabetyp in eine Zeichenfolge ändern können, werden möglicherweise 5 Byte eingespart.

tsh
quelle
Dies funktioniert nicht für Zahlen> = 10.
Shaggy
@Shaggy Werden unterstützende Nummern> 1 benötigt?
tsh
Ja, es sollte für jede rationale Zahl funktionieren (ohne Rundungsfehler).
Solomon Ucko