Bữa tiệc chẵn lẻ modulo


15

Bạn được cung cấp một mảng A gồm n số nguyên dương, với n ≥ 2 .

Nhiệm vụ của bạn là ánh xạ từng mục A i tới:

  • 1 nếu A j mod A i là số lẻ cho mỗi j sao cho 1 ≤ j nj i
  • 2 nếu A j mod A i chẵn cho mỗi j sao cho 1 ≤ j nj i
  • 0 khác (tương đương hỗn hợp)

Thí dụ

Với A = [73, 50, 61] , chúng ta có:

  • 50 mod 73 = 50 , 61 mod 73 = 61 → hỗn hợp
  • 73 mod 50 = 23 , 61 mod 50 = 11 → tất cả lẻ
  • 73 mod 61 = 12 , 50 mod 61 = 50 → tất cả chẵn

Do đó, đầu ra dự kiến ​​là [0, 1, 2] .

Quy tắc

  • Bạn có thể sử dụng bất kỳ ba giá trị riêng biệt nào (thuộc bất kỳ loại nào) thay vì 0 , 12 miễn là chúng nhất quán. Vui lòng chỉ định ánh xạ của bạn nếu bạn không sử dụng bản đồ được mô tả trong thử thách.
  • Nếu có bất kỳ nghi ngờ gì về điều đó, số không là chẵn .
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!

Các trường hợp thử nghiệm

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


Đừng các giá trị đầu ra phải là số nguyên hoặc sẽ [1], [0, 1][1, 1]công việc?
Dennis

@Dennis Bất kỳ giá trị phù hợp là tốt. Vì vậy, có, điều đó sẽ làm việc!
Arnauld

Câu trả lời:



4

Thạch , 9 byte

%þœ-€0Ḃ‘Ṭ

Trả về [1, 1], [0, 1], [1] thay vì 0, 1, 2 .

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Bạn có thể thay thế ‘ṬUḄbằng Q€Ḅđể tiết kiệm một byte?
Jonathan Allan

Thật đáng buồn không. Q€có thể trở lại [0, 1]hoặc [1, 0].
Dennis

Ô đúng rồi. Tôi nghĩ [1], [1,1][0,1]là ba giá trị riêng biệt %þœ-€0Ḃ‘Ṭnên được chấp nhận cho 9. EDIT - ah Tôi thấy bạn đã hỏi câu hỏi chính xác này :)
Jonathan Allan

Một thay thế 9 byte là¹-Ƥ%"%2‘Ṭ
dặm

3

MATL , 12 byte

!G\o~tAws1=-

Sử dụng này 0, -1, 1thay vì 0, 1, 2tương ứng.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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

  • Cảm ơn Peter Cordes đã sửa lỗi.
  • Đã lưu bốn bốn mươi mốt byte nhờ Peter Cordes ; đề nghị sử dụng ánh xạ giá trị đầu ra khác nhau; [0 1 2] ~ [3 2 1].
  • Đã lưu năm byte; sử dụng một ánh xạ khác; [0 1 2] ~ [  ].
  • Đã lưu một byte; golfed for(i=0;i<n;i++,putchar...tới 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);}}

Hãy thử trực tuyến!


Các chức năng kiểm tra của bạn trên TIO không vượt qua đủ các đối số và hành vi không xác định này dẫn đến việc chia cho số không (SIGFPE) từ trường hợp kiểm tra cuối cùng. f(I,7)ghi đè phần tử đầu tiên của I[]( A[]trong f ()) bằng một trong các đối số mà bạn đang sử dụng làm địa phương. f()giả định rằng arg đã được người gọi chuyển qua ngăn xếp, nhưng người gọi không biết điều đó, và những gì thực sự trên ngăn xếp phía trên địa chỉ trả lại là A[0]. (tức là UB này gây ra tA[0]có cùng địa chỉ). Dù sao, đây chỉ là UB trong chức năng thử nghiệm của bạn trên TIO.
Peter Cordes

Và BTW, tôi không thể khắc phục sự cố cục bộ nên tôi phải thêm execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);vào main để lấy mã asm từ gcc 7.2.1 của TIO, không khớp chính xác với Arch Linux gcc 7.2.1 của tôi. Sau khi biến sự phân tách đó trở lại thành nguồn asm cho chức năng gọi, tôi có thể repro nó cục bộ bên trong gdb và xác nhận chính xác những gì đang xảy ra.
Peter Cordes

