Apakah daftar dapat dibagi?

20

Terinspirasi (dengan penjelasan dicuri dari) ini

Latar Belakang

Katakanlah Anda memiliki dua daftar A = [a_1, a_2, ..., a_n]dan B = [b_1, b_2, ..., b_n]bilangan bulat. Kita mengatakan Aadalah berpotensi-habis dibagi oleh Bjika ada permutasi dari Byang membuat a_idibagi oleh b_isemua i. Masalahnya kemudian: apakah mungkin untuk memesan ulang (yaitu permutasi) Bsehingga a_idapat habis b_ibagi semua orang i? Misalnya, jika sudah

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

Maka jawabannya akan True, karena Bdapat mengatur kembali menjadi B = [3, 6, 4]dan kemudian kita akan memiliki yang a_1 / b_1 = 2, a_2 / b_2 = 2dan a_3 / b_3 = 2, yang semuanya bilangan bulat, sehingga Aberpotensi-habis dibagi B.

Sebagai contoh yang seharusnya ditampilkan False, kita dapat memiliki:

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

Alasannya Falseadalah karena kami tidak dapat memesan ulang Bkarena 25 dan 5 ada A, tetapi satu-satunya pembagi Badalah 5, jadi orang akan ditinggalkan.

Tugas Anda

Tugas Anda, tentu saja, untuk menentukan apakah dua daftar (diberikan sebagai input) berpotensi dibagi. Anda dapat mengambil input dengan cara apa pun yang diterima, seperti halnya dengan output.

Duplikat dalam daftar adalah suatu kemungkinan, dan satu-satunya batasan ukuran pada bilangan bulat adalah bahasa Anda. Semua bilangan bulat di kedua daftar akan lebih besar dari 0, dan kedua daftar akan berukuran sama.

Seperti halnya semua , nilai output harus 2 nilai berbeda yang mewakili benar dan salah.

Ini adalah sehingga kode terpendek menang!

Uji kasus

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
sumber
3
@Shaggy dari pertanyaan: kedua daftar memiliki ukuran yang sama
caird coinheringaahing
2
Mengapa test case terakhir tidak terdefinisi?
Dennis
1
@Dennis salah satu daftar memiliki 0 di dalamnya
caird coinheringaahing
1
Kanan. (Tidak yakin mengapa, 0 dapat dibagi oleh semua bilangan bulat.) Apakah kedua output harus benar dan salah, atau hanya konsisten?
Dennis
@ Dennis 1) itu dalam kasus 0 ada di daftar kedua, untuk menghindari 0 kesalahan divisi 2) hanya konsisten
caird coinheringaahing

Jawaban:

10

Jelly , 5 byte

Œ!%ḄẠ

Mengembalikan 0 untuk Benar , 1 untuk Salah .

Cobalah online!

Bagaimana itu bekerja

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

Sekam , 7 6 5 byte

Disimpan 2 byte berkat @Zgarb

▼▲‡¦P

Membawa argumen dalam urutan terbalik dan mengembalikan 1untuk Truedan 0untuk False.

Cobalah online!

Penjelasan

    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.Piz
sumber
VΠMz¦Pharus bekerja selama 6 byte.
Zgarb
Apakah itu dianggap "dua nilai berbeda"?
geokavel
Oh, dan Mzbisa jadi .
Zgarb
Saya pikir Anda perlu, ▼▲bukan ▲▼. Bagaimanapun ide yang bagus!
Zgarb
5

05AB1E , 7 byte

Input: mengambil daftar B dan A (urutan terbalik)
Output: 1 bila benar, 0 sebaliknya

œvIyÖPM

Cobalah online!

Penjelasan:

œ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
sumber
5

MATL , 8 7 6 byte

Off 1 byte menggunakan ide dari jawaban Dennis 'Jelly

Y@\!aA

Inputnya B, lalu A. Output adalah 0jika habis dibagi atau 1jika tidak.

Cobalah online!

Penjelasan

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

Mathematica, 52 byte

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

terima kasih @ngenisis untuk -5 byte

