Sind die Listen teilbar?

20

Inspiriert (mit der gestohlenen Erklärung) davon

Hintergrund

Angenommen, Sie haben zwei Listen A = [a_1, a_2, ..., a_n]und B = [b_1, b_2, ..., b_n]ganze Zahlen. Wir sagen, es Aist potentiell teilbar durch, Bwenn es eine Permutation gibt B, die es für alle a_iteilbar macht . Das Problem ist dann: Ist es möglich, neu zu ordnen (dh zu permutieren), so dass es für alle teilbar ist ? Zum Beispiel, wenn Sie habenb_iiBa_ib_ii

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

Dann wäre die Antwort True, wie Bneu geordnet werden kann zu sein , B = [3, 6, 4]und dann würden wir das haben a_1 / b_1 = 2, a_2 / b_2 = 2und a_3 / b_3 = 2, von denen alle ganze Zahlen sind, so Aist potentiell teilbar durch B.

Als ein Beispiel, das ausgegeben werden sollte False, könnten wir haben:

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

Der Grund dafür ist, Falsedass wir die Reihenfolge nicht ändern können, Bda 25 und 5 eingegeben Awurden, der einzige Teiler Bjedoch 5 wäre, sodass einer weggelassen würde.

Deine Aufgabe

Ihre Aufgabe ist es natürlich, festzustellen, ob zwei Listen (als Eingabe angegeben) möglicherweise teilbar sind. Sie können Eingaben auf jede akzeptierte Art und Weise vornehmen, wie dies auch bei Ausgaben der Fall ist.

Duplikate in den Listen sind möglich, und die einzigen Größenbeschränkungen für die Ganzzahlen sind Ihre Sprache. Alle Ganzzahlen in beiden Listen sind größer als 0 und beide Listen sind gleich groß.

Wie bei allen müssen die Ausgabewerte 2 verschiedene Werte sein, die wahr und falsch darstellen.

Dies ist ein also gewinnt der kürzeste Code!

Testfälle

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
Caird Coinheringaahing
quelle
3
@ Shaggy von der Frage: Beide Listen werden gleich groß sein
Caird Coinheringaahing
2
Warum ist der letzte Testfall undefiniert?
Dennis
1
@ Tennis eine der Listen hat eine 0 drin
Caird Coinheringaahing
1
Recht. (Nicht sicher, warum 0 durch alle ganzen Zahlen teilbar ist.) Müssen die beiden Ausgaben wahr und falsch sein oder nur konsistent sein?
Dennis
@ Tennis 1) es ist für den Fall, 0 ist in der zweiten Liste, um 0 Teilungsfehler zu vermeiden 2) nur konsistent
Caird Coinheringaahing

Antworten:

10

Gelee , 5 Bytes

Œ!%ḄẠ

Gibt 0 für True , 1 für False zurück .

Probieren Sie es online!

Wie es funktioniert

Œ!%ḄẠ  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
quelle
9

Schale , 7 6 5 Bytes

2 Bytes dank @Zgarb gespart

▼▲‡¦P

Nimmt Argumente in umgekehrter Reihenfolge und kehrt 1für Trueund 0für zurück False.

Probieren Sie es online!

Erläuterung

    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
quelle
VΠMz¦Psollte für 6 Bytes funktionieren.
Zgarb
Werden diese als "zwei unterschiedliche Werte" betrachtet?
Geokavel
Oh, und Mzkann sein .
Zgarb
Ich denke du brauchst ▼▲statt ▲▼. Gute Idee auf jeden Fall!
Zgarb
5

05AB1E , 7 Bytes

Eingabe: Nimmt die Listen B und A (umgekehrte Reihenfolge).
Ausgabe: 1, wenn wahr, 0, sonst

œvIyÖPM

Probieren Sie es online!

Erklärungen:

œ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
scottinet
quelle
5

MATL , 8 7 6 Bytes

1 Byte aus einer Idee von Dennis 'Jelly Antwort

Y@\!aA

Eingänge sind Bdann A. Die Ausgabe ist, 0ob teilbar oder 1nicht.

Probieren Sie es online!

Erläuterung

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
quelle
3

Mathematica, 52 Bytes

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

danke @ngenisis für -5 Bytes

