Чи розділяються списки?


20

Натхненно (з поясненням, викраденим у цього )

Фон

Скажімо, у вас є два списки A = [a_1, a_2, ..., a_n]і B = [b_1, b_2, ..., b_n]цілих числа. Ми говоримо A, що потенційно ділиться , Bякщо є перестановка, Bщо робить a_iділимим b_iна всіх i. Проблема полягає в тому: чи можна змінити порядок (тобто перестановку) Bтак, що a_iподіляється b_iна всіх i? Наприклад, якщо у вас є

A = [6, 12, 8]
B = [3, 4, 6]

Тоді відповідь буде True, так як Bможе бути замовлена бути , B = [3, 6, 4]і тоді ми б що a_1 / b_1 = 2, a_2 / b_2 = 2і a_3 / b_3 = 2, всі з яких є цілими числами, тому Aпотенційно-кратно B.

Як приклад, який повинен бути результатом False, ми можемо навести :

A = [10, 12, 6, 5, 21, 25]
B = [2, 7, 5, 3, 12, 3]

Причиною цього є Falseте, що ми не можемо змінити порядок, Bоскільки 25 та 5 знаходяться у A, але єдиним дільником у B5 буде 5, тож один буде залишений.

Ваше завдання

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

Дублікати у списках - це можливість, і єдиними обмеженнями розміру на цілі числа є ваша мова. Усі цілі числа в обох списках будуть більшими за 0, і обидва списки будуть однакового розміру.

Як і у всіх вирішення, вихідні значення повинні бути двома різними значеннями, що представляють собою істинні та помилкові.

Це тому найкоротший виграш коду!

Тестові кейси

Input, input => output

[6, 12, 8], [3, 4, 6] => True
[10, 5, 7], [1, 5, 100] => False
[14, 10053, 6, 9] [1,1,1,1] => True
[12] [7] => False
[0, 6, 19, 1, 3] [2, 3, 4, 5, 6] => undefined

3
@Shaggy з питання: обидва списки будуть однакового розміру
caird coinheringaahing

2
Чому останній тестовий випадок не визначений?
Денніс

1
@Dennis в одному зі списків є 0
caird coinheringaahing

1
Правильно. (Не впевнений, чому 0 ділиться на всі цілі числа.) Чи повинні два виходи бути правдивими і хибними, або просто послідовними?
Денніс

@Dennis 1) це у випадку, якщо 0 знаходиться у другому списку, щоб уникнути 0 помилок поділу 2) просто послідовно
caird coinheringaahing

Відповіді:


10

Желе , 5 байт

Œ!%ḄẠ

Повертає 0 для True , 1 для False .

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

Як це працює

Œ!%ḄẠ  Main link. Arguments: A, B (arrays)

Œ!     Generate all permutations of A.
  %    Take each permutation modulo B (element-wise).
   Ḅ   Convert all resulting arrays from binary to integer.
       This yields 0 iff the permutation is divisible by B.
    Ạ  All; yield 0 if the result contains a 0, 1 otherwise.

9

Лушпиння , 7 6 5 байт

Збережено 2 байти завдяки @Zgarb

▼▲‡¦P

Приймає аргументів у зворотному порядку і повертає 1за Trueі 0для False.

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

Пояснення

    P     -- Permutations of the first argument
  ‡       -- Deep zip (vectorises function) with second argument
   ¦      --   Does x divide y
 ▲        -- Get the maximum of that list, returns [1,1...1] if present
▼         -- Get the minimum of that list, will return 0 unless the list is all 1s

VΠMz¦Pмає працювати на 6 байт.
Згарб

Чи вважаються вони "двома різними значеннями"?
geokavel

Ой, і Mzможе бути .
Згарб

Я думаю, що вам потрібно ▼▲замість цього ▲▼. Гарна ідея в будь-якому випадку!
Згарб

5

05AB1E , 7 байт

Введення: приймає списки B і A (зворотний порядок)
Вихід: 1, коли вірно, 0 в іншому випадку

œvIyÖPM

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

Пояснення:

œvIyÖPM    Complete program
œ          Pushes all permutations of B as a list
 v         For each permutation
  I        Pushes last input on top of the stack
   yÖ      Computes a % b == 0 for each element of A and B
     P     Pushes the total product of the list
      M    Pushes the largest number on top of the stack

5

MATL , 8 7 6 байт

1 байт, використовуючи ідею з відповіді Дженніса «Желе»

Y@\!aA

Входи B, а потім A. Вихід - 0це ділене чи 1ні.

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

Пояснення

Y@     % Implicit input: row vector B. Matrix of all permutations, each on a row
\      % Implicit input: row vector A. Modulo, element-wise with broadcast. Gives
       % a matrix in which each row contains the moduli of each permutation of B
       % with respect to A
!a     % True for rows that contain at least a nonzero value
A      % True if all values are true. Implicit display

3

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

