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 ]


¿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.


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.

¿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

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!


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!


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

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:


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

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

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


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



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)

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.