La fiesta de paridad de módulo

15

Se le da una matriz A de n enteros estrictamente positivos, con n ≥ 2 .

Su tarea es asignar cada entrada A i a:

  • 1 si A j mod A i es impar para cada j tal que 1 ≤ j ≤ n y j ≠ i
  • 2 si A j mod A i es incluso para cada j tal que 1 ≤ j ≤ n y j ≠ i
  • 0 de lo contrario (paridades mixtas)

Ejemplo

Para A = [73, 50, 61] , tenemos:

  • 50 mod 73 = 50 , 61 mod 73 = 61 → mixto
  • 73 mod 50 = 23 , 61 mod 50 = 11 → todo impar
  • 73 mod 61 = 12 , 50 mod 61 = 50 → todos pares

Por lo tanto, la salida esperada es [0, 1, 2] .

Reglas

  • Puede usar tres valores distintos (de cualquier tipo) en lugar de 0 , 1 y 2 , siempre que sean consistentes. Especifique su mapeo si no está utilizando el descrito en el desafío.
  • Si hubiera alguna duda al respecto, cero es par .
  • Este es el , por lo que gana la respuesta más corta en bytes.

Casos de prueba

[ 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
fuente
Relacionado
Arnauld
¿Los valores de salida tienen que ser enteros o lo haría [1], [0, 1]y [1, 1]el trabajo?
Dennis
@Dennis Cualquier valor consistente está bien. ¡Entonces sí, eso funcionaría!
Arnauld

Respuestas:

9

Python 2 , 68 67 66 bytes

-1 byte gracias al Sr. Xcoder
-1 byte gracias a los ovs

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

Pruébalo en línea!

Devoluciones en su 1,0,2lugar 0,1,2.

varilla
fuente
sustituir (k<1)con 0**kde -1 bytes.
ovs
4

Jalea , 9 bytes

%þœ-€0Ḃ‘Ṭ

Devuelve [1, 1], [0, 1], [1] en lugar de 0, 1, 2 .

Pruébalo en línea!

Cómo funciona

%þœ-€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
fuente
¿Podría reemplazar ‘ṬUḄcon Q€Ḅpara guardar un byte?
Jonathan Allan
Tristemente no. Q€podría regresar [0, 1]o [1, 0].
Dennis
Correcto. Creo [1], [1,1]y [0,1]son tres valores distintos, por lo que %þœ-€0Ḃ‘Ṭdebería ser aceptable para 9. EDITAR - ah, veo que hiciste esta pregunta exacta :)
Jonathan Allan
Otra alternativa de 9 bytes es¹-Ƥ%"%2‘Ṭ
millas
3

MATL , 12 bytes

!G\o~tAws1=-

Este usos 0, -1, 1en lugar de 0, 1, 2respectivamente.

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

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

C (gcc) , 118 114 97 92 91 bytes

  • Gracias a Peter Cordes por la corrección de errores.
  • Ahorró cuatro veintiún bytes gracias a Peter Cordes ; sugiriendo usar una asignación de valor de salida diferente; [0 1 2] ~ [3 2 1].
  • Guardado cinco bytes; usando otro mapeo más; [0 1 2] ~ [  ].
  • Guardado 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);}}

Pruébalo en línea!

