Cree una función que tome un número natural (a partir de 0 inclusive) y devuelva un par de enteros positivos, que son el numerador y el denominador, respectivamente. Usa el recorrido diagonal. Los números contados previamente se deben omitir. (puede memorizar el conjunto de valores omitidos)
Diagrama:
El rojo son valores omitidos
Valores:
- f (0) = 1, 1
- f (1) = 2, 1
- f (2) = 1, 2
- f (3) = 1, 3
- f (4) = 3, 1 (observe el salto)
- f (5) = 4, 1
- f (6) = 3, 2
- f (7) = 2, 3
- f (8) = 1, 4
- f (9) = 1, 5
- f (10) = 5, 1 (observe el salto)
Puede utilizar la estructura de datos de Rational y sus operaciones si existen. El código más corto gana.
code-golf
rational-numbers
Ming-Tang
fuente
fuente
Respuestas:
J,
4136 caracteresToma enteros y devuelve un vector que comprende dos enteros. Mi primera solución que no es ni tácita ni explícita.
Aquí está la solución con espacios insertados donde sea apropiado:
Una explicación:
x (, % +.) y
–Un vector de longitud 2 que representa la fracción con numeradorx
y denominadory
reducido al mínimo denominador1 + i. 1 + y
–Un vector de enteros de1
ay + 1
(, % +.)"0/~ 1 + i. 1 + y
–Una matriz de todas las fracciones reducidas con denominador y numerador no reducidos en el rango de1
ay + 1
.<`(<@|.)/. y
–Una matriz de diagonales oblicuas de matrizy
, cada una diagonal invertida~. ; y
–Una matriz de diagonales colapsadas en un vector de elementos con duplicados eliminadosx { y
–El artículo en la posiciónx
eny
(u v) y
–Lo mismo quey u v y
. En este caso de uso particular,u
es{
yv
es3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'
fuente
Haskell, 78 personajes
Ejecución de muestra:
cycle
y funciones para alternar el orden de las filascycle
con la lista infinita hecha a manod
gcd
identidad aplicada como lo sugiere Matíasfuente
gcd (r-b) b == gcd r b
y puedes eliminar cuatro personajes más.Python, 144 caracteres
fuente
Ruby 1.9,
109106fuente
OCaml + baterías,
182168 caracteresEsto es lo que sería natural en Haskell, pero apenas es posible en OCaml:
Editar: la diagonal es innecesaria
fuente
Perl 6 , 75 bytes
Pruébalo
Básicamente, esto genera toda la secuencia de valores racionales, solo se detiene una vez que se genera el valor indexado.
(Basado en mi golf para otro desafío).
Expandido:
({1…($+=2)…1}…*)
genera la secuencia infinita de numeradores (|(…)
se usa arriba para aplanar)(1,{1…(($||=1)+=2)…1}…*)
genera la secuencia infinita de denominadoresfuente