J42161217
quelle
2
Casesist in der Regel kürzer:Cases[Permutations@#2,p_/;And@@IntegerQ/@(#/p)]!={}&
Genisis
3

JavaScript (ES6), 67,63 Byte

Gibt einen Booleschen Wert zurück.

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

Testfälle

Arnauld
quelle
3

Haskell , 79 74 68 62 61 Bytes

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

Probieren Sie es online!

1 Byte dank @nimi gespeichert

jferard
quelle
1
61 Bytes f a=any((<1).sum.zipWith rem a).permutations.
Nimi
3

R + kombiniert , 69 66 58 Bytes

-3 Bytes dank Jarko Dubbeldam

Weitere -8 Bytes dank Jarko

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

Seltsamerweise verfügt R nicht über eine integrierte Funktion zum Erzeugen aller Permutationen. Gibt einen Booleschen Wert zurück.

Mit der zweiten Verbesserung von anyJarko wird die Liste außerdem zu einem Vektor logicalmit einer Warnung gezwungen .

Probieren Sie es online! (R-Geige)

Giuseppe
quelle
1
Alle (x <1) ist länger als alle (! X) und Sie sollten in der Lage sein, die Summe durch alle zu ersetzen
JAD
@ JarkoDubbeldam guten Ruf. Danke dir.
Giuseppe
Oh, und Sie können Unlist weglassen, yay für impliziten Zwang.
JAD
@ JarkoDubbeldam ausgezeichnet.
Giuseppe
2

Mathematica, 42 Bytes

MemberQ[Permutations@#2,a_/;And@@(a∣#)]&
JungHwan min
quelle
1

Gelee , 7 Bytes

Œ!ọẠ€1e

Probieren Sie es online!

Faktorielle Komplexität in der Länge der Liste.

Undichte Nonne
quelle
Hat Jelly wirklich kein anyeingebautes? TIL
Caird Coinheringaahing
1

Pyth - 11 Bytes

sm!s%Vdvz.p

Test Suite .

Maltysen
quelle
Sie haben mich geschlagen: (((- wollte gerade etwas Ähnliches
posten
1

J, 27 Bytes

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

Probieren Sie es online!

Nimmt die erste Liste als linkes Argument und die zweite Liste als rechtes.

cole
quelle
1
21 Bytes(|"1~e.~0*[)i.@!@#A.]
Meilen
1

CJam, 20 17 Bytes

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

Testversion

Funktion, die Array B als erstes Argument und Array A als zweites Argument verwendet. Beachten Sie, dass ich in der Testversion die Reihenfolge auf A und dann auf B ändere.

Geokavel
quelle
1

JavaScript (ES6), 100 Byte

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

Etwas ineffizient; ein extra &würde es beschleunigen.

Neil
quelle
1

PHP 112 180 178 Bytes

Ich habe zu kurz gedacht.

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

Die anonyme Funktion verwendet zwei Arrays und kehrt NULLfür falsch und 1für wahr zurück.
Löst einen Fehler aus, wenn das zweite Array enthält 0.

Probieren Sie es online aus .

Titus
quelle
Druckt das falsche Ergebnis für $f([6,5],[3,5]).
Nwellnhof
@nwellnhof behoben. Danke fürs bemerken.
Titus
1

C (gcc) , 191 Bytes

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

Probieren Sie es online!

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

1Gibt zurück, wenn teilbar, 0ansonsten. Siehe Anwendungsbeispiel für TIO.

(Muss auf die harte Tour in C permutieren, das ist also kaum konkurrenzfähig)

Felix Palmen
quelle
1

Perl 6 , 38 Bytes

Eigentlich scheint die Antwort von @ nwellnhof zu gut lesbar zu sein, also habe ich mich daran gemacht, der feinen Perl-Tradition des Nur-Schreib-Codes zu folgen: -).

1 Byte gespeichert dank @nwellnhof.

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

Probieren Sie es online!

Was macht es: Es ist eine anonyme Funktion, die zwei Listenargumente akzeptiert. Wenn wir sagen @^a, meinen wir die erste, wenn @^bes die zweite ist.

(@^a,)ist eine Liste, die die Liste enthält @^a. @^b.permutationsist die Liste aller Permutationen von @^b. Der Operator "XZ %%" erstellt alle möglichen Paare dieser einen Liste auf der linken Seite und alle Permutationen auf der rechten Seite und verwendet den Operator "Z %%" für diese, der die standardmäßige "zip" -Operation unter Verwendung des Divisibilitätsoperators ist %%.

Der maxOperator gibt das größte Element der Liste an (in diesem Fall enthält die Liste die meisten Elemente True). Wir reduzieren es dann mit dem logischen AND-Operator, um zu sehen, ob alle Elemente dieser "wahrsten" Liste wahr sind, und das ist das Ergebnis. Es ist eine fast exakte Kopie dessen, was @nwellnhof geschrieben hat, und verwendet nur obskure Operatoren, um Bytes zu entfernen.

Ramillies
quelle
Es heißt permutations, es ist eindeutig viel zu lesbar;)
Caird Coinheringaahing
Nun, Perl 6 hat ein wirklich mächtiges Introspektionsmodell. Vielleicht könnte ich es studieren, um diesen Ruf zu verschleiern? : D
Ramillies
Ersetzen Sie [&&]durch min, um ein weiteres Byte zu speichern.
Nwellnhof
Sie können die Leerzeichen umXZ%%
Jo King
Ich wünschte, so etwas wäre {all (@^a,)Z%%@^b.permutations.any}möglich
Jo King
1

Brachylog , 6 Bytes

pᵐz%ᵛ0

Probieren Sie es online!

Das Prädikat ist erfolgreich, wenn die beiden Listen möglicherweise teilbar sind, und schlägt fehl, wenn dies nicht der Fall ist.

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.
Nicht verwandte Zeichenfolge
quelle
0

Python 2 , 92 Bytes

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

Probieren Sie es online!

Ihre grundlegende Implementierung.

Chas Brown
quelle
0

Python 2 , 90 Bytes

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

Probieren Sie es online!

ovs
quelle
0

Ruby , 56 Bytes

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

Probieren Sie es online!

Ziemlich einfach, nutzt die Tatsache aus, die permutationexistiert.

ymbirtt
quelle
0

Scala, 60 Bytes

Golf gespielt:

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

Ungolfed:

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
quelle
0

Japt , 12 11 Bytes

Ausgänge trueoder false.

Vá de@gY vX

Probier es aus


Erläuterung

Implizite Eingabe von Arrays U& V( A& B)

Generieren Sie ein Array aller Permutationen von V.

d

Überprüfen Sie, ob eines der Elemente (Sub-Arrays) true zurückgibt.

e@

Überprüfen Sie, ob jedes Element im aktuellen Unterarray true zurückgibt, wenn es die folgende Funktion durchläuft, wobei Xes sich um das aktuelle Element und Yden aktuellen Index handelt.

gY

Holen Sie sich das Element Ubei Index Y.

vX

Überprüfen Sie, ob es durch teilbar ist X.

Zottelig
quelle