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 numeradorxy denominadoryreducido al mínimo denominador1 + i. 1 + y–Un vector de enteros de1ay + 1(, % +.)"0/~ 1 + i. 1 + y–Una matriz de todas las fracciones reducidas con denominador y numerador no reducidos en el rango de1ay + 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ónxeny(u v) y–Lo mismo quey u v y. En este caso de uso particular,ues{yves3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'fuente
Haskell, 78 personajes
Ejecución de muestra:
cycley funciones para alternar el orden de las filascyclecon la lista infinita hecha a manodgcdidentidad aplicada como lo sugiere Matíasfuente
gcd (r-b) b == gcd r by 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