Listeler bölünebilir mi?


20

İlham (açıklama çalınan ile) , bu

Arka fon

İki listeniz A = [a_1, a_2, ..., a_n]ve B = [b_1, b_2, ..., b_n]tamsayılarınız olduğunu varsayalım. Biz demek Aolduğunu potansiyel-bölünebilir tarafından Bvarsa bir permütasyon Byapar a_ibölünebilir b_iherkes için i. O zaman sorun şudur: sipariülerde (yani permute) mümkündür B, böylece a_ibölünemeyen b_iherkes için i? Örneğin,

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

Sonra cevap olurdu Truegibi Bolmak için, yeniden düzenlenmesi olabilir B = [3, 6, 4]ve o zaman o olurdu a_1 / b_1 = 2, a_2 / b_2 = 2ve a_3 / b_3 = 2tamsayılar bunların tümü, bu nedenle, Atarafından potansiyel-bölünebilir B.

Çıktı vermesi gereken bir örnek olarak False:

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

Bunun nedeni , 25 ve 5'in olduğu gibi Falseyeniden sıralayamamamızdır , ancak içindeki tek bölen 5 olacaktır, bu yüzden biri dışarıda bırakılacaktır.BAB

Senin görevin

Sizin göreviniz, açıkça, iki listenin (girdi olarak verilir) potansiyel olarak bölünebilir olup olmadığını belirlemektir. Çıktıda olduğu gibi girdiyi kabul edilen herhangi bir şekilde alabilirsiniz.

Listelerdeki kopyalar bir olasılıktır ve tamsayılardaki tek boyut kısıtlamaları sizin dilinizdir. Her iki listedeki tüm tamsayılar 0'dan büyük olacak ve her iki liste de eşit boyutta olacaktır.

Tüm olduğu gibi , çıktı değerleri doğru ve yanlışı temsil eden 2 ayrı değer olmalıdır.

Bu bir kadar kısa kod kazanır!

Test senaryoları

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
@Sorggy sorudan: her iki liste eşit büyüklükte olacak
caird coinheringaahing

2
Son test durumu neden tanımlanmadı?
Dennis

1
@Dennis listelerden birinde 0 var
caird coinheringaahing

1
Sağ. ( 0'ın neden tüm tamsayılarla bölünebildiğinden emin değilim .) İki çıktının doğruluk ve sahtelik mi yoksa sadece tutarlı mı olması gerekir?
Dennis

@Dennis 1) 0 bölme hatalarını önlemek için 0'ın ikinci listede olması durumunda 2) sadece tutarlı
caird coinheringaahing 27:17

Yanıtlar:


10

Jöle , 5 bayt

Œ!%ḄẠ

True için 0 , False için 1 döndürür .

Çevrimiçi deneyin!

Nasıl çalışır

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

Kabuk , 7 6 5 bayt

@Zgarb sayesinde 2 bayt kaydedildi

▼▲‡¦P

Ters sırada Argents ve döner Alır 1için Trueve 0için False.

Çevrimiçi deneyin!

açıklama

    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¦P6 bayt için çalışmalıdır.
Zgarb

Bunlar "iki farklı değer" olarak mı kabul edilir?
geokavel

Oh, Mzolabilir .
Zgarb

Sanırım bunun ▼▲yerine ihtiyacın var ▲▼. Her durumda güzel fikir!
Zgarb

5

05AB1E , 7 bayt

Giriş: B ve A listelerini alır (ters sırada)
Çıkış: Doğru olduğunda 1, aksi takdirde 0

œvIyÖPM

Çevrimiçi deneyin!

açıklamalar:

œ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 bayt

Dennis 'Jelly cevabından bir fikir kullanarak 1 bayt kapalı

Y@\!aA

Girdiler Bo zaman A. Çıktı 0bölünebilirse ya 1da değilse.

Çevrimiçi deneyin!

açıklama

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

Mathematica, 52 bayt

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

-5 bayt için @ngenisis teşekkürler