J42161217
sumber
2
Casesumumnya lebih pendek:Cases[Permutations@#2,p_/;And@@IntegerQ/@(#/p)]!={}&
ngenisis
3

JavaScript (ES6), 67 63 byte

Mengembalikan boolean.

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

Uji kasus

Arnauld
sumber
3

Haskell , 79 74 68 62 61 byte

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

Cobalah online!

Disimpan 1 byte berkat @nimi

jferard
sumber
1
61 byte: f a=any((<1).sum.zipWith rem a).permutations.
nimi
3

R + combinat , 69 66 58 byte

-3 byte berkat Jarko Dubbeldam

lain -8 byte terima kasih kepada Jarko

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

anehnya, R tidak memiliki builtin untuk menghasilkan semua permutasi. Mengembalikan boolean.

Selain itu, dengan peningkatan kedua anyJarko , memaksa daftar ke vektor logicaldengan peringatan.

Cobalah online! (r-biola)

Giuseppe
sumber
1
Semua (x <1) lebih panjang dari apa pun (! X) dan Anda harus dapat mengganti jumlah dengan apa pun
JAD
@JarkoDubbeldam panggilan bagus. Terima kasih.
Giuseppe
Oh, dan Anda dapat menghilangkan tidak terdaftar, ya untuk pemaksaan implisit.
JAD
@JarkoDubbeldam luar biasa.
Giuseppe
2

Mathematica, 42 byte

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

Jelly , 7 byte

Œ!ọẠ€1e

Cobalah online!

Kompleksitas faktorial dalam panjang daftar.

Biarawati Bocor
sumber
Apakah Jelly benar-benar tidak memiliki anybuiltin? TIL
caird coinheringaahing
1

Pyth - 11 byte

sm!s%Vdvz.p

Test Suite .

Maltysen
sumber
Anda mengalahkan saya untuk itu: (((- Baru saja akan memposting sesuatu yang serupa
Mr. Xcoder
1

J, 27 byte

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

Cobalah online!

Mengambil daftar pertama sebagai argumen kiri dan daftar kedua sebagai kanan.

cole
sumber
1
21 byte(|"1~e.~0*[)i.@!@#A.]
mil
1

CJam, 20 17 byte

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

Versi Uji

Fungsi yang menggunakan array B sebagai argumen pertama dan array A sebagai argumen kedua. Perhatikan bahwa dalam versi uji saya beralih urutan ke A lalu B.

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

Agak tidak efisien; tambahan &akan mempercepatnya.

Neil
sumber
1

PHP, 112 180 178 byte

Saya berpikir terlalu pendek.

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

fungsi anonim mengambil dua array, pengembalian NULLuntuk kepalsuan dan 1untuk kebenaran.
Melempar kesalahan jika array kedua berisi 0.

Cobalah online .

Titus
sumber
Mencetak hasil yang salah untuk $f([6,5],[3,5]).
nwellnhof
@nwellnhof diperbaiki. terima kasih telah memperhatikan.
Titus
1

C (gcc) , 191 byte

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

Cobalah online!

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

kembali 1jika dapat dibagi, 0jika tidak. Lihat contoh penggunaan pada TIO.

(Harus melakukan permutasi dengan cara yang sulit di C, jadi ini hampir tidak kompetitif)

Felix Palmen
sumber
1

Perl 6 , 38 byte

Sebenarnya jawaban @nwellnhof tampaknya terlalu banyak dibaca, jadi saya berangkat untuk mengikuti tradisi Perl yang bagus dari kode tulis saja :—).

1 byte disimpan berkat @nwellnhof.

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

Cobalah online!

Apa fungsinya: Ini adalah fungsi anonim yang mengambil dua argumen daftar. Ketika kita mengatakan @^a, yang kita maksud adalah yang pertama, kapan @^b, yang kedua.

(@^a,)adalah daftar yang berisi daftar @^a. @^b.permutationsadalah daftar semua permutasi dari @^b. Operator "XZ %%" memungkinkan semua pasangan yang memungkinkan dari satu daftar di sebelah kiri dan semua permutasi di sebelah kanan, dan menggunakan operator "Z %%" pada mereka, yang merupakan operasi "zip" standar menggunakan operator yang dapat dibagi. %%.

The maxOperator memberikan elemen terbesar dari daftar (dalam hal ini, itu daftar yang memiliki paling True's di dalamnya). Kami kemudian menguranginya menggunakan operator AND logis untuk melihat apakah semua elemen dari daftar "paling benar" itu benar, dan itulah hasilnya. Ini hampir persis salinan dari apa yang ditulis @nwellnhof, hanya menggunakan operator yang tidak jelas untuk memotong byte.

Ramillies
sumber
Dikatakan permutations, itu jelas terlalu mudah dibaca;)
caird coinheringaahing
Nah, Perl 6 memiliki model introspeksi yang sangat kuat. Mungkin saya bisa mempelajarinya untuk mengaburkan panggilan itu? : D
Ramillies
Ganti [&&]dengan minuntuk menyimpan byte lain.
nwellnhof
Anda dapat menghapus spasi di sekitarXZ%%
Jo King
Saya berharap sesuatu seperti {all (@^a,)Z%%@^b.permutations.any}mungkin
Jo King
1

Brachylog , 6 byte

pᵐz%ᵛ0

Cobalah online!

Predikat berhasil jika kedua daftar berpotensi habis dibagi dan gagal jika tidak.

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.
String yang tidak terkait
sumber
0

Python 2 , 92 byte

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

Cobalah online!

Implementasi dasar Anda.

Chas Brown
sumber
0

Python 2 , 90 byte

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

Cobalah online!

ovs
sumber
0

Ruby , 56 byte

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

Cobalah online!

Cukup mudah, mengeksploitasi fakta yang permutationada.

ymbirtt
sumber
0

Scala, 60 Bytes

Golf:

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

Tidak Terkumpul:

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

Japt , 12 11 byte

Output trueatau false.

Vá de@gY vX

Menguji


Penjelasan

Masukan implisit array U& V( A& B, masing-masing)

Hasilkan larik semua permutasi dari V.

d

Periksa apakah ada elemen (sub-array) yang mengembalikan true.

e@

Periksa apakah setiap elemen dalam sub-array saat ini mengembalikan true ketika melewati fungsi berikut, dengan Xmenjadi elemen saat ini dan Yindeks saat ini.

gY

Dapatkan elemen dalam Uindeks Y.

vX

Periksa apakah habis dibagi X.

Shaggy
sumber