Між фракціями


13

Між фракціями

Змагання:

Вам потрібно буде створити код, який займає принаймні 3 входи; 2 цілих числа та "представлення дробу" - який би тип не відповідав вашій мові для представлення приростів дробу), тобто. Якщо ви виберете рядок, вхід буде "1/4" або ви можете вибрати 2 додаткові цілі входи, або кортеж або w / e.

Введення може бути де завгодно розумним (STDIN, аргументи функції, з файлу тощо), і так може виводити (STDOUT, значення повернення функції, у файл тощо)

Правила:

  1. Вхідна "частка" завжди буде дійсною часткою, меншою за 1; приклад "1/4"
  2. Друге вхідне ціле число завжди матиме більше значення, ніж перше ціле число. IE, перше вхідне ціле число завжди матиме нижче значення, ніж друге.
  3. Цілі числа можуть бути від’ємними.
  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)

Це , тому найкоротша відповідь у байтах виграє.


Чи можна прийняти дріб як два цілих входи, зробивши 4 загальні входи?
Мего

Я думаю, що погано тримаю обмеження на максимум 3 входи - я хотів би також побачити код на 4 входи
Алекс Карлсен

У такому випадку, що робити зі списком / кортежем / масивом / деяким іншим ітерабельним типом, що містить два цілі числа для третього вводу? Це принципово не відрізняється від 4 цілих входів. Також слід уточнити, що частка не буде дорівнює 0.
Мего

@Mego Поміркувавши це, я не можу зрозуміти, чому його не можна дозволити Змінено на "код, який займає принаймні 3 входи"
Alex Carlsen

1
@beaker, поки вихід правильний, а вхід надходить з принаймні 2 цілих чисел, решта залежить від вас :) - Я тримав вхідну частину досить відкритою, щоб побачити різні відповіді
Алекс Карлсен

Відповіді:


5

Октава, 34 30 байт

@(a,b,c)rats(union([a:c:b],b))

Тепер приймає дріб як числовий вираз, а не окремий числівник та знаменник.

Зразок на ideone


1
Так чому ви не можете використовувати @(a,b,c)rats(union([a:c:b],b))?
Луїс Мендо

@LuisMendo Я можу, якщо математичні вирази є прийнятними входами (ефективний результат 1/2як числового, а не введення рядка), але це не так, як я інтерпретував "представлення дробів". Якщо ОП погодиться, я буду радий поголити 4 байти.
стакан

О Я бачу. Ну, я використовую це у своїй відповіді Матлаба. Математика відповідає так, мабуть, якщо "раціональне число" не є конкретним типом даних
Луїс Мендо

@beaker я насправді відповів
Алекс Карлсен

@VisualBean Code вже оновлено.
стакан

11

Математика, 16 байт

Range@##⋃{#2}&

Безіменна функція, яка приймає два цілих числа та раціональне число і повертає список чисел, наприклад:

Range@##⋃{#2}&[-2, 3, 1/2]
(* {-2, -(3/2), -1, -(1/2), 0, 1/2, 1, 3/2, 2, 5/2, 3} *)

Mathematica Rangeробить саме те, що задається завданням, за винятком того, що він опускає верхню межу, якщо різниця між нижньою та верхньою межею не є точно кратною розміру кроку. Тому ми беремо Union(використовуючи ) список, що містить лише верхню межу, яка гарантує, що він з’являється рівно один раз. Зауважте, що Unionбуде сортувати результат, але ми хочемо, щоб він був відсортований, так як розмір кроку завжди позитивний. Оскільки ми працюємо з раціоналізаторами, вони автоматично зменшуються наскільки це можливо.


10

T-SQL 2012+, 831 535 477 270 246 240 219 байт

Зверніть увагу, що це один вкладиш - sql не має вбудованої функції, щоб зменшити дріб. Можливо, це не найкраща мова для такого типу питань. Він читається для людини (вид - порівняно з деякими іншими мовами).

DECLARE @f INT=-5,@t INT=3,@n INT=3,@ INT=8;

