Partai paritas modulo


15

Anda diberi array A dari n bilangan bulat yang benar-benar positif, dengan n ≥ 2 .

Tugas Anda adalah memetakan setiap entri A i ke:

  • 1 jika A j mod A i aneh untuk setiap j sedemikian sehingga 1 ≤ j ≤ n dan j ≠ i
  • 2 jika A j mod A i bahkan untuk setiap j sedemikian sehingga 1 ≤ j ≤ n dan j ≠ i
  • 0 sebaliknya (paritas campuran)

Contoh

Untuk A = [73, 50, 61] , kami memiliki:

  • 50 mod 73 = 50 , 61 mod 73 = 61 → tercampur
  • 73 mod 50 = 23 , 61 mod 50 = 11 → semuanya ganjil
  • 73 mod 61 = 12 , 50 mod 61 = 50 → semuanya genap

Oleh karena itu, output yang diharapkan adalah [0, 1, 2] .

Aturan

  • Anda dapat menggunakan tiga nilai berbeda (dari jenis apa pun) alih-alih 0 , 1 dan 2 selama mereka konsisten. Silakan tentukan pemetaan Anda jika Anda tidak menggunakan yang dijelaskan dalam tantangan.
  • Jika ada keraguan tentang itu, nol adalah genap .
  • Ini adalah , jadi jawaban tersingkat dalam byte menang!

Uji kasus

[ 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 ]


Apakah nilai-nilai output yang harus bilangan bulat atau akan [1], [0, 1]dan [1, 1]pekerjaan?
Dennis

@ Dennis Setiap nilai yang konsisten baik-baik saja. Jadi ya, itu akan berhasil!
Arnauld

Jawaban:


9

Python 2 , 68 67 66 byte

-1 byte terima kasih kepada Tn. Xcoder
-1 byte terima kasih kepada ovs

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

Cobalah online!

Kembali 1,0,2sebagai gantinya 0,1,2.


ganti (k<1)dengan 0**kuntuk -1 byte.
ov

4

Jelly , 9 byte

%þœ-€0Ḃ‘Ṭ

Mengembalikan [1, 1], [0, 1], [1] bukannya 0, 1, 2 .

Cobalah online!

Bagaimana itu bekerja

%þœ-€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.

Bisakah Anda mengganti ‘ṬUḄdengan Q€Ḅuntuk menyimpan byte?
Jonathan Allan

Sayangnya tidak. Q€dapat kembali [0, 1]atau [1, 0].
Dennis

Oh benar Saya pikir [1],, [1,1]dan [0,1]tiga nilai berbeda jadi %þœ-€0Ḃ‘Ṭharus dapat diterima untuk 9. EDIT - ah saya melihat Anda mengajukan pertanyaan yang tepat ini :)
Jonathan Allan

Alternatif 9 byte lainnya adalah¹-Ƥ%"%2‘Ṭ
miles

3

MATL , 12 byte

!G\o~tAws1=-

Kegunaan ini 0, -1, 1bukan 0,1 , 2masing-masing.

Cobalah online!Atau verifikasi semua kasus uji .

Penjelasan

!    % 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 byte

  • Terimakasih untuk Peter Cordes untuk perbaikan bug.
  • Disimpan empat dua puluh satu byte berkat Peter Cordes ; menyarankan untuk menggunakan pemetaan nilai output yang berbeda; [0 1 2] ~ [3 2 1].
  • Disimpan lima byte; menggunakan pemetaan lain;[0 1 2] ~ [  ].
  • Disimpan satu byte; bermain golf for(i=0;i<n;i++,putchar...untuk 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);}}

Cobalah online!


Fungsi tes Anda pada TIO tidak lulus cukup arg, dan perilaku tidak terdefinisi ini mengarah ke pembagian dengan nol (SIGFPE) dari case uji terakhir. f(I,7)menimpa elemen pertama I[]( A[]dalam f ()) dengan salah satu argumen yang Anda gunakan sebagai penduduk lokal. f()mengasumsikan bahwa arg diteruskan pada stack oleh penelepon, tetapi penelepon tidak tahu itu, dan apa yang sebenarnya ada di stack di atas alamat pengirim adalah A[0]. (mis. UB ini menyebabkan tdan A[0]memiliki alamat yang sama). Bagaimanapun, ini hanya UB dalam fungsi pengujian Anda di TIO.
Peter Cordes

