Czy listy są podzielne?

20

Zainspirowany (z wyjaśnieniem skradzione) to

tło

Załóżmy, że masz dwie listy A = [a_1, a_2, ..., a_n]i B = [b_1, b_2, ..., b_n]liczby całkowite. Mówimy, że Ajest potencjalnie podzielna przez, Bjeśli istnieje permutacja, Bktóra czyni a_ipodzielną przez b_iwszystkich i. Problem polega zatem na tym: czy można zmienić kolejność (tj. Permutację), Baby wszyscy mogli ją a_ipodzielić ? Na przykład jeśli maszb_ii

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

Wtedy będzie odpowiedź True, jak Bmożna być zreorganizowane B = [3, 6, 4]i wtedy mamy, że a_1 / b_1 = 2, a_2 / b_2 = 2i a_3 / b_3 = 2, z których wszystkie są liczbami całkowitymi, więc Ajest potencjalnie podzielna przez B.

Jako przykład, który powinien wypisać False, możemy mieć:

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

Powodem jest Falseto, że nie możemy zmienić kolejności, Bponieważ 25 i 5 są w Aśrodku, ale jedynym dzielnikiem Bbędzie 5, więc jeden zostanie pominięty.

Twoje zadanie

Twoim zadaniem jest oczywiście ustalenie, czy dwie listy (podane jako dane wejściowe) są potencjalnie podzielne. Możesz przyjmować dane wejściowe w dowolny zaakceptowany sposób, tak jak w przypadku danych wyjściowych.

Możliwe są duplikaty na listach, a jedynym ograniczeniem wielkości liczb całkowitych jest Twój język. Wszystkie liczby całkowite na obu listach będą większe niż 0, a obie listy będą jednakowego rozmiaru.

Podobnie jak w przypadku wszystkich wartości wyjściowe muszą być 2 odrębnymi wartościami, które reprezentują prawda i fałsz.

To jest więc wygrywa najkrótszy kod!

Przypadki testowe

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
Cairney Coheringaahing
źródło
3
@Shaggy z pytania: obie listy będą jednakowej wielkości
Cairney Coherheringaahing
2
Dlaczego ostatni przypadek testowy jest niezdefiniowany?
Dennis
1
@Dennis na jednej z list znajduje się 0
caird coinheringaahing
1
Dobrze. (Nie jestem pewien, dlaczego 0 jest podzielne przez wszystkie liczby całkowite.) Czy dwa wyjścia muszą być prawdziwe i fałszywe, czy tylko spójne?
Dennis
@Dennis 1) to na wypadek, gdyby 0 znalazło się na drugiej liście, aby uniknąć 0 błędów podziału 2) po prostu spójne
Cairn coinheringaahing

Odpowiedzi:

10

Galaretka , 5 bajtów

Œ!%ḄẠ

Zwraca 0 dla wartości True , 1 dla wartości False .

Wypróbuj online!

Jak to działa

Œ!%ḄẠ  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.
Dennis
źródło
9

Łuska , 7 6 5 bajtów

Zaoszczędź 2 bajty dzięki @Zgarb

▼▲‡¦P

Bierze argenty w odwrotnej kolejności i zwraca 1za Truei 0za False.

Wypróbuj online!

Wyjaśnienie

    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
H.PWiz
źródło
VΠMz¦Ppowinien działać przez 6 bajtów.
Zgarb
Czy uważa się je za „dwie odrębne wartości”?
geokavel
Och, i Mzmoże być .
Zgarb
Myślę, że potrzebujesz ▼▲zamiast ▲▼. W każdym razie fajny pomysł!
Zgarb
5

05AB1E , 7 bajtów

Dane wejściowe: pobiera listy B i A (w odwrotnej kolejności) Dane
wyjściowe: 1, gdy jest prawdziwe, 0 w przeciwnym razie

œvIyÖPM

Wypróbuj online!

Objaśnienia:

œ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
szkocki
źródło
5

