모듈로 패리티 파티


15

넌 배열 주어진다 N 과 엄격히 양의 정수 , N ≥ 2 .

당신의 임무는 각 항목 A i 를 다음 에 매핑 하는 것입니다.

  • 경우 J 개조 각 홀수 J 되도록 1 ≤ N ≤ JJ ≠ 난
  • 경우 J 개조 심지어 각이다 J 되도록 1 ≤ N ≤ JJ ≠ I
  • 그렇지 않으면 0 (혼합 패리티)

옵션 A = [73, 50, 61] , 우리가있다 :

  • 50 모드 73 = 50 , 61 모드 73 = 61 → 혼합
  • 73 mod 50 = 23 , 61 mod 50 = 11 → 모두 홀수
  • 73 모드 61 = 12 , 50 모드 61 = 50 → 모두 짝수

따라서 예상 출력은 [0, 1, 2] 입니다.

규칙

  • 일관된 한 0 , 12 대신 3 가지 고유 한 값 (모든 유형)을 사용할 수 있습니다 . 챌린지에 설명 된 것을 사용하지 않는 경우 매핑을 지정하십시오 .
  • 그것에 대해 의심이 있다면, 0도 짝수 입니다.
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다!

테스트 사례

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


출력 값이 정수로하거나 것 마십시오 [1], [0, 1]그리고 [1, 1]사용할 수 있습니까?
Dennis

@Dennis 일관된 값이 좋습니다. 그렇습니다.
Arnauld

답변:



4

젤리 , 9 바이트

%þœ-€0Ḃ‘Ṭ

0, 1, 2 대신 [1, 1], [0, 1], [1]을 반환합니다 . 합니다.

온라인으로 사용해보십시오!

작동 원리

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

당신은 대체 할 수 ‘ṬUḄQ€Ḅ바이트를 저장?
Jonathan Allan

안타깝게도 또는을 Q€반환 할 수 있습니다. [0, 1][1, 0]
Dennis

아 맞다 내 생각 [1], [1,1]그리고 [0,1]세 개의 서로 다른 값이 너무있다 %þœ-€0Ḃ‘Ṭ9. 편집 허용해야한다 - 아 나는 당신이 정확한 질문 : 질문 참조
조나단 앨런

또 다른 9 바이트 대안이다¹-Ƥ%"%2‘Ṭ
마일

3

MATL , 12 바이트

!G\o~tAws1=-

이 용도 0, -1, 1대신 0, 1, 2각각.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

!    % 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 바이트

  • 버그 수정에 대한 Peter Cordes 에게 감사합니다 .
  • 저장된 이십일이 덕분에 바이트 피터 코르을 ; 다른 출력값 매핑을 사용하도록 제안; [0 1 2] ~ [3 2 1].
  • 5 바이트를 절약했습니다. 또 다른 매핑을 사용하는 것; [0 1 2] ~ [  ].
  • 바이트를 저장했습니다. 에 골프 for(i=0;i<n;i++,putchar...를 쳤다 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);}}

온라인으로 사용해보십시오!


TIO의 테스트 함수는 충분한 인수를 전달하지 않으며이 정의되지 않은 동작은 마지막 테스트 케이스에서 SIGFPE (제곱)로 이어집니다. ( f ()) f(I,7)의 첫 번째 요소 를 로컬로 사용중인 인수 중 하나로 덮어 씁니다 . 호출자가 스택에 arg를 전달했다고 가정하지만 호출자는이를 알지 못했으며 실제로 리턴 주소 위의 스택에있는 것은 입니다. (즉,이 UB는 발생 과 같은 주소를 가지고). 어쨌든 이것은 TIO 의 테스트 기능 에서 UB입니다 . I[]A[]f()A[0]tA[0]
Peter Cordes 2019

