Crie uma função que use um número natural (começando com 0 inclusive) e retorne um par de números inteiros positivos, que são o numerador e o denominador, respectivamente. Use o deslocamento diagonal. Os números contados anteriormente devem ser ignorados. (você pode memorizar o conjunto de valores ignorados)
Diagrama:
Vermelho são valores ignorados
Valores:
- f (0) = 1, 1
- f (1) = 2, 1
- f (2) = 1, 2
- f (3) = 1, 3
- f (4) = 3, 1 (observe o pular)
- 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 o pular)
Você pode usar a estrutura de dados do Rational e suas operações, se existirem. O menor código vence.
code-golf
rational-numbers
Ming-Tang
fonte
fonte
Respostas:
J,
4136 caracteresPega um número inteiro e retorna um vetor que compreende dois números inteiros. Minha primeira solução que não é totalmente tácita nem totalmente explícita.
Aqui está a solução com espaços inseridos onde apropriado:
Uma explicação:
x (, % +.) y
–Um vetor de comprimento 2 que representa a fração com numeradorx
e denominadory
reduzido ao menor denominador1 + i. 1 + y
–Um vetor de números inteiros de1
ay + 1
(, % +.)"0/~ 1 + i. 1 + y
–Uma matriz de todas as frações reduzidas com denominador e numerador não reduzidos no intervalo de1
atéy + 1
.<`(<@|.)/. y
–Uma matriz das diagonais oblíquas da matrizy
, uma com a outra na diagonal~. ; y
–Um conjunto de diagonais colapsado em um vetor de elementos com duplicatas removidasx { y
–O item na posiçãox
emy
(u v) y
–O mesmo quey u v y
. Nesse caso de uso específico,u
é{
ev
é3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'
fonte
Haskell, 78 caracteres
Exemplo de execução:
cycle
e funções para alternar a ordem das linhascycle
pela lista infinita criada à mãod
gcd
identidade aplicada , conforme sugerido por Matíasfonte
gcd (r-b) b == gcd r b
você pode cortar mais quatro caracteres.Python, 144 caracteres
fonte
Ruby 1.9,
109106fonte
OCaml + baterias,
182168 caracteresIsto é o que seria natural em Haskell, mas apenas é possível no OCaml:
Edit: A diagonal é desnecessária
fonte
Perl 6 , 75 bytes
Teste-o
Isso basicamente gera toda a sequência de valores racionais, parando apenas quando o valor indexado é gerado.
(Com base no meu golfe para outro desafio.)
Expandido:
({1…($+=2)…1}…*)
gera a sequência infinita de numeradores (|(…)
é usado acima para achatar)(1,{1…(($||=1)+=2)…1}…*)
gera a sequência infinita de denominadoresfonte