MATL , 8 7 6 bajtów

1 bajt off przy użyciu pomysłu z odpowiedzi Jelnisa ​​Jelly

Y@\!aA

Dane wejściowe są Bzatem A. Dane wyjściowe są 0podzielne lub 1nie.

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
3

Mathematica, 52 bajty

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

dzięki @ngenisis za -5 bajtów

J42161217
źródło
2
Casesjest ogólnie krótszy:Cases[Permutations@#2,p_/;And@@IntegerQ/@(#/p)]!={}&
ngenisis
3

JavaScript (ES6), 67 63 bajtów

Zwraca wartość logiczną.

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

Przypadki testowe

Arnauld
źródło
3

Haskell , 79 74 68 62 61 bajtów

import Data.List
f a=any((<1).sum.zipWith rem a).permutations

Wypróbuj online!

Zapisano 1 bajt dzięki @nimi

Jferard
źródło
1
61 bajtów: f a=any((<1).sum.zipWith rem a).permutations.
nimi
3

Kombinacja R + , 69 66 58 bajtów

-3 bajty dzięki Jarko Dubbeldam

kolejne -8 bajtów dzięki Jarko

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

co dziwne, R nie ma wbudowanego do generowania wszystkich permutacji. Zwraca wartość logiczną.

Dodatkowo, dzięki drugiej poprawce Jarko, anyprzymusza listę do wektora logicalz ostrzeżeniem.

Wypróbuj online! (skrzypce r)

Giuseppe
źródło
1
Wszystko (x <1) jest dłuższe niż jakikolwiek (! X) i powinieneś być w stanie zastąpić sumę dowolnym
JAD
@JarkoDubbeldam dobre połączenie. Dziękuję Ci.
Giuseppe,
Och, i możesz pominąć nieprzypisanie, tak dla domniemanego przymusu.
JAD
@JarkoDubbeldam doskonała.
Giuseppe
2

Mathematica, 42 bajty

MemberQ[Permutations@#2,a_/;And@@(a∣#)]&
JungHwan Min
źródło
1

Galaretka , 7 bajtów

Œ!ọẠ€1e

Wypróbuj online!

Złożoność czynnikowa długości listy.

Leaky Nun
źródło
Czy Jelly naprawdę nie ma anywbudowanego? TIL
caird coinheringaahing
1

Pyth - 11 bajtów

sm!s%Vdvz.p

Pakiet testowy .

Maltysen
źródło
Pobiłeś mnie do tego: (((- Właśnie
miałem
1

J, 27 bajtów

0=[:*/(A.~i.@!@#)@]+/@:|"1[

Wypróbuj online!

Pobiera pierwszą listę jako lewy argument, a drugą listę jako prawą.

kapusta
źródło
1
21 bajtów(|"1~e.~0*[)i.@!@#A.]
mile
1

CJam, 20 17 bajtów

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

Wersja testowa

Funkcja, która przyjmuje tablicę B jako pierwszy argument, a tablicę A jako drugi argument. Zauważ, że w wersji testowej zmieniam kolejność na A, a następnie B.

geokavel
źródło
1

JavaScript (ES6), 100 bajtów

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))))

Nieco nieefektywne; dodatkowy &przyspieszyłby to.

Neil
źródło
1

PHP, 112 180 178 bajtów

Myślałem zbyt krótko.

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;}}

funkcja anonimowa przyjmuje dwie tablice, zwraca NULLza fałsz i 1za prawdę.
Zgłasza błąd, jeśli druga tablica zawiera0 .

Wypróbuj online .

Tytus
źródło
Drukuje zły wynik dla $f([6,5],[3,5]).
nwellnhof
@nwellnhof naprawiony. dzięki za zauważenie.
Tytus
1

C (gcc) , 191 bajtów

#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;}}

Wypróbuj online!

Stosowanie: f(int size, int size, int *a, int *b)

zwraca, 1jeśli podzielne, w 0przeciwnym razie. Zobacz przykładowe użycie w TIO.

(Muszę robić permutacje w sposób trudny w C, więc nie jest to konkurencyjne)

Felix Palmen
źródło
1

Perl 6 , 38 bajtów

Właściwie odpowiedź @ nwellnhof wydaje się zbyt czytelna, dlatego postanowiłem podążać za dobrą tradycją Perla polegającą na pisaniu kodu :—).

1 bajt zapisany dzięki @nwellnhof.

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

Wypróbuj online!

Co robi: Jest to anonimowa funkcja, która pobiera dwa argumenty z listy. Kiedy mówimy @^a, mamy na myśli pierwszy, kiedy@^b to drugi.

(@^a,)to lista zawierająca listę @^a. @^b.permutationsjest listą wszystkich permutacji @^b. Operator „XZ %%” tworzy wszystkie możliwe pary tej jednej listy po lewej stronie i wszystkie permutacje po prawej stronie oraz używa operatora „Z %%” na nich, który jest standardową operacją „zip” przy użyciu operatora podzielności %%.

maxOperator daje największy element listy (w tym przypadku jest to lista, która ma większość Truew niej jest). Następnie redukujemy go za pomocą logicznego operatora AND, aby sprawdzić, czy wszystkie elementy tej „najbardziej prawdziwej” listy są prawdziwe, i to jest wynik. To prawie dokładna kopia tego, co napisał @nwellnhof, po prostu używając niejasnych operatorów, aby zgolić bajty.

Ramillies
źródło
Mówi permutations, że jest zdecydowanie zbyt czytelny;)
Cairn coinheringaahing
Cóż, Perl 6 ma naprawdę potężny model introspekcji. Może mógłbym to przestudiować, aby ukryć to połączenie? : D
Ramillies
Wymień [&&]się minzapisać kolejny bajt.
nwellnhof
Możesz usunąć spacje wokółXZ%%
Jo King
Chciałbym, żeby coś takiego {all (@^a,)Z%%@^b.permutations.any}było możliwe
Jo King
1

