La parte di parità del modulo


15

Ti viene dato un array A di n numeri interi assolutamente positivi, con n ≥ 2 .

Il tuo compito è mappare ogni voce A i a:

  • 1 se A j mod A i è dispari per ogni j tale che 1 ≤ j ≤ n e j ≠ i
  • 2 se A j mod A i è pari per ogni j tale che 1 ≤ j ≤ n e j ≠ i
  • 0 altrimenti (parità mista)

Esempio

Per A = [73, 50, 61] , abbiamo:

  • 50 mod 73 = 50 , 61 mod 73 = 61 → misto
  • 73 mod 50 = 23 , 61 mod 50 = 11 → tutto dispari
  • 73 mod 61 = 12 , 50 mod 61 = 50 → tutti pari

Pertanto, l'output previsto è [0, 1, 2] .

Regole

  • Puoi usare tre valori distinti (di qualsiasi tipo) invece di 0 , 1 e 2 purché siano coerenti. Specifica la tua mappatura se non stai usando quella descritta nella sfida.
  • In caso di dubbi, lo zero è pari .
  • Questo è , quindi vince la risposta più breve in byte!

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


Fare i valori di uscita devono essere interi o sarebbe [1], [0, 1]e [1, 1]il lavoro?
Dennis,

@Dennis Qualsiasi valore coerente va bene. Quindi sì, funzionerebbe!
Arnauld,

Risposte:


9

Python 2 , 68 67 66 byte

-1 byte grazie a Mr. Xcoder
-1 byte grazie a ovs

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

Provalo online!

Restituisce 1,0,2invece 0,1,2.


sostituire (k<1)con 0**kper -1 byte.
Ovs

4

Gelatina , 9 byte

%þœ-€0Ḃ‘Ṭ

Restituisce [1, 1], [0, 1], [1] invece di 0, 1, 2 .

Provalo online!

Come funziona

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

Potresti sostituirlo ‘ṬUḄcon Q€Ḅper salvare un byte?
Jonathan Allan,

Purtroppo no. Q€potrebbe tornare [0, 1]o [1, 0].
Dennis,

Oh giusto. Penso [1], [1,1]e [0,1]sono tre valori distinti, quindi %þœ-€0Ḃ‘Ṭdovrebbe essere accettabile per 9. MODIFICA - ah vedo che hai fatto questa domanda esatta :)
Jonathan Allan,

Un'altra alternativa a 9 byte è¹-Ƥ%"%2‘Ṭ
miglia

3

MATL , 12 byte

!G\o~tAws1=-

Questo utilizza 0, -1, 1anziché 0, 1, 2rispettivamente.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

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

  • Grazie a Peter Cordes per la correzione di errori.
  • Salvati quattro ventuno byte grazie a Peter Cordes ; suggerendo di utilizzare una diversa mappatura dei valori di output; [0 1 2] ~ [3 2 1].
  • Cinque byte salvati; usando ancora un'altra mappatura; [0 1 2] ~ [  ].
  • Salvato un byte; golf for(i=0;i<n;i++,putchar...a 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);}}

Provalo online!


Le funzioni di test su TIO non superano argomenti sufficienti e questo comportamento indefinito porta a una divisione per zero (SIGFPE) dall'ultimo caso di test. f(I,7)sovrascrive il primo elemento di I[]( A[]in f ()) con uno degli arg che stai usando come gente del posto. f()presuppone che il chiamante abbia passato arg sullo stack, ma il chiamante non lo sapeva, e ciò che è effettivamente nello stack sopra l'indirizzo di ritorno è A[0]. (ovvero questo UB ha causato te A[0]ha lo stesso indirizzo). Ad ogni modo, questo è solo UB nella tua funzione di test su TIO.
Peter Cordes,

E a proposito, non ho potuto riproporre il crash localmente, quindi ho dovuto aggiungere execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);a main per ottenere l'asm dal gcc 7.2.1 di TIO, che non corrispondeva esattamente al mio gcc 7.2.1 di Arch Linux. Dopo aver ripristinato lo smontaggio in sorgente asm per la funzione di chiamata, ho potuto riproporlo localmente all'interno di gdb e confermare esattamente cosa stava succedendo.
Peter Cordes,

Puoi salvare byte usando una mappatura diversa, come 1 per pari, 2 per dispari, 3 per misto, quindi puoi o|=1<<(A[j]%A[i]%2)senza bisogno di alcuna decodifica fantasia per o.
Peter Cordes,

@PeterCordes Grazie per aver notato, anche se non riesco ancora a capire perché la prima voce dell'array viene sovrascritta. Ora ho scelto di utilizzare le variabili globali anziché quelle locali, rimuovendo il comportamento indefinito.
Jonathan Frech,

@PeterCordes Ho anche preso il tuo suggerimento sul golf e sono riuscito a salvare quattro byte. Tuttavia, non so se questo fosse davvero quello che stavi suggerendo, come hai scritto o|=1<<...invece di qualcosa del genere o|=1<<(t=....
Jonathan Frech,

3

Mathematica, 57 49 48 byte

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

Questo ritorna:

  • False.Trueper 0 (misto)
  • True.Trueper 1 (tutto dispari)
  • False.Falseper 2 (tutti pari)

Provalo online!

Ecco un'alternativa leggermente più lunga (49 byte):

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

Questo restituisce:

  • 1per 0 (misto)
  • -1per 1 (tutto dispari)
  • 0per 2 (tutti pari)

Provalo online!


2

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

Provalo online!

I ritorni 1 0per misto, 1per pari e 0per ancora

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)

Restituisce -1 (pari), 1 (dispari) e 0 (misto).

Come funziona:

L' daccumulatore sarà:

  1. Zero se tutti i moduli pari. ( !a[d+1]== false, !d== 1, false - 1== -1 )
  2. Uno in meno * della lunghezza dell'array se tutti i moduli dispari. ( * L'accumulatore include un elemento modulato su se stesso, risultante in un modulo pari.) ( !a[d+1]== true, !d== 0, true - 0== 1 )
  3. Due o più in meno della lunghezza dell'array se un mix. ( !a[d+1]== false, !d== 0, false - 0== 0 )

Casi test:


1

J , 27 20 byte

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

Provalo online!

Utilizza [1 0] [1] [0] invece di 0 1 2

Spiegazione:

|/~ - crea una tabella con i resti:

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

2|pari o dispari? :

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

<@~.@}:@\:"1 - ordina verso il basso, elimina l'ultimo elemento (sempre uno zero), mantieni gli elementi unici e componi ogni riga:

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

1
16 byte con 2/:~@:|"1]|1]\.]restituzione di un elenco di coppie.
miglia

@ miglia Grazie! Questo output è accettabile?
Galen Ivanov,

In realtà no, ho perso quella parte su valori distinti. Ci tornerò tra un po '.
miglia


1

Perl, 38 byte

Include +3per-p

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

Uscite 1 per tutto il pari, 2 per tutto il dispari, 3 per misto


1

Pulito , 95 65 63 byte

import StdEnv

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

Provalo online!

Come lambda, prendendo [Int]e ritornando [Int], mappando a:

  • 0: misto
  • 1: tutto uguale
  • -1: tutto strano



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));}}
  • utilizzando truetrue invece di2 per pari
  • utilizzando falsefalse invece di1 per dispari
  • utilizzando truefalse anziché 0per misto

Spiegazione:

Provalo online.

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

Un esempio completo con conversione di output:

(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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.