WITH C as(SELECT
top((@t*@-@f*@)/@n+1)ROW_NUMBER()OVER(ORDER BY @)M
FROM sys.messages)SELECT(SELECT
IIF(V%@=0,LEFT(V/@,9),CONCAT(V/MAX(M),'/',ABS(@)/MAX(M)))FROM c
WHERE V%M=0AND @%M=0)FROM(SELECT
@f*@+@n*~-M V FROM c)k

Спробуйте в Інтернеті


Хіба мова не називається T-SQL, а не "Sqlserver"?
Девід Конрад

1
@DavidConrad мовою є TSQL, але існують різні версії sqlserver, і TSQL для цього буде працювати для sqlserver 2012 через ключове слово IIF. Яке використовувало б ключове слово CASE у старих версіях. Додано вашу пропозицію
t-clausen.dk

Хороша робота. Ви можете зберегти декілька, змінивши @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повинна працювати
MickyT

@MickyT завдяки вашим пропозиціям та кільком моїм власним, мені вдалося скоротити довжину на 296 байт,
t-clausen.dk

Чудова робота там
MickyT


5

Haskell, 31 26 байт

f a b c=min[b]$a:f(a+c)b c

Ледача оцінка FTW! Демонстрація:

*Main> import Data.Ratio
*Main Data.Ratio> f (-2) 3 (1%2)
[(-2) % 1,(-3) % 2,(-1) % 1,(-1) % 2,0 % 1,1 % 2,1 % 1,3 % 2,2 % 1,5 % 2,3 % 1]
*Main Data.Ratio> f 1 2 (2%3)
[1 % 1,5 % 3,2 % 1]

