Вы можете создать список всех рациональных чисел 0 <r ≤ 1, перечислив их упорядоченные сначала по знаменателю, а затем по числителю:
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
Обратите внимание, что мы пропускаем любое рациональное число, которое уже встречалось ранее. Например, 2/4 пропущено, потому что мы уже перечислили 1/2.
В этом соревновании нас интересуют только числители. Взглянув на приведенный выше список, напишите функцию или программу, в которой положительное целое число n возвращает n-й числитель из списка.
Testcases:
1 -> 1
2 -> 1
3 -> 1
4 -> 2
5 -> 1
6 -> 3
7 -> 1
8 -> 2
9 -> 3
50 -> 4
80 -> 15
(0,1]
Ответы:
MATL ,
1713 байтПопробуйте онлайн! Или проверьте все тестовые случаи .
Размер ввода может быть ограничен точностью с плавающей запятой. Все тесты дают правильный результат.
объяснение
Это генерирует все дроби
k/m
сk
,m
в[1 2 ...n]
видеn
×n
матрицы. Строка указывает числитель, а столбец - знаменатель. На самом деле матричная запись содержит обратную дробьm/k
вместоk/m
, но это не имеет значения и может быть проигнорировано в остальной части объяснения.Матричные записи неявно считаются отсортированными в порядке столбцов. В этом случае это соответствует требуемому порядку: знаменатель, затем числитель.
Три типа записей должны быть проигнорированы из этой матрицы:
k/m
,k>m
которые имеют то же значение, что и предыдущая запись (например,2/4
игнорируются, потому что они совпадают с1/2
)k/k
,k>1
. Записи, числитель которых превышает знаменательk/m
,k<m
(они не являются частью этой проблемы).Игнорирование записей осуществляется с помощью
unique
функции, которая стабильно удаляет повторяющиеся значения и выводит индексы сохранившихся записей. При этом записи типа 1 выше автоматически удаляются. Для работы с типами 2 и 3, записи матрицы по диагонали и ниже установлены в0
. Таким образом, будут удалены все нулевые записи, кроме первой (соответствующей действительной дроби1/1
).Рассмотрим ввод
4
в качестве примера.источник
Желе ,
119 байтПопробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Mathematica, 53 байта
источник
Haskell, 40 байт
Анонимная функция. Довольно просто: использует понимание списка для создания бесконечного списка, циклически перебирая все числители
n
и относительно простые знаменателиd
. Чтобы преобразовать нулевой индекс в одноиндексный, мы добавляем a0
, который занимает4
байты.источник
n<-[0..d]
добавляет ноль более коротким способом и сохраняет 4 байтаPyth, 13 байт
Попробуйте онлайн. Тестирование.
источник
Pyth, 11 байт
Попробуйте онлайн: демонстрация
Объяснение:
источник
На самом деле , 15 байтов
Этот ответ основан на ответе Желе Денниса . Я использую
HN
в конце, чтобы избежать проблем с 0-индексацией и необходимостью уменьшить n и поменять местами в начале или конце.H
получает первыеn
члены списка числителей, которыеN
получаются, и получает последний член этого выбора, т.n
е. числитель, и все это без возни со стековыми операциями. Предложения по игре в гольф приветствуются. Попробуйте онлайн!Ungolfing
источник
Python,
111110 байтФракция представлена с
x/y
. Аргументn
уменьшается при обнаружении новой подходящей дроби (gcd
изfractions
проверок можно уменьшить дробь). В каждой итерации цикла,x
увеличивается, а затем, еслиx>=y
, новая серия фракций сy+1
запускается,>
из-за «особый случай»(x,y)=(2,1)
, чтобы golfedx>y
.Я уверен, что это может быть больше в гольфе, но мне не хватает, где я мог бы улучшить его.Нашел это.Ссылка на код и тестовые случаи
источник
JavaScript (ES6), 95 байт
Работает, генерируя все
n²
дроби с числителями и знаменателями из1
ton
и отфильтровывая те, которые больше1
или ранее видели, затем беряn
th.источник
Perl, 82 + 2 (
-pl
флаг) = 84 байтаUngolfed:
источник
JavaScript (ES6), 76
Меньше гольфа
Тест
источник
Clojure, 85 байт
Использует понимание списка для создания списка всех рациональных, а затем фильтрует его, чтобы получить только отдельные. Берет
nth
элемент списка и возвращает его числитель. Также для первого элемента необходимо отдельное условие, потому что Clojure не может взять числитель целого числа. (по любой причине, считая, что целое число не является Rational - https://goo.gl/XETLo2 )Посмотреть это онлайн - https://ideone.com/8gNZEB
источник