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 ]


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.


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.

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

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!


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!


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

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:


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│
└───┴─┴─┘

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

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


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



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)

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.