Cases[Permutations@#2,p_/;And@@IntegerQ/@(#/p)]!={}& 

дякую @ngenisis за 5 байт


2
Casesяк правило, коротше:Cases[Permutations@#2,p_/;And@@IntegerQ/@(#/p)]!={}&
ngenisis

3

JavaScript (ES6), 67 63 байт

Повертається булева.

f=([x,...a],b)=>!x||b.some((y,i)=>x%y?0:f(a,c=[...b],c[i]=1/0))

Тестові кейси



3

R + комбінат , 69 66 58 байт

-3 байти завдяки Ярко Дуббелдам

ще -8 байт завдяки Ярко

function(a,b)any(combinat::permn(b,function(x)all(!a%%x)))

як не дивно, R не має вбудованого для створення всіх перестановок. Повертається булева.

Крім того, з другим поліпшенням Ярко, anyпримушує список до вектора logicalз попередженням.

Спробуйте в Інтернеті! (r-скрипка)


1
Усі (x <1) довші за будь-які (! X), і ви повинні мати можливість замінити суму на будь-яку
JAD

@JarkoDubbeldam гарний дзвінок. Дякую.
Джузеппе

О, і ви можете пропустити список, так, за неявний примус.
JAD

@JarkoDubbeldam відмінна.
Джузеппе





1

CJam, 20 17 байт

:A;e!{A\.%:+!}#W>

Тестова версія

Функція, яка приймає масив B як перший аргумент, а масив A як другий аргумент. Зауважте, що в тестовій версії я перемикаю замовлення на A, потім B.


1

JavaScript (ES6), 100 байт

f=(a,b)=>!a[0]||a.some((c,i)=>b.some((d,j)=>c%d<1&f(e=[...a],d=[...b],e.splice(i,1),d.splice(j,1))))

Дещо неефективна; зайвий &пришвидшив би це.


1

PHP, 112 180 178 байт

Я думав занадто коротко.

function($a,$b){for($p=array_keys($b);++$i<count($b);){foreach($b as$k=>$x)$f|=$a[$k]%$x;if($f=!$f)return 1;$p[$i]?[$b[$j],$b[$i],$i]=[$b[$i],$b[$j=$i%2*--$p[$i]],0]:$p[$i]=$i;}}

анонімна функція займає два масиви, повернення для хибного NULLі 1для truthy.
Якщо помилка містить другий масив, видає помилку 0.

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


Друкує неправильний результат для $f([6,5],[3,5]).
nwellnhof

@nwellnhof виправлено. дякую за те, що помітили.
Тит

1

C (gcc) , 191 байт

#define F(v)for(i=0;i<v;++i){
#define X if(f(s,n,a,b))return 1
j;f(s,n,a,b,i)int*a,*b;{if(--n){F(n)X;j=i*(n%2);b[j]^=b[n];b[n]^=b[j];b[j]^=b[n];}X;}else{F(s)if(a[i]%b[i])return 0;}return 1;}}

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

Використання: f(int size, int size, int *a, int *b)

повертається, 1якщо ділиться, 0інакше. Дивіться приклад використання в TIO.

(Треба робити перестановки на важкому шляху в C, тому це навряд чи конкурентоспроможне)


1

Perl 6 , 38 байт

Насправді відповідь @ nwellnhof здається занадто читабельною, тому я поклав намір дотримуватись прекрасної традиції Perl щодо коду лише для запису :—).

1 байт збережено завдяки @nwellnhof.

{min max (@^a,) XZ%% @^b.permutations}

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

Що це робить: це анонімна функція, яка бере два аргументи списку. Коли ми говоримо @^a, ми маємо на увазі перше, коли @^b, це друге.

(@^a,)це список, що містить список @^a. @^b.permutations- це список усіх перестановок @^b. Оператор "XZ %%" робить усі можливі пари цього списку зліва та всі перестановки праворуч і використовує оператор "Z %%" на них, що є стандартною операцією "zip" за допомогою оператора розділення %%.

maxОператор дає найбільший елемент списку (в даному випадку це список , який має найбільш True«S в ньому). Потім ми зменшуємо його за допомогою логічного оператора AND, щоб перевірити, чи всі елементи цього "найбільш вірного" списку є істинними, і це результат. Це майже точна копія того, що написав @nwellnhof, просто використовуючи незрозумілих операторів для гоління байтів.


Кажуть permutations, це явно занадто читабельно;)
caird coinheringaahing

Ну, Perl 6 має дійсно потужну модель самоаналізу. Можливо, я міг би вивчити це, щоб затьмарити цей дзвінок? : D
Рамілья

Замініть [&&]на, minщоб зберегти інший байт.
nwellnhof

Ви можете видалити пробіли навколоXZ%%
Jo King

Бажаю, щоб щось {all (@^a,)Z%%@^b.permutations.any}було можливо
Jo King





0

Скала, 60 байт

Гольф:

a=>b=>b.permutations exists(a zip _ forall(p=>p._1%p._2==0))

Безголівки:

a=>b=>         // Function literal taking 2 lists of integers, a and b.
b.permutations // All permutations of b.
exists(        // Whether the given function is true for any element.
a zip _        // Zips a and the current permutation of b into a list of pairs.
forall(        // Whether the given function is true for all elements.
p=>            // Function literal taking a pair of integers.
p._1%p._2==0)) // If the remainder of integer division between the members of the pair is 0.

0

Japt , 12 11 байт

Виходи trueабо false.

Vá de@gY vX

Перевірте це


Пояснення

Неявне введення масивів U& V( A& B, відповідно)

Створити масив усіх перестановок V.

d

Перевірте, чи будь-який з елементів (підмасивів) повертає справжнє.

e@

Перевірте, чи повертається кожен елемент у поточному масиві підрядних значень true, коли він передається через наступну функцію, Xчи є поточним елементом та Yпоточним індексом.

gY

Отримайте елемент в Uіндексі Y.

vX

Перевірте, чи не ділиться на X.

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