La fête de la parité modulo

15

On vous donne un tableau A de n entiers strictement positifs, avec n ≥ 2 .

Votre tâche consiste à mapper chaque entrée A i pour:

  • 1 si A j mod A i est impair pour chaque j tel que 1 ≤ j ≤ n et j ≠ i
  • 2 si A j mod A i est pair pour chaque j tel que 1 ≤ j ≤ n et j ≠ i
  • 0 sinon (parités mixtes)

Exemple

Pour A = [73, 50, 61] , nous avons:

  • 50 mod 73 = 50 , 61 mod 73 = 61 → mixte
  • 73 mod 50 = 23 , 61 mod 50 = 11 → tous impairs
  • 73 mod 61 = 12 , 50 mod 61 = 50 → tout pair

Par conséquent, la sortie attendue est [0, 1, 2] .

Règles

  • Vous pouvez utiliser trois valeurs distinctes (de tout type) au lieu de 0 , 1 et 2 tant qu'elles sont cohérentes. Veuillez spécifier votre mappage si vous n'utilisez pas celui décrit dans le défi.
  • En cas de doute, zéro est pair .
  • C'est le , donc la réponse la plus courte en octets l'emporte!

Cas de test

[ 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 ]
Arnauld
la source
En relation
Arnauld
Est - ce que les valeurs de sortie doivent être des nombres entiers ou serait [1], [0, 1]et le [1, 1]travail?
Dennis
@Dennis Toutes les valeurs cohérentes sont correctes. Alors oui, ça marcherait!
Arnauld

Réponses:

9

Python 2 , 68 67 66 octets

-1 octet grâce à Mr. Xcoder
-1 octet grâce à ovs

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

Essayez-le en ligne!

Renvoie à la 1,0,2place 0,1,2.

Barre
la source
remplacer (k<1)par 0**k-1 octet.
ovs
4

Gelée , 9 octets

%þœ-€0Ḃ‘Ṭ

Renvoie [1, 1], [0, 1], [1] au lieu de 0, 1, 2 .

Essayez-le en ligne!

Comment ça fonctionne

%þœ-€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.
Dennis
la source
Pourriez-vous remplacer ‘ṬUḄpar Q€Ḅpour enregistrer un octet?
Jonathan Allan
Malheureusement non. Q€pourrait revenir [0, 1]ou [1, 0].
Dennis
Oh, c'est vrai. Je pense que [1], [1,1]et [0,1]sont trois valeurs distinctes, donc %þœ-€0Ḃ‘Ṭdevraient être acceptables pour 9. EDIT - ah je vois que vous avez posé cette question exacte :)
Jonathan Allan
Une autre alternative de 9 octets est¹-Ƥ%"%2‘Ṭ
miles
3

MATL , 12 octets

!G\o~tAws1=-

Cette utilisation 0, -1, au 1lieu de 0, 1, 2respectivement.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

!    % 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
Luis Mendo
la source
3

C (gcc) , 118 114 97 92 91 octets

  • Merci à Peter Cordes pour la correction de bugs.
  • Enregistré quatre vingt et un octets grâce à Peter Cordes ; suggérant d'utiliser un mappage de valeur de sortie différent; [0 1 2] ~ [3 2 1].
  • Enregistré cinq octets; en utilisant encore une autre cartographie; [0 1 2] ~ [  ].
  • Enregistré un octet; joué for(i=0;i<n;i++,putchar...au golf 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);}}

Essayez-le en ligne!

