LCM раціональних чисел


18

Найменше спільне множина (LCM) набору чисел A- найменше ціле число b, яке b/aє цілим числом для всіх цілих чисел aу A. Це визначення можна поширити на раціональні числа!

Завдання

Знайдіть найменший позитивний раціональний b такий, який b/aє цілим числом для всіх раціоналів a у вхідних даних.

Правила

  • Стандартні лазівки заборонені.
  • Ви можете брати чисельники та знаменники окремо у вводі, але не можна брати парні, плавці тощо.
  • Вхід може бути зменшений не повністю.
  • Ви можете приймати цілі введення як раціональні знаменники 1.
  • Подання, які могли б подавати раціональні числа до вбудованого LCM / GCD, дозволено, але неконкуренто.

Випробування

In:  3
Out: 3

In:  1/17
Out: 1/17

In:  1/2, 3/4
Out: 3/2

In:  1/3, 2/8
Out: 1

In:  1/4, 3
Out: 3

In:  2/5, 3
Out: 6

In:  1/2, 3/4, 5/6, 7/8
Out: 105/2

Це , тому подання з використанням найменших байтів виграють!


4
Примітка: обчислення LCM[numerators]/GCD[denominators]можуть не працювати, коли вхід містить не зменшене раціональне число. напр 1/3, 2/8.
JungHwan Min

Тож якщо я його зменшу, він спрацює?
Лина монашка

@LeakyNun Так, так і буде.
JungHwan Min

Щоб заохотити людей подавати відповіді, які не вбудовуються, я відредагував це питання, зробивши відповіді на вбудовані неконкурентоспроможними (все ще дозволено). Якщо це проблема, я відкажу своє редагування.
JungHwan Min

Що з вбудованим вбудованим LCM, але тільки з цілими числами - конкурують вони чи ні?
Джонатан Аллан

Відповіді:



6

J, 3 байти, неконкурентні.

*./

Враховуючи перелік раціональних вхідних даних, він складається через LCM.


4

sed, 374 (373 + 1) байт

-EПрапор sed вважається одним байтом. Примітка: Я ще не намагався займатися гольфом, і, мабуть, не хотів би досить довго.
Введення приймається одинарним, а вихід - одиничним. Пробіли повинні оточувати кожну дріб. Приклад: echo " 1/111 111/11111 111111/111 ".

:d;s, (1*)/\1(1*), \1/\22,;s,(1*)(1*)/\2 ,2\1/\2 ,;td;s,1*(1/22*),\1,g;s,(22*/1)1*,\1,g;:r;s,((1*)/1*)2,\1\2,;s,2(1*/(1*)),\2\1,;tr;h;s,1*/,,g;:g;s/^(1*) 1(1*) 1(1*)/1\1 \2 \3/;tg;s/  */ /g;s/^/ /;/1 1/bg;x;s,/1*,,g;s/^( 1*)( 1*)/\1\2\2/;:l;s/^(1*) (1*) \2(1*)/\1\2 \2 \3/;tl;/  $/be;/  /{s/^(1*) 1*  1*( 1*)/ \1\2\2/;bl};s/^(1* 1* )(1*) (1*)/\1\2\3 \3/;bl;:e;G;s, *\n *,/,

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



3

JavaScript (ES6), 85 байт

a=>a.reduce(([b,c],[d,e,g=(b,c)=>c?g(c,b%c):b,h=g(b*e,c*d),i=g(b*d,h)])=>[b*d/i,h/i])

Не дивіться вбудованих! Без сумніву, хтось переможе це за допомогою рекурсивного підходу чи чогось іншого.



2

Perl 6 ,  46  42 байти

{[lcm](@_».numerator)/[gcd] @_».denominator}

перевірити його

{[lcm](($/=@_».nude)[*;0])/[gcd] $/[*;1]}

перевірити його

Введення - це список Раціональних чисел.

Розширено:

{ # bare block lambda with implicit parameter list 「@_」

  [lcm](            # reduce using &infix:<lcm>
    (
      $/ = @_».nude # store in 「$/」 a list of the NUmerators and DEnominiators
                    # ((1,2), (3,4))

    )[
      *;            # from all of the first level 「*」,
      0             # but only the 0th of the second level (numerators)
    ]
  )
  /
  [gcd] $/[ *; 1 ]  # gcd of the denominators
}

2

Сітківка , 117 байт

