Знайдіть максимальну відповідність у відношенні подільності


16

Вам дається набір натуральних чисел. Ви повинні розташувати їх на пари таким чином:

  • Кожна пара містить 2 числа, одне з яких є кратним іншому. Наприклад, 8 кратне 4, а 9 кратне 9.
  • Якщо однакова кількість зустрічається багато разів у початковій множині, її можна використовувати стільки разів у парах; число навіть може бути сполученим з іншим випадком того ж числа
  • Отримується максимально можлива кількість пар.

Вихід повинен бути кількістю пар. Найкоротший код виграє.

Зразок даних

2,3,4,8,9,18 -> 3

7,14,28,42,56 -> 2

7,1,9,9,4,9,9,1,3,9,8,5 -> 6

8,88,888,8888,88888,888888 -> 3

2,6,7,17,16,35,15,9,83,7 -> 2


3
Хтось знає, чи ця проблема неповна? Я думаю, що найменший «важкий» набір - це 2,3,4,8,9,18. (Кожне число у цьому списку є коефіцієнтом та / або кратним щонайменше двом іншим числам у списку, але воно має лише одне рішення.)
Ніл

Відповіді:


6

Haskell, 109 107 76 70 байт

Завдяки німі за те, що врятував 33 байти та навчив мене ще Haskell. :)
Завдяки xnor за збереження ще 6 байт.

import Data.List
f l=maximum$0:[1+f t|a:b:t<-permutations l,a`mod`b<1]

Так, мій перший гольф Haskell. Він працює так само, як і всі відповіді на даний момент (ну, не зовсім: він підраховує лише довжину найдовшого префікса дійсних пар у кожній перестановці, але це еквівалентно і насправді те, що зробив мій оригінальний код CJam).

Для додаткового гольфу це також дуже неефективно, рекурсивно генеруючи всі перестановки суфікса щоразу, коли перші два елементи перестановки є дійсною парою.


Чи f=потрібне?
Олексій А.

@AlexA. Я не впевнений, що таке стандартна політика щодо PPCG для неназваних функцій в Haskell, але я перевірив кілька інших відповідей Haskell і вони використовували названі функції. Крім того, вам технічно доведеться використовувати дужки навколо функції, якщо ви хочете використовувати її як неназвану функцію, так що це було б те саме число байтів, як я думаю.
Мартін Ендер

@nimi Дякую, що повідомили мені. :) Чи бачите ви ще щось, що можна було б скоротити? Імпорт chunksOfболісний. Я дійсно не знаю стандартної бібліотеки Haskell, щоб можна було визначити, чи існує коротша еквівалентна функція. Я спробував реалізувати його сам, але він вийшов на два-три байти довше, ніж імпорт.
Мартін Ендер

Ой, ловить і те, []і [_]одночасно, поставивши g x=[]друге, справді розумно. Я спробую. Дякую :)
Мартін Ендер

Виглядає трохи коротше , щоб визначити всі функції рекурсивно: f l=maximum$0:[1+f t|(a:b:t)<-permutations l,a`mod`b<1].
xnor

3

CJam, 22 18 байт

q~e!{2/::%0e=}%:e>

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

Очікує введення у вигляді списку у стилі CJam.

Це трохи неефективно для більших списків (і у Java, ймовірно, не вистачить пам'яті, якщо ви не надасте більше).

Пояснення

q~     e# Read and evaluate input.
e!     e# Get all distinct permutations.
{      e# Map this block onto each permutation...
  2/   e#   Split the list into (consecutive) pairs. There may be a single element at the
       e#   end, which doesn't participate in any pair.
  ::%  e#   Fold modulo onto each chunk. If it's a pair, this computes the modulo, which
       e#   yields 0 if the first element is a multiple of the second. If the list has only
       e#   one element, it will simply return that element, which we know is positive.
  0e=  e#   Count the number of zeroes (valid pairs).
}%
:e>    e# Find the maximum of the list by folding max() onto it.

Це не дає результату для. [1 2 3 4 5 6 7 8 9 10]Однак, [7 1 9 9 4 9 9 1 3 9 8 1]який є більш тривалий список, працює належним чином. Чому так?
ghosts_in_the_code

@ghosts_in_the_code Тому що перший має більш чіткі перестановки. 10! = 3628800, але 12! / 5! / 3! = 665280. Тож у першого випадку у нього не вистачає пам'яті. Якщо ви запустили його з консолі з інтерпретатором Java, ви можете сказати Яві використовувати більше пам'яті, і перший випадок спрацював би так само (хоча це може зайняти деякий час, не знаю).
Мартін Ендер

3

Pyth, 13 байт

eSm/%Mcd2Z.pQ

Час і складність зберігання дійсно жахливі. Перше, що я роблю, - це створити список із усіма перестановками оригінального списку. Це займає n*n!сховище. Списки введення довжиною 9 вже займають досить багато часу.

Спробуйте в Інтернеті: Демонстрація або Тестовий набір

Пояснення:

eSm/%Mcd2Z.pQ
            Q   read the list of integer
          .p    create the list of all permutations
  m             map each permutation d to:
      cd2          split d into lists of length 2
    %M             apply modulo to each of this lists
   /     Z         count the zeros (=number of pairs with the first 
                   item divisible by the second)
 S              sort these values
e               and print the last one (=maximum)

2

Математика, 95 93 87 83 79 60 58 байт

Max[Count[#~Partition~2,{a_,b_}/;a∣b]&/@Permutations@#]&

Для великих прикладів знадобиться кілька секунд.


0

Матлаб (120 + 114 = 234)

  function w=t(y,z),w=0;for i=1:size(z,1),w=max(w,1+t([y,z(i,:)],feval(@(d)z(d(:,1)&d(:,2),:),~ismember(z,z(i,:)))));end

основні:

  a=input('');h=bsxfun(@mod,a,a');v=[];for i=1:size(h,1) b=find(~h(i,:));v=[v;[(2:nnz(b))*0+i;b(b~=i)]'];end;t([],v)

  • функція топпера називається основною частиною.

  • вхід у формі [. . .]


0

Матлаб (365)

  j=@(e,x)['b(:,' num2str(e(x)) ')'];r=@(e,y)arrayfun(@(t)['((mod(' j(e,1) ',' j(e,t) ')==0|mod(' j(e,t) ',' j(e,1) ')==0)&',(y<4)*49,[cell2mat(strcat(r(e(setdiff(2:y,t)),y-2),'|')) '0'],')'],2:y,'UniformOutput',0);a=input('');i=nnz(a);i=i-mod(i,2);q=0;while(~q)b=nchoosek(a,i);q=[cell2mat(strcat((r(1:i,i)),'|')) '0'];q=nnz(b(eval(q(q~=0)),:));i=i-2;end;fix((i+2)/2)

  • Це, мабуть, довше, але однолінійний та виконавчий, і мені вдалося уникнути permsфункції, тому що це вічно.

  • Ця функція вимагає безлічі репресій, щоб добре працювати завдяки анонімним функціям, я відкритий для пропозицій тут :)

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