Puede crear una lista de todos los racionales 0 <r ≤ 1 enumerándolos ordenados primero por denominador y luego por numerador:
1 1 1 2 1 3 1 2 3 4 1 5 1 2 3 4 5
- - - - - - - - - - - - - - - - -
1 2 3 3 4 4 5 5 5 5 6 6 7 7 7 7 7
Tenga en cuenta que omitimos cualquier número racional que ya haya ocurrido antes. Por ejemplo, se omite 2/4 porque ya enumeramos 1/2.
En este desafío solo nos interesan los numeradores. Mirando la lista anterior, escriba una función o programa tomando un entero positivo n que devuelva el enésimo numerador de la lista.
Casos de prueba:
1 -> 1
2 -> 1
3 -> 1
4 -> 2
5 -> 1
6 -> 3
7 -> 1
8 -> 2
9 -> 3
50 -> 4
80 -> 15
(0,1]
Respuestas:
MATL ,
1713 bytesPruébalo en línea! O verificar todos los casos de prueba .
El tamaño de entrada puede estar limitado por la precisión del punto flotante. Todos los casos de prueba dan el resultado correcto.
Explicación
Esto genera todas las fracciones
k/m
conk
,m
en[1 2 ...n]
, como una matrizn
×n
. La fila indica el numerador y la columna indica el denominador. En realidad, la entrada de la matriz contiene la fracción inversam/k
, en lugar dek/m
, pero esto es irrelevante y puede ignorarse en el resto de la explicación.Las entradas de matriz se consideran implícitamente ordenadas en orden de columna mayor. En este caso esto corresponde al orden requerido: denominador, luego numerador.
Se deben descartar tres tipos de entradas de esta matriz:
k/m
,k>m
, que tienen el mismo valor como una entrada anterior (por ejemplo,2/4
no es considerada ya que es el mismo que1/2
)k/k
,k>1
. Entradas que tienen un numerador que excede el denominadork/m
,k<m
(estos no son parte del problema).Hacer caso omiso de las entradas se realiza con una
unique
función, que elimina de manera estable los valores duplicados y genera los índices de las entradas supervivientes. Con esto, las entradas de tipo 1 anteriores se eliminan automáticamente. Para tratar con los tipos 2 y 3, las entradas de matriz en la diagonal y debajo se establecen en0
. De esta forma, se eliminarán todas las entradas cero, excepto la primera (correspondiente a la fracción válida1/1
).Considere la entrada
4
como un ejemplo.fuente
Jalea ,
119 bytesPruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Mathematica, 53 bytes
fuente
Haskell, 40 bytes
Una función anónima. Bastante sencillo: utiliza una comprensión de lista para generar una lista infinita, recorriendo todos los numeradores
n
y denominadores relativamente primosd
. Para convertir el índice cero a uno indexado, anteponemos a0
, que toma4
bytes.fuente
n<-[0..d]
agrega el cero de una manera más corta y guarda los 4 bytesPyth, 13 bytes
Pruébalo en línea. Banco de pruebas.
fuente
Pyth, 11 bytes
Pruébelo en línea: demostración
Explicación:
fuente
En realidad , 15 bytes
Esta respuesta se basa en la respuesta de Dennis 'Jelly . Lo uso
HN
al final para evitar problemas con la indexación 0 y la necesidad de disminuir n e intercambiar al principio o al final.H
obtiene los primerosn
miembros de la lista de numeradores que resultan yN
obtiene el último miembro de esa selección, es decir, eln
numerador th, todo sin jugar con las operaciones de pila. Sugerencias de golf bienvenidas. Pruébalo en línea!No golfista
fuente
Python,
111110 bytesLa fracción se representa con
x/y
. El argumenton
disminuye cuando se encuentra una nueva fracción de ajuste (las comprobacionesgcd
desdefractions
pueden reducir la fracción). En cada iteración del bucle,x
se incrementa, luego, six>=y
,y+1
se inicia una nueva serie de fracciones con ,>
debido al "caso especial"(x,y)=(2,1)
, golfed ax>y
.Estoy seguro de que esto se puede jugar más, pero me falta dónde podría mejorarlo.Lo encontré.Enlace al código y casos de prueba
fuente
JavaScript (ES6), 95 bytes
Funciona generando todas las
n²
fracciones con numeradores y denominadores desde1
hastan
y filtrando las mayores que1
las vistas anteriormente, y luego tomando eln
th.fuente
Perl, 82 + 2 (
-pl
bandera) = 84 bytesSin golf:
fuente
JavaScript (ES6), 76
Menos golf
Prueba
fuente
Clojure, 85 bytes
Utiliza la comprensión de la lista para generar una lista de todos los racionales, luego la filtra para obtener solo los distintos. Toma el
nth
elemento de la lista y devuelve su numerador. También se necesita una condición separada para el primer elemento porque Clojure no puede tomar el numerador de un entero. (por cualquier razón, considerando que un entero no es racional - https://goo.gl/XETLo2 )Véalo en línea: https://ideone.com/8gNZEB
fuente