2
Casesgenellikle daha kısa:Cases[Permutations@#2,p_/;And@@IntegerQ/@(#/p)]!={}&
ngenisis

3

JavaScript (ES6), 67 63 bayt

Bir boole döndürür.

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

Test senaryoları



3

R + kombinasyonu , 69 66 58 bayt

Jarko Dubbeldam sayesinde -3 bayt

Jarko sayesinde başka bir -8 bayt

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

garip bir şekilde, R'nin tüm permütasyonları üretmek için bir yerleşimi yoktur. Bir boole döndürür.

Ayrıca, Jarko'nun ikinci gelişmesiyle, anylisteyi bir vektörüne zorlar.logical bir uyarı ile bir .

Çevrimiçi deneyin! (R-keman)


1
Tümü (x <1) herhangi birinden (! X) daha uzundur ve toplamı herhangi biriyle değiştirebilmeniz gerekir
JAD

@JarkoDubbeldam iyi çağrı. teşekkür ederim.
Giuseppe

Oh, ve listeyi atlayabilirsiniz, örtük zorlama için yay
JAD

@JarkoDubbeldam mükemmel.
Giuseppe





1

CJam, 20 17 bayt

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

Test Sürümü

B dizisini birinci argüman olarak ve A dizisini ikinci argüman olarak alan işlev. Test sürümünde siparişi önce A sonra B'ye değiştirdiğime dikkat edin.


1

JavaScript (ES6), 100 bayt

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

Biraz verimsiz; bir ekstra &hızlandıracak.


1

PHP, 112 180 178 bayt

Çok kısa düşünüyordum.

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

anonim işlev iki diziyi alır, NULLfalsili ve 1doğruluk için döner.
İkinci dizi içeriyorsa bir hata atar 0.

Çevrimiçi deneyin .


İçin yanlış sonucu yazdırır $f([6,5],[3,5]).
nwellnhof

@nwellnhof düzeltildi. fark ettiğiniz için teşekkürler.
Titus

1

C (gcc) , 191 bayt

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

Çevrimiçi deneyin!

Kullanımı: f(int size, int size, int *a, int *b)

1bölünebilirse döner ,0 aksi takdirde. TIO'daki örnek kullanıma bakın.

(Permütasyonları C'de zor yoldan yapmalıyız, bu yüzden bu pek rekabetçi değil)


1

Perl 6 , 38 bayt

Aslında @ nwellnhof'un cevabı çok okunabilir gibi görünüyor, bu yüzden sadece Perl'in sadece yazma kod geleneğini takip etmeye başladım :—).

@Nwellnhof sayesinde 1 byte tasarruf edildi.

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

Çevrimiçi deneyin!

Ne işe yarar: İki liste bağımsız değişkeni alan anonim bir işlevdir. Dediğimiz @^azaman @^b, birincisini kastediyoruz, ne zaman , ikincisi.

(@^a,)listeyi içeren bir listedir @^a. @^b.permutationstüm permütasyonların listesidir@^b . "XZ %%" operatörü soldaki bir listenin tüm olası çiftlerini ve sağdaki tüm permütasyonları yapar ve üzerlerinde bölünebilirlik operatörü kullanan standart "zip" işlemi olan "Z %%" operatörünü kullanır %%.

maxOperatör listesinin en büyük elemanı (bu durumda, çoğu vardır listesi verir Trueo 's). Daha sonra bu "en doğru" listenin tüm öğelerinin doğru olup olmadığını görmek için mantıksal AND operatörünü kullanarak onu azaltırız ve sonuç budur. @Nwellnhof'un yazdıklarının neredeyse tam bir kopyası, sadece baytları tıraş etmek için belirsiz operatörler kullanıyor.


Diyor ki permutations, açıkça çok okunabilir;)
caird coinheringaahing

Perl 6'nın gerçekten güçlü bir içgörü modeli var. Belki de bu çağrıyı gizlemek için çalışabilirdim? : D
Ramillies

Başka bir bayt kaydetmek için [&&]ile değiştirin min.
nwellnhof

Etrafındaki boşlukları kaldırabilirsinXZ%%
Jo King

Keşke böyle bir şey {all (@^a,)Z%%@^b.permutations.any}mümkün olsaydı
Jo King

1

Brachylog , 6 bayt

pᵐz%ᵛ0

Çevrimiçi deneyin!

İki liste potansiyel olarak bölünebilirse başarılı olur ve değilse başarısız olur.

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.




0

Scala, 60 Bayt

golfed:

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.

0

Japt , 12 11 bayt

Çıkışlar trueveya false.

Vá de@gY vX

Dene


açıklama

Dizilerin örtülü olarak girilmesi U& V( A& B, sırasıyla)

Öğesinin tüm permütasyonlarından bir dizi oluşturun V.

d

Öğelerden herhangi birinin (alt diziler) doğru olup olmadığını kontrol edin.

e@

Geçerli alt dizideki her öğenin X, geçerli öğe ve Ygeçerli dizin olmak üzere aşağıdaki işlevden geçirildiğinde true döndürüp döndürmediğini kontrol edin .

gY

Öğeyi Udizine alın Y.

vX

Tarafından bölünebilir olup olmadığını kontrol edin X.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.