Modulo Parite Partisi


15

Bir dizi verilir A ve n ile kesinlikle pozitif tamsayılar n ≥ 2 .

Göreviniz her bir A i girişini :

  • 1 , eğer bir j mod bir i her biri için tek bir j şekilde 1 ≤ j ≤ n ve j ≠ ı
  • 2 ise bir j mod bir i , hatta her biri için j şekilde 1 ≤ j ≤ n ve j ≠ ı
  • Aksi takdirde 0 (karışık pariteler)

Misal

İçin A = [73, 50, 61] , elimizdeki:

  • 50 mod 73 = 50 , 61 mod 73 = 61 → karışık
  • 73 mod 50 = 23 , 61 mod 50 = 11 → hepsi tek
  • 73 mod 61 = 12 , 50 mod 61 = 50 → hepsi eşit

Bu nedenle, beklenen çıktı [0, 1, 2] 'dir .

kurallar

  • Tutarlı oldukları sürece 0 , 1 ve 2 yerine üç farklı değer (herhangi bir türde) kullanabilirsiniz . Meydan okumada açıklanan haritayı kullanmıyorsanız lütfen eşlemenizi belirtin .
  • Bununla ilgili herhangi bir şüphe varsa, sıfır eşittir .
  • Bu , bu yüzden bayt en kısa cevap kazanır!

Test senaryoları

[ 1, 2 ] --> [ 2, 1 ]
[ 3, 4 ] --> [ 1, 1 ]
[ 1, 2, 3 ] --> [ 2, 1, 0 ]
[ 4, 4, 4 ] --> [ 2, 2, 2 ]
[ 73, 50, 61 ] --> [ 0, 1, 2 ]
[ 941, 459, 533 ] --> [ 1, 0, 0 ]
[ 817, 19, 928, 177 ] --> [ 1, 2, 1, 1 ]
[ 312, 463, 336, 729, 513 ] --> [ 0, 2, 0, 0, 0 ]
[ 53, 47, 33, 87, 81, 3, 17 ] --> [ 0, 0, 0, 1, 0, 2, 0 ]


Çıkış değerleri tamsayı olmak zorunda ya olur musunuz [1], [0, 1]ve [1, 1]nasıl çalışır?
Dennis

@Dennis Tutarlı değerler iyidir. Yani evet, bu işe yarar!
Arnauld

Yanıtlar:


9

Python 2 , 68 67 66 bayt

Bay Xcoder sayesinde -1 byte ovs
sayesinde -1 bayt

x=input()
for j in x:k=sum(i%j%2for i in x);print(k<len(x)-1)+0**k

Çevrimiçi deneyin!

İade 1,0,2yerine 0,1,2.


-1 bayt (k<1)ile değiştirin 0**k.
ovs

4

Jöle , 9 bayt

%þœ-€0Ḃ‘Ṭ

0, 1, 2 yerine [1, 1], [0, 1], [1] değerini döndürür .

Çevrimiçi deneyin!

Nasıl çalışır

%þœ-€0Ḃ‘Ṭ  Main link. Argument: A (array)

%þ           Build the modulus table.
  œ-€0       Remove one 0 from each list of moduli.
      Ḃ      Take the last bit of each.
       ‘     Increment, mapping 0 and 1 to 1 and 2.
        Ṭ    Untruth; map each array to an aray of 1's at the specified indices.
             This yields:
                 [1] if the array contains only 1's (all even).
                 [0, 1] if the array contains only 2's (all odd).
                 [1, 1] if the array contains 1's and 2's.

Bir bayt kaydetmek için ‘ṬUḄile değiştirebilir misiniz Q€Ḅ?
Jonathan Allan

Üzgünüm hayır. Q€dönebilir [0, 1]veya [1, 0].
Dennis

Ah, doğru. Sanırım [1], [1,1]ve [0,1]üç farklı değer bu yüzden %þœ-€0Ḃ‘Ṭ9 için kabul edilebilir olmalı. EDIT - ah bu kesin soruyu sorduğunuzu görüyorum :)
Jonathan Allan

Başka bir 9 bayt alternatifi¹-Ƥ%"%2‘Ṭ
mil

3

MATL , 12 bayt

!G\o~tAws1=-

Bu kullanımlar 0, -1, 1yerine 0, 1, 2sırasıyla.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