Jonathan Frech
la source
Vos fonctions de test sur TIO ne passent pas assez d'arguments, et ce comportement indéfini conduit à une division par zéro (SIGFPE) du dernier cas de test. f(I,7)écrase le premier élément de I[]( A[]dans f ()) avec l'un des arguments que vous utilisez en tant que sections locales. f()suppose que l'argument a été passé sur la pile par l'appelant, mais l'appelant ne le savait pas, et ce qui se trouve réellement sur la pile au-dessus de l'adresse de retour est A[0]. (c'est-à-dire que cette UB a provoqué tet A[0]avoir la même adresse). Quoi qu'il en soit, ce n'est que UB dans votre fonction de test sur TIO.
Peter Cordes
Et BTW, je ne pouvais pas reprocher le crash localement, j'ai donc dû ajouter execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);à main pour obtenir l'asm du gcc 7.2.1 de TIO, qui ne correspondait pas exactement à mon gcc Arch Linux Linux 7.2.1. Après avoir reconverti ce désassemblage en source asm pour la fonction appelante, j'ai pu le reprocher localement dans gdb et confirmer exactement ce qui se passait.
Peter Cordes
Vous pouvez enregistrer des octets en utilisant un mappage différent, comme 1 pour pair, 2 pour impair, 3 pour mixte, de sorte que vous pouvez o|=1<<(A[j]%A[i]%2)sans avoir besoin de décodage sophistiqué o.
Peter Cordes
@PeterCordes Merci de noter, même si je ne comprends toujours pas pourquoi la première entrée du tableau est écrasée. J'ai maintenant choisi d'utiliser des variables globales au lieu de variables locales, supprimant le comportement indéfini.
Jonathan Frech
@PeterCordes J'ai également pris votre suggestion de golf et j'ai réussi à économiser quatre octets. Cependant, je ne sais pas si c'est vraiment ce que vous proposiez, comme vous l'avez écrit o|=1<<...au lieu de quelque chose dans le sens de o|=1<<(t=....
Jonathan Frech
3

Mathematica, 57 49 48 octets

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

Cela renvoie:

  • False.Truepour 0 (mixte)
  • True.Truepour 1 (tous impairs)
  • False.Falsepour 2 (tous pairs)

Essayez-le en ligne!

Voici une alternative légèrement plus longue (49 octets):

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

Celui-ci renvoie:

  • 1pour 0 (mixte)
  • -1pour 1 (tous impairs)
  • 0pour 2 (tous pairs)

Essayez-le en ligne!

David Bevan
la source
2

Rouge , 101 octets

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

Essayez-le en ligne!

Retourne 1 0pour mixte, 1pour impair et 0pour pair

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
    ]
]
Galen Ivanov
la source
2

JavaScript (ES6), 46 octets

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

Renvoie -1 (pair), 1 (impair) et 0 (mixte).

Comment ça fonctionne:

L' daccumulateur sera:

  1. Zéro si tous même des modules. ( !a[d+1]== faux, !d== 1, false - 1== -1 )
  2. Un de moins * que la longueur du tableau si tous les modules impairs. ( * L'accumulateur comprend un élément modulé contre lui-même, résultant en un module pair.) ( !a[d+1]== true, !d== 0, true - 0== 1 )
  3. Deux ou plus de moins que la longueur du tableau si un mélange. ( !a[d+1]== faux, !d== 0, false - 0== 0 )

Cas de test:

Rick Hitchcock
la source
1

J , 27 20 octets

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

Essayez-le en ligne!

Utilise [1 0] [1] [0] au lieu de 0 1 2

Explication:

|/~ - fait un tableau avec des restes:

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

2|impair ou pair? :

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

<@~.@}:@\:"1 - trier, supprimer le dernier élément (toujours un zéro), conserver les éléments ùnique et encadrer chaque ligne:

   <@~.@}:@\:"1~2||/~ 73 50 61 
┌───┬─┬─┐
│1 0│1│0│
└───┴─┴─┘
Galen Ivanov
la source
1
16 octets avec 2/:~@:|"1]|1]\.]retour d'une liste de paires.
miles
@ miles Merci! Cette sortie est-elle acceptable?
Galen Ivanov
En fait non, j'ai raté cette partie sur les valeurs distinctes. J'y reviendrai dans un instant.
miles
1

Rubis , 58 56 octets

->r{r.map{m=r.shift;s=r.map{|e|e%m%2}.uniq.sort;r<<m;s}}

Renvoie [0, 1], [1], [0] au lieu de 0, 1, 2 (c'est-à-dire [0] pour tous pairs, [1] pour tous impairs et [0, 1] pour mixte).

Essayez-le en ligne!

Réintégrer Monica - notmaynard
la source
1

Perl, 38 octets

Comprend +3pour-p

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

Sorties 1 pour tous pairs, 2 pour tous impairs, 3 pour mixtes

Ton Hospel
la source
1

Nettoyer , 95 65 63 octets

import StdEnv

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

Essayez-le en ligne!

En tant que lambda, prenant [Int]et retournant [Int], mappant sur:

  • 0: mixte
  • 1: tous même
  • -1: tout impair
Οurous
la source
1

Perl 5 , 71 69 + 1 ( -a) = 70 octets

map{//;$j=$s='';$j++-$i&&($s+=$_%$'&1)for@F;say$s?0|$s==$#F:2;$i++}@F

Essayez-le en ligne!

Xcali
la source
1

Java 8, 91 89 octets

a->{for(int z:a){int s=1;for(int y:a)s+=y%z%2;System.out.print(" "+(s<a.length)+(s<2));}}
  • Utiliser truetrueau lieu de2 pour même
  • Utiliser falsefalseau lieu de1 pour impair
  • Utilisation truefalseau lieu de 0pour mixte

Explication:

Essayez-le en ligne.

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)
Kevin Cruijssen
la source
0

Clojure, 82 octets

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

Un exemple complet avec conversion de sortie:

(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)
NikoNyrh
la source