Промежуточные дроби
Соревнование:
Вам нужно будет создать код, который принимает как минимум 3 входа; 2 целых числа и «представление дроби» - какой бы тип не подходил вашему языку для представления приращений дроби) т.е. Если вы выберете строку, вход будет "1/4", или вы можете выбрать 2 дополнительных целочисленных ввода или кортеж или w / e.
Ввод может быть где угодно (STDIN, аргументы функции, из файла и т. Д.), И поэтому может выводиться (STDOUT, возвращаемое значение функции в файл и т. Д.)
Правила:
- Входная дробь всегда будет действительной дробью, меньше 1; пример "1/4"
- Второе входное целое всегда будет иметь более высокое значение, чем первое целое. То есть первое входное целое число всегда будет иметь меньшее значение, чем второе.
- Входные целые числа могут быть отрицательными.
- Выведенные дроби должны быть максимально уменьшены (упрощены)
Код должен будет выводить каждый «шаг дроби» между двумя числами с приращением входной дроби.
Код должен быть программой или функцией, как указано здесь
Пример 1:
Входные данные: -2,3,"1/2"
Выход:
-2
-3/2
-1
-1/2
0
1/2
1
3/2
2
5/2
3
Пример 2:
Входные данные: 1,2,"2/3"
Выход:
1
5/3
2
или
1
4/3
2
Примечание: подсчет может начинаться с любого направления (спасибо @Mego)
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
источник
Ответы:
Октава,
3430 байтТеперь принимает дробь как числовое выражение, а не как отдельный числитель и знаменатель.
Образец на идеоне
источник
@(a,b,c)rats(union([a:c:b],b))
?1/2
в виде числового, а не строкового ввода), но я не так интерпретировал «представление дроби». Если ОП согласится, я буду рад сбрить 4 байта.Mathematica, 16 байт
Безымянная функция, которая принимает два целых числа и рациональное число и возвращает список чисел, например:
Mathematica
Range
делает именно то, что задает задача, за исключением того, что она не включает верхнюю границу, если разница между нижней и верхней границей не кратна размеру шага. Поэтому мы беремUnion
(использование⋃
) со списком, содержащим только верхнюю границу, которая гарантирует, что он появится ровно один раз. Обратите внимание, что результатUnion
будет отсортирован, но мы все равно хотим его отсортировать, поскольку размер шага всегда положительный. Кроме того, поскольку мы работаем с рациональными значениями, они автоматически максимально сокращаются.источник
T-SQL 2012+,
831535477270246240219 байтОбратите внимание, что это одна строка - в sql нет встроенной функции для уменьшения дроби. Не может быть лучшим языком для этого типа вопроса. Он читабелен человеком (вид - по сравнению с некоторыми другими языками).
Попробуйте онлайн
источник
@n
или@d
на равнину@
. Ваш запрос CTE для N может бытьN AS(SELECT N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N))
илиN AS(SELECT 1N FROM sys.all_views)
. Учитывая, что в этом представлении почти гарантированно будет несколько сотен, вы также можете уменьшить количество перекрестных соединений.ISNULL
корочеCOALESCE
и должен работатьPython 2, 81 байт
Попробуйте онлайн
источник
Haskell,
3126 байтЛенивая оценка FTW! Демо-версия:
(Первоначально меня соблазнили
[a,a+c..b]
нотации Хаскелла , но у него есть некоторые причуды, которые требуют чего-то вродеf a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]
41 байта илиf a b c=[x|x<-[a,a+c..],x<b]++[b]
33).источник
import Data.Ratio
в свой счетчик байтов, я думаю, вы не можете использоватьf
без этого, верно?Data.Ratio
поf
себе, потому что он полиморфен для всех числовых типов. Однако, когда вы хотите вызвать его со значениями типаRatio
, вам нужен импорт. Задача требует только «создать код, который ...», а не использовать его. Я думаю, что это нормально без импорта.%
оператора для создания тестовых фракций1 % 2
и2 % 3
. Я не обманываю здесь: вы действительно можете поместить эти 26 байтов в файл самостоятельно, запустить интерпретатор для этого модуля и получить отображаемое мной взаимодействие. (Вы могли бы даже избежать вводаimport Data.Ratio
в демонстрационном взаимодействии, если бы вместо этого произносили%
какData.Ratio.%
.)MATL ,
1615 байтЭто может не сработать для очень больших знаменателей. Я надеюсь, что выходной формат является приемлемым.
Попробуйте онлайн!
источник
Рубин ,
325448 байтЭто решение основано на ответе Mego на Python и предполагает, что
c
это всегда будетRational
формат дроби Ruby. Попробуйте онлайн!Редактировать: Исправлена ошибка, когда целые числа не были представлены как целые числа. -6 байт благодаря Not That Charles и MegaTom.
Функции вызываются следующим образом:
источник
Rational
вид3
в Рубине(3/1)
.step(b,c).map
следует уменьшить количество байтов здесь(a==a.to_i)
может бытьa%1==0
для -4 байта.-2,3,1/2r
(пример 1) печатает последние3
дважды.Юлия, 14 байт
Это похоже на ответ Mathematica, за исключением того, что диапазоны Юлии уже в желаемом формате, поэтому он еще короче. Также возвращает коллекцию чисел. Пример вывода:
Обратите внимание, что целые числа отображаются с 1 в знаменателе, а двойная косая черта используется для дробей. Чтобы получить результат точно так, как определено в вопросе, требуется еще немного кода:
источник
Matlab с символьным инструментарием / октава с SymPy, 27 байт
Спасибо @sanchises за указание на ошибку, теперь исправленную
Это анонимная функция. Чтобы вызвать его, присвойте его переменной или используйте
ans
.Пример:
источник
c
вы можете использовать, я цитирую, какой бы тип не подходил вашему языку для представления приращений дроби [...] или w / e . Я думаю, что довольно ясно, чтоsymbolic
это логичный и разрешенный (@VisualBean может захотеть подтвердить это) выбор. Результат оператора двоеточия затем «обновляется» доsymbolic
массива, что означает, что вы можете полностью избавиться отsym()
вызова.Javascript,
108 90 8681 байтАнонимная функция. После присвоения именованной переменной с пробелами:
Тестовые примеры:
Императивный подход с использованием JavaScript, без рекурсии, библиотечного или функционального программирования.
источник
Smalltalk - 89 байт
На этот раз Smalltalk практически конкурентоспособен!
Звоните так:
источник
R - 71 байт
Предполагается, что вы уже установили
MASS
пакетисточник
Pyret, 56 байт
Принимает начало (b), конец (e), числитель (n) и знаменатель (d). Создает диапазон целых чисел, разделяет их и добавляет конец в список (путем связывания, а затем сортировки).
источник