Die Modulo-Paritätspartei


15

Sie erhalten ein Array A von n streng positiven ganzen Zahlen mit n ≥ 2 .

Ihre Aufgabe ist es, jeden Eintrag A i zuzuordnen :

  • 1, wenn A j mod A i für jedes j ungerade ist, so dass 1 ≤ j ≤ n und j i
  • 2 wenn A j mod A i für jedes j gerade ist, so dass 1 ≤ j ≤ n und j j i
  • 0 sonst (gemischte Paritäten)

Beispiel

Für A = [73, 50, 61] gilt:

  • 50 mod 73 = 50 , 61 mod 73 = 61 → gemischt
  • 73 mod 50 = 23 , 61 mod 50 = 11 → alles ungerade
  • 73 mod 61 = 12 , 50 mod 61 = 50 → alles gerade

Daher ist die erwartete Ausgabe [0, 1, 2] .

Regeln

  • Sie können anstelle von 0 , 1 und 2 drei unterschiedliche Werte (jeden Typs) verwenden , sofern diese konsistent sind. Bitte geben Sie Ihr Mapping an, wenn Sie nicht das in der Challenge beschriebene verwenden.
  • Sollte diesbezüglich ein Zweifel bestehen, ist Null gerade .
  • Das ist , also gewinnt die kürzeste Antwort in Bytes!

Testfälle

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


Haben die Ausgangswerte ganze Zahlen oder würde sein [1], [0, 1]und [1, 1]Arbeit?
Dennis

@ Tennis Alle konsistenten Werte sind in Ordnung. Also ja, das würde funktionieren!
Arnauld

Antworten:


9

Python 2 , 68 67 66 Bytes

-1 Byte dank Mr. Xcoder
-1 Byte dank ovs

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

Probieren Sie es online!

Gibt 1,0,2stattdessen zurück 0,1,2.


Ersetzen (k<1)durch 0**kfür -1 Byte.
Ovs

4

Gelee , 9 Bytes

%þœ-€0Ḃ‘Ṭ

Gibt [1, 1], [0, 1], [1] anstelle von 0, 1, 2 zurück .

Probieren Sie es online!

Wie es funktioniert

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

Könnten Sie ersetzen ‘ṬUḄmit Q€Ḅeinem Byte speichern?
Jonathan Allan

Traurigerweise Nein. Q€könnte zurückkehren [0, 1]oder [1, 0].
Dennis

Oh, richtig. Ich denke [1], [1,1]und [0,1]sind drei verschiedene Werte, so %þœ-€0Ḃ‘Ṭsollte für 9 akzeptabel sein. EDIT - ah ich sehe, Sie genau diese Frage gestellt :)
Jonathan Allan

Eine weitere 9-Byte-Alternative ist¹-Ƥ%"%2‘Ṭ
Meilen

3

MATL , 12 Bytes

!G\o~tAws1=-

Diese nutzt 0, -1, 1statt 0, 1, 2jeweils.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

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

  • Vielen Dank an Peter Cordes für die Fehlerbehebung.
  • Gespeichert vier einundzwanzig Bytes dank Peter Cordes ; Vorschlagen, eine andere Ausgabewertzuordnung zu verwenden; [0 1 2] ~ [3 2 1].
  • 5 Bytes gespeichert; Verwenden einer weiteren Zuordnung; [0 1 2] ~ [  ].
  • Ein Byte gespeichert; golfen for(i=0;i<n;i++,putchar...zu 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);}}

Probieren Sie es online!


Ihre Testfunktionen auf TIO übergeben nicht genügend Argumente, und dieses undefinierte Verhalten führt zu einer Division durch Null (SIGFPE) vom letzten Testfall. f(I,7)Überschreibt das erste Element von I[]( A[]in f ()) mit einem der Argumente, die Sie als Einheimische verwenden. f()geht davon aus, dass arg vom Aufrufer auf dem Stack übergeben wurde, aber der Aufrufer wusste das nicht, und was sich tatsächlich auf dem Stack über der Rücksprungadresse befindet A[0]. (dh diese UB verursacht tund A[0]hat die gleiche Adresse). Auf jeden Fall ist dies nur UB in Ihrer Testfunktion auf TIO.
Peter Cordes