Jonathan Frech
fuente
Sus funciones de prueba en TIO no pasan suficientes argumentos, y este comportamiento indefinido conduce a una división por cero (SIGFPE) del último caso de prueba. f(I,7)sobrescribe el primer elemento de I[]( A[]en f ()) con uno de los argumentos que está utilizando como locales. f()supone que la persona que llamó pasó el argumento en la pila, pero la persona que llama no lo sabía, y lo que está realmente en la pila encima de la dirección de retorno es A[0]. (es decir, este UB causó ty A[0]tener la misma dirección). De todos modos, esto es solo UB en su función de prueba en TIO.
Peter Cordes
Y, por cierto, no pude reprobar el bloqueo localmente, así que tuve que agregar execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);a main para obtener el asm del gcc 7.2.1 de TIO, que no coincidía exactamente con mi gcc 7.2.1 de Arch Linux. Después de convertir ese desensamblaje nuevamente en la fuente asm para la función de llamada, pude reprogramarlo localmente dentro de gdb y confirmar exactamente lo que estaba sucediendo.
Peter Cordes
Puede guardar bytes utilizando una asignación diferente, como 1 para pares, 2 para impares, 3 para mixtos, para que pueda hacerlo o|=1<<(A[j]%A[i]%2)sin necesidad de una decodificación elegante o.
Peter Cordes
@PeterCordes Gracias por señalar, aunque todavía no entiendo completamente por qué se sobrescribe la primera entrada de la matriz. Ahora elegí usar variables globales en lugar de locales, eliminando el comportamiento indefinido.
Jonathan Frech
@ PeterCordes También tomé su sugerencia de golf y logré ahorrar cuatro bytes. Sin embargo, no sé si esto fue realmente lo que estabas sugiriendo, como escribiste en o|=1<<...lugar de algo similar o|=1<<(t=....
Jonathan Frech
3

Mathematica, 57 49 48 bytes

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

Esto devuelve:

  • False.Truepara 0 (mixto)
  • True.Truepara 1 (todo impar)
  • False.Falsepara 2 (todos pares)

Pruébalo en línea!

Aquí hay una alternativa un poco más larga (49 bytes):

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

Este regresa:

  • 1para 0 (mixto)
  • -1para 1 (todo impar)
  • 0para 2 (todos pares)

Pruébalo en línea!

David Bevan
fuente
2

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

Pruébalo en línea!

Devuelve 1 0para mixto, 1para impar y 0para par

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
fuente
2

JavaScript (ES6), 46 bytes

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

Devuelve -1 (par), 1 (impar) y 0 (mixto).

Cómo funciona:

El dacumulador será:

  1. Cero si todos los módulos pares. ( !a[d+1]== falso, !d== 1, false - 1== -1 )
  2. Uno menos * que la longitud de la matriz si todos los módulos impares. ( * El acumulador incluye un elemento modulado contra sí mismo, lo que resulta en un módulo par.) ( !a[d+1]== verdadero, !d== 0, true - 0== 1 )
  3. Dos o más menos que la longitud de la matriz si es una mezcla. ( !a[d+1]== falso, !d== 0, false - 0== 0 )

Casos de prueba:

Rick Hitchcock
fuente
1

J , 27 20 bytes

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

Pruébalo en línea!

Utiliza [1 0] [1] [0] en lugar de 0 1 2

Explicación:

|/~ - hace una mesa con restos:

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

2|¿par o impar? :

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

<@~.@}:@\:"1 - ordenar, soltar el último elemento (siempre un cero), mantener los elementos únicos y encuadrar cada fila:

   <@~.@}:@\:"1~2||/~ 73 50 61 
┌───┬─┬─┐
│1 0│1│0│
└───┴─┴─┘
Galen Ivanov
fuente
1
16 bytes con la 2/:~@:|"1]|1]\.]devolución de una lista de pares.
millas
@ millas Gracias! ¿Es aceptable esta salida?
Galen Ivanov
En realidad no, me perdí esa parte sobre valores distintos. Volveré a eso en un momento.
millas
1

Ruby , 58 56 bytes

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

Devuelve [0, 1], [1], [0] en lugar de 0, 1, 2 (es decir, [0] para todos los pares, [1] para todos los impares y [0, 1] para mixtos).

Pruébalo en línea!

Restablecer a Monica - notmaynard
fuente
1

Perl, 38 bytes

Incluye +3para-p

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

Salidas 1 para todo par, 2 para todo impar, 3 para mixto

Ton Hospel
fuente
1

Limpio , 95 65 63 bytes

import StdEnv

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

Pruébalo en línea!

Como lambda, tomando [Int]y regresando [Int], asignando a:

  • 0: mezclado
  • 1: todo incluso
  • -1: todo extraño
Οurous
fuente
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));}}
  • Usando en truetruelugar de 2para incluso
  • Usando en falsefalselugar de 1por impar
  • Usando en truefalselugar de 0para mixto

Explicación:

Pruébalo en línea.

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
fuente
0

Clojure, 82 bytes

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

Un ejemplo completo con conversión de salida:

(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
fuente