(Я спочатку спокусився [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без цього використовувати , правда?
flawr

2
@flawr: хороший крайовий випадок: вам не потрібно Data.Ratioдля fсебе, оскільки це поліморфно для всіх числових типів. Однак, коли ви хочете викликати його зі значеннями типу Ratio, вам потрібно імпортувати. Завдання вимагає лише "створити код, який ...", а не використовувати його. Я думаю, це добре без імпорту.
nimi

1
Точніше, вам потрібно лише імпорт %оператору для створення тестових фракцій 1 % 2і 2 % 3. Я тут не обманюю: ви дійсно можете помістити ці 26 байт у файл самі, запустити інтерпретатор на цьому модулі та провести взаємодію, яку я відобразив. (Ви навіть можете уникнути введення import Data.Ratioдемо-взаємодії, якщо замість цього будете писати %як Data.Ratio.%.)
Anders Kaseorg

5

MATL , 16 15 байт

3$:3Gvu9X10ZGZD

Це може не вдатися до дуже великих знаменників. Я сподіваюся, що вихідний формат прийнятний.

Спробуйте в Інтернеті!

3$:    % take three inputs and generate range
3G     % push third input again
v      % vertically concatenate. Gives vertical array as output 
u      % get unique elements (i.e. remove the last one if it is repeated)
9X1    % predefined literal 'rat'
0ZG    % set rational format
ZD     % display using that format

5

Рубі , 32 54 48 байт

->a,b,c{(a..b).step(c){|x|p x%1>0?x:x.to_i};p b}

Це рішення засноване на відповіді Mego's Python і передбачає, що cце завжди буде Rationalформату фракції Ruby. Спробуйте в Інтернеті!

Редагувати: виправлена ​​помилка, коли цілі числа не були представлені як цілі числа. -6 байт завдяки Not That Charles та MegaTom.

Функції викликаються таким чином:

> f=->a,b,c{(a..b).step(c){|x|p x%1>0?x:x.to_i};p b}
> f[1,4,Rational(2,3)]
1
(5/3)
(7/3)
3
(11/3)
4

(3/1) не повинно бути просто 3?
edc65

Найпростіша Rationalформа 3Рубі(3/1)
Sherlock9,

.step(b,c).mapслід зменшити кількість байтів тут
Не те, щоб Чарльз

(a==a.to_i)може бути a%1==0для -4 байт.
MegaTom

-2,3,1/2r(приклад 1) друкує останні 3два рази.
Значення чорнила

3

Джулія, 14 байт

f(a,b,c)=a:c:b

Це схоже на відповідь Mathematica, за винятком того, що діапазони Джулії вже в бажаному форматі, тому він ще коротший. Також повертає колекцію номерів. Приклад виводу:

11-element StepRange{Rational{Int64},Rational{Int64}}:
 -3//1,-5//2,-2//1,-3//2,-1//1,-1//2,0//1,1//2,1//1,3//2,2//1

Зверніть увагу, що цілі числа відображаються з знаменником 1, а дроби з подвійною косою рисою використовуються для дробів. Щоб отримати результат точно такий, як визначено у запитанні, потрібно ще трохи коду:

f(a,b,c)=map(x->println(x.num,x.den<2?"":"/$(x.den)"),a:c:b)

3

Matlab з Symbolic Toolbox / Octave з SymPy, 27 байт

Завдяки @sanchises за вказівку на помилку, яку тепер виправлено

@(a,b,c)sym(union(a:c:b,b))

Це анонімна функція. Щоб викликати його, призначте його змінній або використовуйте ans.

Приклад:

>> @(a,b,c)sym(union(a:c:b,b))
ans = 
    @(a,b,c)sym(union(a:c:b,b))
>> ans(-2,3,1/2)
ans =
[ -2, -3/2, -1, -1/2, 0, 1/2, 1, 3/2, 2, 5/2, 3]

Це не відповідає специфікації, оскільки верхня межа не завжди включена (спробуйте приклад 2).
Санчіз

@sanchises Дякую! Виправлено зараз
Луїс Мендо

А також, я думаю, cви можете використовувати, я цитую, який би тип ви не відповідав вашій мові для представлення приросту частки [...] або w / e . Я думаю, що цілком зрозуміло, що symbolicце логічний і дозволений (@VisualBean, можливо, захоче підтвердити це) вибір. Результат оператора товстої кишки потім "оновлений" до symbolicмасиву, що означає, що ви можете повністю позбутися від sym()виклику.
Санчіз

@sanchises Спасибі, я попросив роз'яснення
Луїс Мендо

2

Javascript, 108 90 86   81 байт

(a,b,n,d)=>{var s="";for(a=a*d;a<b*d;a+=n)s+=(a%d?a+"/"+d:a/d)+" ";s+=b;return s}

Анонімна функція. Після присвоєння названій змінній з пробілом:

var f=(a,b,n,d)=>
{ var s="";
  for(a=a*d; a<b*d; a+=n)
    s+= (a%d ? a + "/" + d : a/d) + " ";
  s+=b;
  return s
}

Приклади тесту:

console.log(f(1,2,1,8)); //writes:
1 9/8 10/8 11/8 12/8 13/8 14/8 15/8 2

console.log(f(-3,3,4,7)); // writes:
-3 -17/7 -13/7 -9/7 -5/7 -1/7 3/7 1 11/7 15/7 19/7 3 

Імперативний підхід із використанням JavaScript, без рекурсії, бібліотеки чи функціонального програмування.


1

Маленький розмов - 89 байт

Одного разу Smalltalk майже конкурентоспроможний!

Number extend[p:e q:i[|h|self to:e by:i do:[:x|h:=x. x printNl].h=e ifFalse:[e printNl]]]

Телефонуйте так:

> 2 p:5 q:1/2
2
5/2
3
7/2
4
9/2
5

> 1 p:2 q:2/3
1
5/3
2

1

R - 71 байт

Передбачає, що ви вже встановили MASSпакет

f=function(x,y,z)MASS::fractions(union(seq(x,y,eval(parse(text=z))),y))

> f(1, 2, '1/3')
[1]   1 4/3 5/3   2
> f(2, 5, '1/2')
[1]   2 5/2   3 7/2   4 9/2   5

1

Пірет, 56 байт

{(b,e,n,d):link(e,map(_ / d,range(b * d, e * d))).sort()}

Бере початок (b), кінець (e), числівник (n) та знаменник (d). Створює діапазон цілих чисел, ділить ці наскрізь і додає кінець до списку (шляхом з'єднання та сортування).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.