!    % Implicit input: row vector. Transpose into a column
G    % Push input again
\    % Modulus, element-wise with broadcast. Gives a square matrix
o    % Parity: gives 1 for odd, 0 for even
~    % Logical negate: 0 for odd, 1 for even
t    % Duplicate
A    % All: gives 1 for columns that contain only 1
w    % Swap
s    % Sum of each column
1    % Push 1
=    % Is equal? Gives 1 if the column sum was 1, 0 otherwise
-    % Subtract, element-wise. Implicit display

3

C (GCC) , 118 114 97 92 91 bayt

  • Peter Cordes'a hata düzeltme için teşekkürler .
  • Kaydedilen dört yirmi bir sayesinde bayt Peter Cordes ; farklı bir çıkış değeri eşlemesi kullanılmasını önermek; [0 1 2] ~ [3 2 1].
  • Beş bayt kurtardı; yine başka bir harita kullanmak; [0 1 2] ~ [  ].
  • Bir bayt kaydedildi; golfed for(i=0;i<n;i++,putchar...için for(i=~0;++i<n;putchar....
i,j,r;f(A,n)int*A;{for(i=~0;++i<n;putchar(r)){for(j=r=0;j<n;j++)j-i&&(r|=1<<A[j]%A[i]%2);}}

Çevrimiçi deneyin!


TIO'daki test işlevleriniz yeterli sayıda bağımsız değişkeni geçmez ve bu tanımlanmamış davranış, son test senaryosundan sıfıra bölünmeye (SIGFPE) yol açar. ( f () f(I,7)öğesinin ilk öğesinin, yerel olarak kullandığınız bağımsız değişkenlerden biriyle üzerine yazar . arg öğesinin arayan tarafından yığına geçtiğini varsayar, ancak arayan bunu bilmiyordu ve aslında dönüş adresinin üstündeki yığında ne olduğunu . (yani bu UB neden ve aynı adresine sahip). Her neyse, bu sadece TIO'daki test fonksiyonunuzdaki UB . I[]A[]f()A[0]tA[0]
Peter Cordes

Ve BTW, kazayı yerel olarak yeniden üretemedim, bu yüzden execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);Arch Linux gcc 7.2.1 ile tam olarak eşleşmeyen TIO gcc 7.2.1'den asm almak için main'e eklemek zorunda kaldım . Bu demontajı çağıran fonksiyon için asm kaynağına geri döndürdükten sonra, gdb içinde yerel olarak çoğaltabilir ve tam olarak ne olduğunu doğrulayabilirim.
Peter Cordes

Baytları, 1 için çift, 2 için tek, 3 için karışık gibi farklı bir eşleme kullanarak kaydedebilirsiniz, böylece o|=1<<(A[j]%A[i]%2)herhangi bir fantezi kod çözmeye gerek kalmadan yapabilirsiniz o.
Peter Cordes

@PeterCordes İlk dizi girdisinin neden üzerine yazıldığını hala tam olarak anlayamasam da dikkatinizi çektiğiniz için teşekkür ederiz. Şimdi tanımlanmamış davranışı kaldırarak yerel değişkenler yerine global değişkenler kullanmayı seçtim.
Jonathan Frech

@PeterCordes Golf önerinizi de aldım ve dört bayt kaydetmeyi başardım. Bununla o|=1<<...birlikte, satırlarında bir şey yerine yazdığınız gibi, bu gerçekten önerdiğiniz şey olup olmadığını bilmiyorum o|=1<<(t=....
Jonathan Frech

3

Mathematica, 57 49 48 bayt

(s=#;And@@#.Or@@#&@OddQ@Rest@Sort[s~Mod~#]&)/@#&

Bu döndürür:

  • False.Trueiçin 0 (karışık)
  • True.Trueiçin 1 (tüm tek)
  • False.Falseiçin 2 (tüm çift)

Çevrimiçi deneyin!

İşte biraz daha uzun bir alternatif (49 bayt):

Sign[(s=#;Tr@Mod[s~Mod~#,2]&)/@#/.Tr[1^#]-1->-1]&

Bu döndürür:

  • 1için 0 (karışık)
  • -1için 1 (tüm tek)
  • 0için 2 (tüm çift)

Çevrimiçi deneyin!


2

Kırmızı , 101 bayt

g: func[b][foreach n b[a: copy[]foreach m b[append a m % n % 2]sort a a: copy next a print unique a]]

Çevrimiçi deneyin!

İade 1 0karışık için, 1tek ve 0çift için

g: func[b] [
    foreach n b [
        a: copy []
        foreach m b [
            append a m % n % 2
        ]
        sort a
        a: copy next a
        print unique a
    ]
]

2

JavaScript (ES6), 46 bayt

a=>a.map(A=>a.map(B=>d+=B%A%2,d=0)|!a[d+1]-!d)

-1 (çift), 1 (tek) ve 0 (karışık) değerini döndürür.

Nasıl çalışır:

dAkümülatör olacak:

  1. Sıfır bile tüm modülleri. ( !a[d+1]== yanlış, !d== 1, false - 1== -1 )
  2. Tüm garip modüller ise dizinin uzunluğundan bir daha az * . ( * Akümülatör, kendisine karşı modüle edilmiş ve hatta tek bir modülle sonuçlanan bir eleman içerir .) ( !a[d+1]== true, !d== 0, true - 0== 1 )
  3. Bir karışım ise dizinin uzunluğundan iki veya daha az. ( !a[d+1]== yanlış, !d== 0, false - 0== 0 )

Test senaryoları:


1

J , 27 20 bayt

[:<@~.@}:@\:"1~2||/~

Çevrimiçi deneyin!

0 1 2 yerine [1 0] [1] [0] kullanır

Açıklama:

|/~ - kalanlar içeren bir tablo yapar:

  |/~ 73 50 61 
 0 50 61
23  0 11
12 50  0

2|tek veya çift? :

   2||/~ 73 50 61 
0 0 1
1 0 1
0 0 0

<@~.@}:@\:"1 - sırala, son elemanı bırak (her zaman sıfır), benzersiz öğeleri sakla ve her satırı kutla:

   <@~.@}:@\:"1~2||/~ 73 50 61 
┌───┬─┬─┐
│1 0│1│0│
└───┴─┴─┘

1
2/:~@:|"1]|1]\.]Bir çift listesi döndürerek 16 bayt .
mil

@ miles Teşekkürler! Bu çıktı kabul edilebilir mi?
Galen Ivanov

Aslında hayır, farklı değerler hakkında o kısmı kaçırdım. Birazdan geri döneceğim.
mil


1

Perl, 38 bayt

içerir +3için-p

#!/usr/bin/perl -p
s/\d+/$@|=$_%$&%2+1for<$`$'>;$@/gee

Çıkışlar 1 çift için, 2 tek için 2, 3 karışık için


1

Temiz , 95 65 63 bayt

import StdEnv

\l=[sum(removeDup[-1^(j rem i)\\j<-l|j<>i])\\i<-l]

Çevrimiçi deneyin!

Bir lambda olarak, alıp [Int]geri dönerek [Int], aşağıdakileri eşleme:

  • 0: karışık
  • 1: hepsi bile
  • -1: tuhaf



1

Java 8, 91 89 bayt

a->{for(int z:a){int s=1;for(int y:a)s+=y%z%2;System.out.print(" "+(s<a.length)+(s<2));}}
  • Kullanma truetrueyerine 2bile için
  • Kullanma falsefalseyerine1 garip için
  • Karışık truefalseyerine kullanmak0

Açıklama:

Çevrimiçi deneyin.

a->{                      // Method with integer-array parameter and no return-type
  for(int z:a){           //  Loop over the array
    int s=1;              //   Sum-integer, starting at 1
    for(int y:a)          //   Inner loop over the array again
      s+=y%z%2;           //    Increase the sum by `y` modulo-`z` modulo-2
    System.out.print(" "  //   Print a space
      +(s<a.length)       //    + "true" if the sum is smaller than the length of the array
                          //      (this means there is at least one even)
      +(s<2));}}          //    + "true" if the sum is still 1
                          //      (this means all are even)

0

Clojure, 82 bayt

#(for[R[(range(count %))]i R](set(for[j R :when(not= i j)](odd?(mod(% j)(% i))))))

Çıktı dönüşümü ile eksiksiz bir örnek:

(def f #(for[R[(range(count %))]i R](set(for[j R :when(not= i j)](odd?(mod(% j)(% i)))))))
(->> [ 53, 47, 33, 87, 81, 3, 17] f
     (map {#{true} 1, #{false} 2, #{true false} 0}))
; (0 0 0 1 0 2 0)
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.