Recíproco repetido


11

Lo que debe hacer es crear una función / programa que tome un decimal como entrada y genere el resultado de tomar repetidamente el recíproco de la parte fraccionaria del número, hasta que el número se convierta en un entero.

Más específicamente, el proceso es el siguiente:

  1. Deje x ser la entrada

  2. Si x es un entero, envíelo.

  3. De lo contrario: . Regrese a 2.x1frac(x)

frac(x)x x - x x x es el componente fraccionario de , y es igual a . es el piso de x, que es el mayor entero menor que .xxxxx

Casos de prueba:

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

Resumen de 0 a 1 en incrementos de 0.1: 0, 10, 5, 3, 2, 2, 2, 3, 4, 9, 1

Este es el , por lo que gana menos bytes.

Aclaraciones:

  • "Puntos de bonificación" sin error de redondeo
  • Debería funcionar para cualquier número racional no negativo (ignorando el error de redondeo)
  • Puede, pero no tiene que dar salida a los pasos dados
  • Puede tomar la entrada como un decimal, fracción o par de números, que pueden estar en una cadena.

Perdón por todos los problemas, esta es mi primera pregunta en este sitio web.


El hecho de que esto termine está estrechamente relacionado con la posibilidad de expresar un decimal en fracción continua.
Leaky Nun

44
¿Se espera que produzcamos flotadores? Causan algunos problemas de precisión.
Leaky Nun

77
¿Podría detallar el proceso un poco más? No estoy seguro de qué implica "recíproco de la parte fraccionaria del número", y los casos de prueba tampoco ayudan mucho
Ad Hoc Garf Hunter

44
¿Podemos tomar dos enteros como entrada para representar un número racional?
Leaky Nun

1
Esto es igual al elemento final de la fracción continua simple de la entrada.
isaacg

Respuestas:


5

J, 18 bytes

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

En J, el idioma u ^: v ^:_significa "Sigue aplicando el verbo umientras la condición vdevuelve verdadero.

En nuestro caso, la condición final está definida por el gancho ~:<., lo que significa "el piso del número <.no es igual ~:al número mismo", por lo que nos detendremos cuando el verbo principal udevuelva un int.

uen este caso hay otro gancho -<., el número menos su piso, cuyo valor de retorno se alimenta al @verbo recíproco %.

Pruébalo en línea!


También de 18 años, pero tiene algunas imprecisiones de coma flotante debido a las tolerancias de suponer: _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)

Pruébalo en línea!

Formato: la cadena debe contener un punto decimal.


.replace(".","")-> .replace(*"._")guardar 1 byte
tsh

5

Mathematica, 36 bytes

Last@*ContinuedFraction@*Rationalize

Manifestación

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

¿Qué pasa sin Rationalize?
Greg Martin

1
@GregMartin Sin Rationalize, Mathematica cree que no hay suficiente precisión para generar todos los términos de la fracción continua. Por ejemplo, ContinuedFraction[0.1]es justo {0}.
Anders Kaseorg

4

Perl 6 , 42 bytes

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

Pruébalo en línea!

El nudemétodo devuelve el nu merator y de denominador de un número racional como una lista de dos elementos. Es más corto obtener el denominador de esta manera que llamar al denominatormétodo directamente.


4

Haskell , 47 bytes

Esto supera la respuesta de Wheat Wizard porque GHC.Realnos permite crear patrones de coincidencia en racionales usando :%, además de tener un nombre más corto

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

Pruébalo en línea!

ftoma un Rationalnúmero como entrada, aunque ghc permite que se escriban en formato decimal, con cierta precisión.


4

Haskell , 40 34 bytes

Editar:

  • -6 bytes: @WheatWizard señaló que la fracción probablemente se puede dar como dos argumentos separados.

(No pude resistir publicar esto después de ver las respuestas de Haskell con importaciones detalladas; ahora veo que algunas respuestas en otros idiomas también utilizan esencialmente este método).

!toma dos argumentos enteros (numerador y denominador de la fracción; no es necesario que estén en términos más pequeños, pero el denominador debe ser positivo) y devuelve un entero. Llamar como 314!100.

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

Pruébalo en línea!

  • Ignorando el desajuste de tipo, la parte fraccional de n/d(suponiendo dpositiva) es mod n d/d, por lo tanto mod n d==0, a menos que !vuelva a aparecer con una representación de d/mod n d.


@WheatWizard Hm bien, interpreté "par" como un par en lugar de dos argumentos distintos. Supongo que es una interpretación demasiado centrada en Haskell.
Ørjan Johansen

3

Python 3 + sympy , 67 bytes

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

Pruébalo en línea!

Sympy es un paquete matemático simbólico para Python. Debido a que es simbólico y no binario, no hay imprecisiones de coma flotante.



2

Jalea , 8 bytes

®İ$%1$©¿

Pruébalo en línea!

Imprecisiones de punto flotante.


Buena suerte haciéndolo por 0.7
Leaky Nun

@LeakyNun Esa suerte significa bucles infinitos o bucles infinitos ...
Erik the Outgolfer

Uso Mpara fijar las inexactitudes de punto flotante: P . Es gelatina pero con precisión arbitraria matemática. Sin embargo, no soluciona el bucle 0.7.
HyperNeutrino

@HyperNeutrino M es una versión anticuada de Jelly.
Erik the Outgolfer


2

JavaScript ES6, 25 bytes

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

Llame f(a,b)paraa/b


Si se gcd(a,b)=1puede eliminar/b
l4m2 el

2

Haskell , 62 61 bytes

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

Pruébalo en línea!

Utiliza la Data.Ratiobiblioteca de Haskell para racionalidades arbitrarias de precisión. Si tan solo los nombres incorporados no fueran tan largos.


@ H.PWiz Nice! Había estado tratando de combinar patrones Data.Ratio. Nunca he oído hablar de GHC.Real. Siéntase libre de publicar eso como su propia respuesta.
Ad Hoc Garf Hunter


1

APL (Dyalog Classic) , 18 bytes

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

Pruébalo en línea!

NARS APL, 18 caracteres

-1 byte gracias a la prueba de 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|⍵por un byte
Uriel

@Uriel gracias ... Así que los bytes son la solución J
RosLuP


1

Stax , 8 bytes

ç▄é⌠á◙àù

Ejecutar y depurarlo

"Puntos de bonificación" sin errores de precisión. No se utiliza aritmética de coma flotante. Esto (finalmente) hace uso del tipo racional incorporado de Stax.


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

Si podemos cambiar el tipo de entrada a una cadena, entonces puede ahorrar 5 bytes.


Esto no funcionará para números> = 10.
Shaggy

@ Shaggy ¿Se necesitan números de apoyo> 1?
tsh

Sí, debería funcionar para cualquier número racional (ignorando el error de redondeo).
Solomon Ucko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.