Übrigens, ich konnte den Absturz nicht lokal execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);wiederholen, also musste ich main hinzufügen , um den Asm von TIOs gcc 7.2.1 zu erhalten, der nicht genau zu meinem Arch Linux gcc 7.2.1 passte. Nachdem ich diese Demontage wieder in asm-Quelle für die aufrufende Funktion umgewandelt hatte, konnte ich sie lokal in gdb reproduzieren und genau bestätigen, was passierte.
Peter Cordes

Sie könnten für eine noch 2 für ungerade, 3 für gemischte eine andere Mapping - Bytes verwendet wird , wie 1 speichern, so dass Sie o|=1<<(A[j]%A[i]%2)ohne jede Lust zur Decodierung zu benötigen o.
Peter Cordes

@PeterCordes Vielen Dank, dass Sie es bemerkt haben, obwohl ich immer noch nicht ganz verstehe, warum der erste Array-Eintrag überschrieben wird. Ich habe mich jetzt dafür entschieden, globale Variablen anstelle von lokalen zu verwenden, um das undefinierte Verhalten zu beseitigen.
Jonathan Frech

@PeterCordes Ich habe auch Ihren Golf-Vorschlag aufgegriffen und es geschafft, vier Bytes zu sparen. Ich weiß jedoch nicht, ob dies wirklich das war, was Sie vorgeschlagen haben, wie Sie geschrieben haben, o|=1<<...anstatt etwas in der Art von o|=1<<(t=....
Jonathan Frech

3

Mathematica, 57 49 48 Bytes

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

Dies ergibt:

  • False.Truefür 0 (gemischt)
  • True.Truefür 1 (alle ungeraden)
  • False.Falsefür 2 (alle gerade)

Probieren Sie es online!

Hier ist eine etwas längere Alternative (49 Bytes):

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

Dieser gibt zurück:

  • 1für 0 (gemischt)
  • -1für 1 (alle ungeraden)
  • 0für 2 (alle gerade)

Probieren Sie es online!


2

Rot , 101 Bytes

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

Probieren Sie es online!

Gibt 1 0für gemischt, 1für ungerade und 0für gerade zurück

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)

Gibt -1 (gerade), 1 (ungerade) und 0 (gemischt) zurück.

Wie es funktioniert:

Der dAkku wird sein:

  1. Null, wenn alle gerade Module. ( !a[d+1]== false, !d== 1, false - 1== -1 )
  2. Eins weniger * als die Länge des Arrays, wenn alle ungeraden Module. ( * Der Akkumulator enthält ein Element, das gegen sich selbst moduliert ist, was zu einem geraden Modul führt.) ( !a[d+1]== true, !d== 0, true - 0== 1 )
  3. Zwei oder mehr als die Länge des Arrays, wenn eine Mischung. ( !a[d+1]== false, !d== 0, false - 0== 0 )

Testfälle:


1

J , 27-20 Bytes

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

Probieren Sie es online!

Verwendet [1 0] [1] [0] anstelle von 0 1 2

Erläuterung:

|/~ - macht einen Tisch mit Resten:

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

2|ungerade oder gerade? :

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

<@~.@}:@\:"1 - sortiere nach unten, lösche das letzte Element (immer eine Null), behalte die eindeutigen Elemente und boxe jede Zeile:

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

1
16 Bytes mit 2/:~@:|"1]|1]\.]Rückgabe einer Liste von Paaren.
Meilen

@ miles Danke! Ist diese Ausgabe akzeptabel?
Galen Ivanov

Eigentlich nein, ich habe diesen Teil über bestimmte Werte verpasst. Ich werde gleich darauf zurückkommen.
Meilen


1

Perl, 38 Bytes

Enthält +3für-p

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

Ausgänge 1 für alle gerade, 2 für alle ungeraden, 3 für gemischt


1

Sauber , 95 65 63 Bytes

import StdEnv

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

Probieren Sie es online!

Als Lambda, nehmen [Int]und zurück [Int], Zuordnung zu:

  • 0: gemischt
  • 1: alles sogar
  • -1: alles ungerade



1

Java 8, 91 89 Bytes

a->{for(int z:a){int s=1;for(int y:a)s+=y%z%2;System.out.print(" "+(s<a.length)+(s<2));}}
  • Verwenden truetruestatt 2für gerade
  • Verwenden falsefalsestatt 1für ungerade
  • Verwenden Sie truefalsestatt 0für gemischt

Erläuterung:

Probieren Sie es online aus.

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 Bytes

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

Ein vollständiges Beispiel mit Ausgabeumwandlung:

(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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.