그리고 BTW, 충돌을 로컬에서 재현 할 수 없었으므로 execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);TIO의 gcc 7.2.1에서 asm을 얻기 위해 main에 추가 해야했습니다. 호출 기능을 위해 해당 디스 어셈블리를 asm 소스로 되 돌린 후 gdb 내부에서 로컬로 재현하여 정확히 무슨 일이 있었는지 확인할 수 있습니다.
Peter Cordes 2019

짝수의 경우 1, 홀수의 경우 2, 혼합의 경우 3과 같은 다른 매핑을 사용하여 바이트를 절약 할 수 있으므로에 o|=1<<(A[j]%A[i]%2)대한 멋진 디코딩이 필요하지 않습니다 o.
Peter Cordes 2019

@PeterCordes 왜 여전히 첫 번째 배열 항목을 덮어 쓰는지 이해하지 못해도 감사합니다. 이제 지역 변수 대신 전역 변수를 사용하여 정의되지 않은 동작을 제거했습니다.
Jonathan Frech

@PeterCordes 또한 골프 제안을 받아 4 바이트를 절약했습니다. 그러나 나는 당신이 o|=1<<...의 내용에 따라 무언가 대신 썼던 것처럼 이것이 실제로 당신이 제안한 것인지 알 수 없습니다 o|=1<<(t=....
Jonathan Frech

3

매스 매 티카, 57 49 48 바이트

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

이것은 다음을 반환합니다.

  • False.True0 (혼합)
  • True.True1 (홀수)를
  • False.False에 대한 2 (모든 짝수)

온라인으로 사용해보십시오!

약간 더 긴 대안 (49 바이트)이 있습니다.

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

이것은 다음을 반환합니다.

  • 10 (혼합)
  • -11 (홀수)를
  • 0에 대한 2 (모든 짝수)

온라인으로 사용해보십시오!


2

빨강 , 101 바이트

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

온라인으로 사용해보십시오!

반환 1 0혼합에, 1홀수 및 0도에 대한

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

자바 스크립트 (ES6), 46 바이트

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

-1 (짝수), 1 (홀수) 및 0 (혼합)을 반환합니다.

작동 방식 :

d축적이 될 것입니다 :

  1. 모두 모듈러스이면 0입니다. ( !a[d+1]== false, !d== 1, false - 1== -1 )
  2. 하나 개 이하 * 홀수 계수 만약 어레이의 길이보다. ( * 누산기는 자체에 대해 변조 된 요소를 포함하므로 하나의 계수도 생성됩니다 .) ( !a[d+1]== true, !d== 0, true - 0== 1 )
  3. 혼합 된 경우 배열의 길이보다 두 개 이상 짧습니다. ( !a[d+1]== false, !d== 0, false - 0== 0 )

테스트 사례 :


1

J , 27 20 바이트

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

온라인으로 사용해보십시오!

0 1 2 대신 [1 0] [1] [0] 사용

설명:

|/~ -나머지가있는 테이블을 만듭니다.

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

2|홀수 또는 짝수? :

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

<@~.@}:@\:"1 -정렬하고 마지막 요소 (항상 0)를 삭제하고 ùnique 요소를 유지하고 각 행을 상자에 넣습니다.

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

1
2/:~@:|"1]|1]\.]쌍 목록을 리턴하는 16 바이트
마일

@ 마일 감사합니다! 이 출력이 허용됩니까?
Galen Ivanov

실제로 아니요, 고유 한 값에 대해 그 부분을 놓쳤습니다. 잠시 후에 다시 설명하겠습니다.
마일


1

펄, 38 바이트

포함 +3을 위해-p

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

모든 짝수에 대해 출력 1, 모든 홀수에 대해 2, 혼합에 대해 3





1

자바 8, 91 89 바이트

a->{for(int z:a){int s=1;for(int y:a)s+=y%z%2;System.out.print(" "+(s<a.length)+(s<2));}}
  • 사용 truetrue instead of 2 for even
  • 사용 falsefalse instead of 1 for odd
  • 사용 truefalse0혼합 대신

설명:

온라인으로 사용해보십시오.

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

클로저, 82 바이트

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

출력 변환에 대한 완전한 예 :

(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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.