\d+
$*
\b(1+)(\1)*/(\1)+\b
$#2$*11/$#3$*
{`^((1+)\2*)/(1+)+ (\2)+/\3+\b
$1 $#4$*1/$3
}`\G1(?=1* (1+))|\G 1+
$1
1+
$.&

Спробуйте в Інтернеті! Приймає дані як пробіл, розділений пробілом, неправильних дробів (без цілих чи змішаних чисел) Пояснення:

\d+
$*

Перетворює десятковий в одинаковий.

\b(1+)(\1)*/(\1)+\b
$#2$*11/$#3$*

Це зменшує кожну фракцію до найнижчих умов. Група захоплення 1 представляє GCD чисельника та знаменника, тому ми підраховуємо кількість захоплень до та після /. \b(1+)+/(\1)+\bЗдається, чомусь правильно не рахувати кількість захоплень, тому я використовую додаткову групу захоплення і додаю 1 до результату.

{`^((1+)\2*)/(1+)+ (\2)+/\3+\b
$1 $#4$*1/$3

Це робить ряд речей. Група захоплення 2 являє собою GCD чисельників перших двох дробів, тоді як група захоплення 3 являє собою GCD знаменників. $#4тому є другим чисельником, поділеним на їх GCD. (Знову ж, я не зміг би кількість захоплень першого чисельника, але мені потрібно розділити лише один чисельник на їх GCD, так що це коштує не так вже й багато.)

}`\G1(?=1* (1+))|\G 1+
$1

Тепер, коли другий чисельник розділився на їх GCD, ми просто використовуємо це вираження з підручника з арифметичної арифметики для множення двох разом, в результаті чого з’являється LCM. Потім повторюємо вправу для будь-яких інших дробів.

1+
$.&

Перетворює одинакове назад у десятковий.


2

Лист звичайний, 154 байти

(defun f(l &aux(s(pairlis l l)))(loop(and(eval`(=,@(mapcar'car s)))(return(caar s)))(let((x(assoc(reduce'min s :key'car)s)))(rplaca x(+(car x)(cdr x))))))

Використовуваний алгоритм (вказаний для цілих чисел, але працює також для раціональних).

Спочатку складіть асоціативний список вхідних даних із самим собою, щоб відслідковувати початкові значення елементів, тому послідовність роботи задається «автомобілем» списку.

(defun f(l &aux (s (pairlis l l)))        ; make the associative list
  (loop
     (when (eval `(= ,@(mapcar 'car s))) ; when the car are all equal
       (return (caar s)))                 ; exit with the first one
     (let ((x (assoc (reduce 'min s :key 'car) s))) ; find the (first) least element
       (rplaca x (+ (car x) (cdr x))))))  ; replace its car adding the original value (cdr)

Тестові приклади:

CL-USER> (f '(3))
3
CL-USER> (f '(1/17))
1/17
CL-USER> (f '(1/2 3/4))
3/2
CL-USER> (f '(1/3 2/8))
1
CL-USER> (f '(1/4 3))
3
CL-USER> (f '(2/5 3))
6
CL-USER> (f '(1/2 3/4 5/6 7/8))
105/2

Примітка. Рішення не застосовується для нарощування lcmта gcd, які приймають цілі числа.


W00t? Спробуйте це у своїй REPL (/ (lcm 1 3 5 7) (gcd 2 4 6 8)).
Каз

@Kaz, оскільки, як було сказано в проблемі, "подання, яке б подало раціональні числа до вбудованого LCM / GCD, дозволено, але не конкурує".
Ренцо

У термінах Ліспа, строго кажучи, ми насправді подаємо раціональні, коли ми називаємо (lcm 1 3 5 7), оскільки цілі числа є підтипом раціональних, але я думаю, що це правило повинно виключати використання lcmабо, gcdщо дозволяє раціонально використовувати.
Каз

@Kaz, ops ... Я неправильно трактував правила! Чи потрібно видалити посаду? (можливо, це не дуже хороший маркетинг для Common Lisp :)
Renzo

Я просто зазначив, що це рішення без використання вбудованого цілого lcmі gcd.
Каз

1

Математика, 3 байти, неконкурентна

LCM

Вбудована LCMфункція Mathematica здатна обробляти введення раціональних чисел.


3
Хоча відповідати на ваше власне питання добре, я не думаю, що відповідати на це рішенням, яке має дуже реальний шанс на перемогу, є дуже реальним: P
Бета-розпад

@BetaDecay Так ... Отже, зараз це неконкуренто.
JungHwan Min


1

Лист звичайний, 87 78 байт

Використання lcmта gcd, які мають цілі входи:

(defun l(a)(/(apply #'lcm(mapcar #'numerator a))(apply #'gcd(mapcar #'denominator a))))

Більше гольфу:

(defun l(a)(eval`(/(lcm,@(mapcar'numerator a))(gcd,@(mapcar'denominator a))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.