Задача:
Вашей программе дается правильная , простая положительная дробь в формате <numerator>/<denominator>
.
Для этого ввода необходимо найти две дроби.
- Доля, которая меньше, чем вход.
- Доля, которая больше, чем вход.
Обе дроби должны иметь меньший знаменатель, чем входные. Из всех возможных дробей они должны иметь самую низкую разницу с входными данными.
Выход:
Вывод вашей программы должен быть:
- Фракция, которая меньше, чем ввод, в формате
<numerator>/<denominator>
. - Затем следует пробел (ASCII-код 32).
- Затем следует дробь, которая больше, чем ввод, в формате
<numerator>/<denominator>
.
Следующее:
«fraction that is < input» «fraction that is > input»
Правила:
- Все выведенные фракции должны быть в минимальных сроках .
- Все выводимые фракции должны быть правильными.
- Если не существует подходящих дробных значений, которые разрешены правилами, вы должны вывести
0
вместо ввода дробной <input и1
вместо дробной> input. - Вы можете выбрать, хотите ли вы получить дробь в качестве аргумента командной строки (например,
yourprogram.exe 2/5
) или запросить ввод пользователя. - Вы можете предположить, что ваша программа не получит неверный ввод.
- Самый короткий код (в байтах, на любом языке) выигрывает.
Любые нестандартные аргументы командной строки (аргументы, которые обычно не требуются для запуска скрипта) учитываются в общем количестве символов.
Что ваша программа не должна делать:
- Зависит от любых внешних ресурсов.
- Зависит от наличия определенного имени файла.
- Выведите что-нибудь кроме требуемого вывода.
- Возьмите исключительно долго бежать. Если ваша программа выполняется более минуты для дробей с 6-значным числителем и знаменателем (например,
179565/987657
) на компьютере обычного домашнего пользователя, она недействительна. - Выходные дроби со
0
знаменателем. Вы не можете делить на ноль. - Выходные дроби с
0
числителем. Ваша программа должна выводить0
вместо дроби. - Уменьшить введенную дробь. Если дробь, заданная в качестве входных данных, является приводимой, вы должны использовать дробь, когда она вводится.
- Ваша программа не должна быть написана на языке программирования, для которого не было общедоступного компилятора / интерпретатора до того, как был опубликован этот вызов.
Примеры:
Вход: 2/5
Выход: 1/3 1/2
Вход: 1/2
Выход: 0 1
Вход: 5/9
Выход: 1/2 4/7
Вход: 1/3
Выход: 0 1/2
Вход: 2/4
Выход: 1/3 2/3
Вход: 179565/987657
Выход: 170496/937775 128779/708320
1/3 1/2
.Ответы:
Мудрец -
119117Шалфей нужен только в последней строке, которая заботится о выводе. Все остальное также работает в Python.
Заменить
raw_input()
сsys.argv[1]
, что вход считывается из аргумента командной строки , а не подсказка. Это не меняет количество символов. (Не работает в Python без импорта вsys
первую очередь.)Это по существу рекурсивно создает соответствующую последовательность Фаре создает используя медианы существующих элементов, но ограничивается теми элементами, которые находятся ближе всего к входу. С другой точки зрения, он выполняет поиск по вложенным интервалам для соответствующих последовательностей Фарея.
Он правильно обрабатывает все примеры менее чем за секунду на моей машине.
Вот негольфированная версия:
источник
exec
!Python 2.7 - 138
Я начал с очевидного грубого решения, но понял, что, так как ОП хотел иметь возможность решать экземпляры с шестизначными числителями и знаменателями за минуту, мне нужно лучшее решение, чем попытка триллионных возможностей. Я нашел удобную формулу на странице Википедии для последовательности Фэри: если a / b, c / d являются соседями в одной из последовательностей Фэри, с
a/b<c/d
, тогдаb*c-a*b=1
. Цикл while внутри f в моей программе расширяет этот факт до неуменьшенных чисел, используя gcd, который вычисляет другой цикл while.Я уже играл в гольф довольно тяжело, но я хотел бы услышать любые предложения.
Редактирование:
166-> 162: удалено
a
иb
из внешней программы. Они были ненужны.162-> 155:
str()
-> ``155-> 154: добавлено
k
.154-> 152: Удалено
x
изнутри функции, вместо этого передано в качестве аргумента.152-> 150: оставить
a
значение по умолчанию вместо передачи его в качестве аргумента.150-> 146: изменена инициализация
x
иy
.146-> 145: удалено
k
.145-> 144: изменено ... и ... или ... на (..., ...) [...], что позволяет сэкономить место.
144-> 138: изменено (..., ...) [...] на ... + ... * (...). Благодаря @ mbomb007.
Тестовые случаи:
Второй тест до последнего занял на моем компьютере менее секунды, тогда как последний тест занял около 5-10 секунд.
источник
k=1
чистое зло.print`(a*n+p)/d`+('/'+`a`)*(a>1),
Mathematica, 163 байта
Это сильно ограничено требованиями ввода / вывода, такими как пользовательский ввод и строки. Работать со струнами в Mathematica очень сложно (по крайней мере, когда вы хотите играть в гольф). Делая это естественным образом в Mathematica (используя только целые и рациональные числа), я бы, вероятно, уменьшил это до 50% от размера.
Он может делать 6-значные числа за несколько секунд на моей машине.
Чуть более читабельно (хотя на самом деле это не так)
Для удовольствия, выполняя этот «естественный путь», то есть как функцию, принимающую числитель и знаменатель и возвращающую два рациональных числа, это всего 84 символа (так что моя оценка в 50% была на самом деле довольно близка):
источник
Юлия -
127125 байтЯ подошел к этому с математической точки зрения, чтобы избежать необходимости в циклах, поэтому этот код выполняется довольно быстро для больших входов (примечание: если a / b является входом, то a * b должно соответствовать Int64 (Int32 на 32-битных системах) в противном случае генерируются бессмысленные ответы - если a и b оба выразимы в Int32 (Int16 в 32-разрядных системах), проблем не возникает).
ОБНОВЛЕНИЕ: больше нет необходимости перегружать обратную косую черту для div, используя ÷, экономя 2 байта.
Ungolfed:
Основная идея: найти наибольшее d и f меньше b, которое удовлетворяет требованиям ad-bc = gcd (a, b) (следующий наименьший) и be-af = gcd (a, b) (следующий наибольший), затем вычислить c и e из там. Результирующий вывод - c / de / f, если только d или f не равен 1, в этом случае / d или / f не указываются.
Интересно, что это означает, что код также работает для неправильных положительных дробей, если входные данные не являются целыми числами (то есть gcd (a, b) = a).
В моей системе ввод не
194857602/34512958303
занимает заметного времени для вывода171085289/30302433084 23772313/4210525219
источник
55552/999999
дает мне-396/920632 486/936509
.int32(55552*999999)
дает-282630400
. Для меня с этим тестом я получаю51143/920632 52025/936509
- обратите внимание, что знаменатели одинаковы, и что 52025-51143 = 486 - (- 396). Я добавлю примечание, чтобы упомянуть эту проблему.1234567891234567/2145768375829475878
результатов в869253326028691/1510825213275018197 365314565205876/634943162554457681
. Это изменение добавляет только 3 дополнительных символа.JavaScript, 131
С жирной стрелкой и
eval
звонками:179565/987657
Стресс - тест выполняется примерно 35 секунд на Firefox, намного больше на Chrome (~ 6 минут)Более быстрый метод и без
eval
и жирная стрелка обозначений179565/987657
Стресс - тест выполняется в течение 5 секунд.Не в гольф:
источник
eval
. EEK2/6
дает1/3 2/5
, однако1/3
, не меньше, но равно2/6
.perl, 142 байта (155 без CPAN)
Или, если модули CPAN запрещены / требуется в 3-4 раза более быстрый код:
Первая версия занимает 9,55 секунды на моей машине, последняя версия 2,44 секунды.
Менее нечитаемый:
источник