Se puede demostrar que los números racionales positivos son numerables con el siguiente proceso:
- Cero tiene el ordinal 0
- Organice los otros números en una cuadrícula de modo que la fila a, la columna b contenga a / b
- Trace un zig-zag diagonal de arriba a la derecha de abajo a la izquierda
- Mantenga una cuenta corriente de los números únicos encontrados a lo largo del zig-zag
Aquí hay una foto del zig-zag:
Entonces, los números encontrados son, en orden
1/1, 2/1, 1/2, 1/3, 2/2, 3/1, 4/1, 3/2, 2/3, 1/4, 1/5, 2/4, 3/3, 4/2, 5/1, 6/1, 5/2, 4/3, 3/4, 2/5, 1/6, 1/7, 2/6, 3/5, 4/4, 5/3 ...
Y los números únicos y simplificados encontrados son
1, 2, 1/2, 1/3, 3, 4, 3/2, 2/3, 1/4, 1/5, 5, 6, 5/2, 4/3, 3/4, 2/5, 1/6, 1/7, 3/5, 5/3, ...
Desafío:
- Dados dos enteros mayores que cero p y q , genera el número ordinal de p / q
- pyq no son necesariamente co-prime
- El código más corto gana
- Las lagunas estándar están prohibidas
Casos de prueba:
Aquí están los primeros 24 números racionales encontrados, y el resultado deseado para cada uno:
1/1: 1
2/1: 2
1/2: 3
1/3: 4
2/2: 1
3/1: 5
4/1: 6
3/2: 7
2/3: 8
1/4: 9
1/5: 10
2/4: 3
3/3: 1
4/2: 2
5/1: 11
6/1: 12
5/2: 13
4/3: 14
3/4: 15
2/5: 16
1/6: 17
1/7: 18
2/6: 4
3/5: 19
Y, para más casos de prueba, aquí están los 200 primeros números racionales positivos en orden:
1, 2, 1/2, 1/3, 3, 4, 3/2, 2/3, 1/4, 1/5,
5, 6, 5/2, 4/3, 3/4, 2/5, 1/6, 1/7, 3/5, 5/3,
7, 8, 7/2, 5/4, 4/5, 2/7, 1/8, 1/9, 3/7, 7/3,
9, 10, 9/2, 8/3, 7/4, 6/5, 5/6, 4/7, 3/8, 2/9,
1/10, 1/11, 5/7, 7/5, 11, 12, 11/2, 10/3, 9/4, 8/5,
7/6, 6/7, 5/8, 4/9, 3/10, 2/11, 1/12, 1/13, 3/11, 5/9,
9/5, 11/3, 13, 14, 13/2, 11/4, 8/7, 7/8, 4/11, 2/13,
1/14, 1/15, 3/13, 5/11, 7/9, 9/7, 11/5, 13/3, 15, 16,
15/2, 14/3, 13/4, 12/5, 11/6, 10/7, 9/8, 8/9, 7/10, 6/11,
5/12, 4/13, 3/14, 2/15, 1/16, 1/17, 5/13, 7/11, 11/7, 13/5,
17, 18, 17/2, 16/3, 15/4, 14/5, 13/6, 12/7, 11/8, 10/9,
9/10, 8/11, 7/12, 6/13, 5/14, 4/15, 3/16, 2/17, 1/18, 1/19,
3/17, 7/13, 9/11, 11/9, 13/7, 17/3, 19, 20, 19/2, 17/4,
16/5, 13/8, 11/10, 10/11, 8/13, 5/16, 4/17, 2/19, 1/20, 1/21,
3/19, 5/17, 7/15, 9/13, 13/9, 15/7, 17/5, 19/3, 21, 22,
21/2, 20/3, 19/4, 18/5, 17/6, 16/7, 15/8, 14/9, 13/10, 12/11,
11/12, 10/13, 9/14, 8/15, 7/16, 6/17, 5/18, 4/19, 3/20, 2/21,
1/22, 1/23, 5/19, 7/17, 11/13, 13/11, 17/7, 19/5, 23, 24,
23/2, 22/3, 21/4, 19/6, 18/7, 17/8, 16/9, 14/11, 13/12, 12/13,
11/14, 9/16, 8/17, 7/18, 6/19, 4/21, 3/22, 2/23, 1/24, 1/25
Grite a la pregunta inversa , donde el primer movimiento es hacia abajo, por lo que no puede usar las respuestas para generar casos de prueba adicionales.
Respuestas:
Jalea ,
2120 bytesProbablemente superable por varios bytes utilizando algunas matemáticas inteligentes ...
Un enlace monádico que acepta una lista de los
[p,q]
cuales devuelve el número natural asignadop/q
.Pruébalo en línea! O ver el conjunto de pruebas .
¿Cómo?
Primera nota de que el N º diagonal encontró contiene todos los números racionales de la cuadrícula para los que la suma del numerador y el denominador es igual a N + 1 , por lo que dada una función que reduce un
[p,q]
par de forma más simple ([p/gcd(p,q),q/gcd(p,q)]
) podemos construir las diagonales como la medida de lo necesita ser *, reducir todas las entradas, desduplicar y encontrar el índice de la entrada simplificada.* en realidad uno más aquí para guardar un byte
fuente
Perl 6 ,
9490 bytesPruébalo
Pruébalo
Básicamente, esto genera toda la secuencia de valores y se detiene cuando encuentra una coincidencia.
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
Python 2 ,
157144137134126125 bytesPruébalo en línea!
4 bytes guardados debido al Sr. Xcoder ; 1 byte de Jonathon Frech .
Como señaló el Sr. Xcoder, podemos mejorar un poco en Python 3, ya que, entre otras cosas, la división de números enteros predetermina los resultados flotantes y podemos descomprimir más fácilmente
list
:Python 3 , 117 bytes
Pruébalo en línea!
fuente
**(j%-2|1)
yp-~q
.+1
al final, ya que1,1
'debe' dar1
, no0
.Python 3 ,
157,146,140133 bytesPruébalo en línea!
ganó 11 bytes gracias a Jonathan Frech
ganó 6 bytes más y luego 7 gracias a Chas Brown
fuente
range(max(p,q)+1)
conrange(p+q)
.{*a}
lugar deset(a)
.J,
41,35, 30 bytes-11 bytes gracias a FrownyFrog
Pruébalo en línea!
publicación original de 41 bytes con explicación
sin golf
explicación
Pruébalo en línea!
fuente
1+~.@;@([:<@|.`</.%~/~)@(1+i.@*)i.%
%i.~0~.@,@,[:]`|./.[:%/~1+i.@*
Python 3, 121 bytes
fuente
Óxido, 244 bytes
Creé una fórmula simple para encontrar el ordinal "simple" de un zigzag "simple", sin las restricciones del rompecabezas, usando fórmulas de números triangulares: https://www.mathsisfun.com/algebra/triangular-numbers.html . Esto se modificó con el módulo 2 para tener en cuenta los zig-zags que invierten su dirección en cada fila diagonal del rompecabezas. Esta es la función h ()
Luego, para el truco principal de este rompecabezas: cómo 'no contar' ciertos valores repetidos, como 3/3 vs 1/1, 4/2 vs 2/1, en el camino en zig-zag. Ejecuté los ejemplos 1-200, y noté que la diferencia entre un contador triangular simple en zig-zag y el que desea el rompecabezas tiene un patrón. El patrón de números "perdidos" es 5, 12, 13, 14, 23, etc., lo que resultó en un éxito en el OEIS. Es uno descrito por Robert A Stump, en https://oeis.org/A076537 , para "deduplicar" números como 3/3, 4/2 y 1/1, puede verificar si GCD> 1 para el x, y de todos los ordinales "anteriores" en zigzag. Este es el bucle 'for' y g () que es el mcd.
Supongo que con algunos mcd incorporados hubiera sido más corto, pero no pude encontrar uno muy fácilmente (soy un poco nuevo en Rust e Integer me confundió), y me gusta el hecho de que este usa aritmética de enteros directos, y sin construcciones o bibliotecas de ningún tipo.
fuente
JavaScript (ES6), 86 bytes
Toma entrada en la sintaxis de curry
(p)(q)
.Pruébalo en línea!
fuente
Javascript, 79 bytes
(Soy nuevo en el golf de código, por lo que esto probablemente pueda mejorarse fácilmente)
Explicación
fuente
(3,5)
debe dar lugar a19
(no24
) ya que(1,1)==(2,2)==(3,3)
,(2,4)==(1,2)
,(4,2)==(2,1)
y(2,6)==(1,3)
. (es decir,(2,2)
debería resultar en1
no5
, etc.)