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.


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!


Auch 18, weist aber aufgrund von Toleranzen vermutlich einige Gleitkomma-Ungenauigkeiten auf : _2{(%@-<.) ::]^:a:.
Cole

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


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

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 .


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.


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.


@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



2

Gelee , 8 Bytes

®İ$%1$©¿

Probieren Sie es online aus!

Gleitkomma-Ungenauigkeiten.


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


2

JavaScript ES6, 25 Bytes

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

Rufen Sie f(a,b)ana/b


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.


@ 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


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 

⍵-⌊⍵1|⍵für ein Byte
Uriel

@ Uriel danke ... Also die Bytes sind wie die J-Lösung
RosLuP



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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.