Brachylog , 6 bajtów

pᵐz%ᵛ0

Wypróbuj online!

Predykat się powiedzie, jeśli dwie listy są potencjalnie podzielne, a jeśli nie, to nie powiedzie się.

pᵐ        For some pair of permutations of the two input lists,
  z       for each pair of corresponding elements
   %ᵛ0    the first mod the second is always zero.
Niepowiązany ciąg
źródło
0

Python 2 , 92 bajty

lambda a,b:any(all(x%y<1for x,y in zip(a,p))for p in permutations(b))
from itertools import*

Wypróbuj online!

Twoja podstawowa implementacja.

Chas Brown
źródło
0

Python 2 , 90 bajtów

lambda a,b:any(sum(map(int.__mod__,a,p))<1for p in permutations(b))
from itertools import*

Wypróbuj online!

ovs
źródło
0

Rubinowy , 56 bajtów

->x,y{x.permutation.any?{|p|p.zip(y).all?{|a,b|a%b==0}}}

Wypróbuj online!

Dość proste, wykorzystuje fakt, który permutationistnieje.

ymbirtt
źródło
0

Scala, 60 bajtów

Gra w golfa:

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

Nie golfowany:

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.
Llew Vallis
źródło
0

Japt , 12 11 bajtów

Wyjścia truelub false.

Vá de@gY vX

Sprawdź to


Wyjaśnienie

Niejawny wejście matryc Ui V( Ai B, odpowiednio)

Wygeneruj tablicę wszystkich permutacji V.

d

Sprawdź, czy którykolwiek z elementów (pod-tablic) zwraca wartość true.

e@

Sprawdź, czy każdy element w bieżącej pod-macierzy zwraca wartość true po przejściu przez następującą funkcję, Xbędąc bieżącym elementem i Ybieżącym indeksem.

gY

Pobierz element w Uindeksie Y.

vX

Sprawdź, czy można go podzielić X.

Kudłaty
źródło