Создайте функцию, которая принимает натуральное число (начиная с 0 включительно) и возвращает пару натуральных чисел, которые являются числителем и знаменателем соответственно. Используйте диагональный обход. Предыдущие номера должны быть пропущены. (вы можете запомнить набор пропущенных значений)
Диаграмма:
Красные пропущенные значения
Ценности:
- f (0) = 1, 1
- f (1) = 2, 1
- f (2) = 1, 2
- f (3) = 1,3
- f (4) = 3, 1 (обратите внимание на пропуск)
- f (5) = 4, 1
- f (6) = 3, 2
- f (7) = 2,3
- f (8) = 1,4
- f (9) = 1,5
- f (10) = 5, 1 (обратите внимание на пропуск)
Вы можете использовать структуру данных Rational и их операции, если они существуют. Самый короткий код выигрывает.
code-golf
rational-numbers
Мин-Tang
источник
источник
Ответы:
J,
4136 символовПринимает целые числа и возвращает вектор, содержащий два целых числа. Мое первое решение, которое не является ни полностью молчаливым, ни полностью явным.
Вот решение с пробелами, вставленными там, где это необходимо:
Объяснение:
x (, % +.) y
- вектор длины 2, представляющий дробь с числителемx
и знаменателем,y
приведенным к наименьшему знаменателю1 + i. 1 + y
–Вектор целых чисел от1
доy + 1
(, % +.)"0/~ 1 + i. 1 + y
–Матрица всех приведенных дробей с нередуцированным знаменателем и числителем в диапазоне от1
доy + 1
.<`(<@|.)/. y
- массив наклонных диагоналей матрицыy
, перевернутые диагонали друг друга~. ; y
- массив диагоналей, свернутый в вектор элементов с удаленными дубликатамиx { y
–Позиция на позицииx
вy
(u v) y
- так же, какy u v y
. В этом конкретном случае использованияu
есть{
иv
есть3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'
источник
Хаскель, 78 персонажей
Образец прогона:
cycle
и функции для чередования порядка строкcycle
на созданный вручную бесконечный списокd
gcd
личность, как предложено Матиасомисточник
gcd (r-b) b == gcd r b
можно сбрить и еще четырех персонажей.Питон, 144 символа
источник
Рубин 1.9,
109106источник
OCaml + Батареи,
182168 символовВот что было бы естественно в Haskell, но едва ли возможно в OCaml:
Редактировать: диагональ не нужна
источник
Perl 6 , 75 байт
Попробуй это
Это в основном генерирует всю последовательность рациональных значений, останавливаясь только после генерирования индексированного значения.
(На основании моего гольфа в другой вызов.)
Expanded:
({1…($+=2)…1}…*)
генерирует бесконечную последовательность числителей (|(…)
используется выше для выравнивания)(1,{1…(($||=1)+=2)…1}…*)
генерирует бесконечную последовательность знаменателейисточник