Dan BTW, saya tidak bisa mem-repro crash secara lokal jadi saya harus menambahkan execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);main untuk mendapatkan asm dari TIO's gcc 7.2.1, yang tidak persis cocok dengan Arch Linux gcc 7.2.1 saya. Setelah mengubah pembongkaran itu kembali menjadi sumber asm untuk fungsi panggilan, saya dapat mem-repro secara lokal di dalam gdb dan mengkonfirmasi dengan tepat apa yang terjadi.
Peter Cordes

Anda dapat menyimpan byte menggunakan pemetaan yang berbeda, seperti 1 untuk genap, 2 untuk ganjil, 3 untuk campuran, sehingga Anda dapat o|=1<<(A[j]%A[i]%2)tanpa perlu decoding mewah untuk o.
Peter Cordes

@PeterCordes Terima kasih telah mencatat, meskipun saya masih tidak sepenuhnya mengerti mengapa entri array pertama ditimpa. Saya sekarang memilih untuk menggunakan variabel global daripada variabel lokal, menghapus perilaku yang tidak terdefinisi.
Jonathan Frech

@PeterCordes Saya juga mengambil saran bermain golf Anda dan berhasil menghemat empat byte. Namun, saya tidak tahu apakah ini benar-benar yang Anda sarankan, karena Anda menulis o|=1<<...alih-alih sesuatu di sepanjang baris o|=1<<(t=....
Jonathan Frech

3

Mathematica, 57 49 48 byte

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

Ini mengembalikan:

  • False.Trueuntuk 0 (campuran)
  • True.Trueuntuk 1 (semua ganjil)
  • False.Falseuntuk 2 (semuanya)

Cobalah online!

Berikut alternatif yang sedikit lebih panjang (49 byte):

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

Yang ini kembali:

  • 1untuk 0 (campuran)
  • -1untuk 1 (semua ganjil)
  • 0untuk 2 (semuanya)

Cobalah online!


2

Merah , 101 byte

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

Cobalah online!

Pengembalian 1 0untuk campuran, 1untuk ganjil dan 0genap

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 byte

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

Mengembalikan -1 (datar), 1 (tidak datar), dan 0 (bercampur).

Bagaimana itu bekerja:

Itu d akumulator akan:

  1. Nol jika semua moduli. ( !a[d+1]== false, !d== 1, false - 1== -1 )
  2. Satu kurang * dari panjang array jika semua moduli aneh. ( * Akumulator mencakup elemen yang dimodulasi terhadap dirinya sendiri, menghasilkan satu modulus genap.) ( !a[d+1]== true, !d== 0, true - 0== 1 )
  3. Dua atau lebih kurang dari panjang array jika dicampur. ( !a[d+1]== false, !d== 0, false - 0== 0 )

Kasus uji:


1

J , 27 20 byte

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

Cobalah online!

Menggunakan [1 0] [1] [0] bukan 0 1 2

Penjelasan:

|/~ - membuat tabel dengan sisa:

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

2|aneh atau genap? :

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

<@~.@}:@\:"1 - sortir, letakkan elemen terakhir (selalu nol), simpan elemen unik dan kotak setiap baris:

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

1
16 byte dengan 2/:~@:|"1]|1]\.]mengembalikan daftar pasangan.
mil

@ miles Terima kasih! Apakah output ini dapat diterima?
Galen Ivanov

Sebenarnya tidak, saya melewatkan bagian itu tentang nilai yang berbeda. Saya akan kembali ke sana sebentar lagi.
mil


1

Perl, 38 byte

Termasuk +3untuk-p

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

Output 1 untuk semua genap, 2 untuk semua ganjil, 3 untuk campuran


1

Bersih , 95 65 63 byte

import StdEnv

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

Cobalah online!

Sebagai lambda, mengambil [Int]dan kembali [Int], memetakan ke:

  • 0: Campuran
  • 1: semua genap
  • -1: semua aneh



1

Java 8, 91 89 byte

a->{for(int z:a){int s=1;for(int y:a)s+=y%z%2;System.out.print(" "+(s<a.length)+(s<2));}}
  • Menggunakan truetruebukan2 untuk genap
  • Menggunakan falsefalsebukan1 untuk ganjil
  • Menggunakan truefalsebukan 0untuk campuran

Penjelasan:

Cobalah online.

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 byte

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

Contoh lengkap dengan konversi keluaran:

(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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.