Bạn có thể lưu byte bằng cách sử dụng ánh xạ khác nhau, như 1 cho chẵn, 2 cho lẻ, 3 cho hỗn hợp, do đó bạn có thể o|=1<<(A[j]%A[i]%2)không cần bất kỳ giải mã ưa thích nào o.
Peter Cordes

@PeterCordes Cảm ơn bạn đã lưu ý, mặc dù tôi vẫn không hiểu đầy đủ lý do tại sao mục nhập mảng đầu tiên bị ghi đè. Bây giờ tôi đã chọn sử dụng các biến toàn cục thay vì các biến cục bộ, loại bỏ các hành vi không xác định.
Jonathan Frech

@PeterCordes Tôi cũng lấy đề xuất chơi gôn của bạn và quản lý để lưu bốn byte. Tuy nhiên, tôi không biết liệu đây có thực sự là những gì bạn đang đề xuất hay không, như bạn đã viết o|=1<<...thay vì một cái gì đó dọc theo dòng o|=1<<(t=....
Jonathan Frech

3

Toán học, 57 49 48 byte

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

Điều này trả về:

  • False.Truecho 0 (hỗn hợp)
  • True.Truecho 1 (tất cả lẻ)
  • False.Falsecho 2 (tất cả chẵn)

Hãy thử trực tuyến!

Đây là một thay thế dài hơn một chút (49 byte):

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

Cái này trả về:

  • 1cho 0 (hỗn hợp)
  • -1cho 1 (tất cả lẻ)
  • 0cho 2 (tất cả chẵn)

Hãy thử trực tuyến!


2

Màu đỏ , 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]]

Hãy thử trực tuyến!

Trả về 1 0cho hỗn hợp, 1cho lẻ và 0thậm chí

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)

Trả về -1 (chẵn), 1 (lẻ) và 0 (hỗn hợp).

Làm thế nào nó hoạt động:

Bộ dtích lũy sẽ là:

  1. Không nếu tất cả các mô-đun thậm chí. ( !a[d+1]== sai, !d== 1, false - 1== -1 )
  2. Một ít hơn * chiều dài của mảng nếu tất cả các mô đun lẻ. ( * Bộ tích lũy bao gồm một phần tử được điều chế theo chính nó, dẫn đến một mô-đun chẵn.) ( !a[d+1]== true, !d== 0, true - 0== 1 )
  3. Hai hoặc nhiều hơn chiều dài của mảng nếu trộn. ( !a[d+1]== sai, !d== 0, false - 0== 0 )

Các trường hợp thử nghiệm:


1

J , 27 20 byte

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

Hãy thử trực tuyến!

Sử dụng [1 0] [1] [0] thay vì 0 1 2

Giải trình:

|/~ - tạo một bảng với phần còn lại:

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

2|lẻ hay chẵn? :

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

<@~.@}:@\:"1 - sắp xếp xuống, thả phần tử cuối cùng (luôn luôn bằng 0), giữ các phần tử ùnique và hộp mỗi hàng:

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

1
16 byte với việc 2/:~@:|"1]|1]\.]trả về một danh sách các cặp.
dặm

@ Dặm Cảm ơn bạn! Sản lượng này có được chấp nhận không?
Galen Ivanov

Trên thực tế không, tôi đã bỏ lỡ phần đó về các giá trị khác biệt. Tôi sẽ quay lại với nó một chút.
dặm


1

Perl, 38 byte

Bao gồm +3cho-p

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

Đầu ra 1 cho tất cả chẵn, 2 cho tất cả lẻ, 3 cho hỗn hợp


1

Sạch , 95 65 63 byte

import StdEnv

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

Hãy thử trực tuyến!

Là một lambda, lấy [Int]và trở về [Int], ánh xạ tới:

  • 0: Trộn
  • 1: tất cả thậm chí
  • -1: tất cả lẻ



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));}}
  • Sử dụng truetruethay vì 2thậm chí
  • Sử dụng falsefalsethay 1cho lẻ
  • Sử dụng truefalsethay 0cho hỗn hợp

Giải trình:

Hãy thử trực tuyến.

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

Một ví dụ hoàn chỉnh với chuyển đổi đầu ra:

(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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.