A festa de paridade do módulo


15

Você recebe uma matriz A de n números inteiros estritamente positivos, com n ≥ 2 .

Sua tarefa é mapear cada entrada A i para:

  • 1 se A j mod A i for ímpar para cada j, de modo que 1 ≤ j ≤ n e j ≠ i
  • 2 se A j mod A i for par para cada j tal que 1 ≤ j ≤ nej and i
  • 0 caso contrário (paridades mistas)

Exemplo

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

  • 50 mod 73 = 50 , 61 mod 73 = 61 → misturado
  • 73 mod 50 = 23 , 61 mod 50 = 11 → todos ímpares
  • 73 mod 61 = 12 , 50 mod 61 = 50 → tudo par

Portanto, a saída esperada é [0, 1, 2] .

Regras

  • Você pode usar três valores distintos (de qualquer tipo) em vez de 0 , 1 e 2 , desde que sejam consistentes. Especifique seu mapeamento se você não estiver usando o descrito no desafio.
  • Se houver alguma dúvida sobre isso, zero é par .
  • Isso é , então a resposta mais curta em bytes vence!

Casos de teste

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


Será que os valores de saída tem que ser inteiros ou faria [1], [0, 1]e [1, 1]trabalho?
Dennis

@ Dennis Quaisquer valores consistentes são bons. Então sim, isso funcionaria!
Arnauld

Respostas:


9

Python 2 , 68 67 66 bytes

-1 byte graças ao Sr. Xcoder
-1 byte graças ao ovs

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

Experimente online!

Retorna 1,0,2vez 0,1,2.


substitua (k<1)com 0**kpor -1 byte.
ovs 06/02

4

Geléia , 9 bytes

%þœ-€0Ḃ‘Ṭ

Retorna [1, 1], [0, 1], [1] em vez de 0, 1, 2 .

Experimente online!

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

Você poderia substituir ‘ṬUḄpor Q€Ḅpara salvar um byte?
Jonathan Allan

Infelizmente não. Q€poderia retornar [0, 1]ou [1, 0].
Dennis

Oh, certo. Eu acho [1], [1,1]e [0,1]são três valores distintos de modo %þœ-€0Ḃ‘Ṭdeve ser aceitável para 9. EDIT - ah eu vejo que você fez esta pergunta exata :)
Jonathan Allan

Outra alternativa de 9 bytes é¹-Ƥ%"%2‘Ṭ
miles

3

MATL , 12 bytes

!G\o~tAws1=-

Isto usa 0, -1, 1em vez de 0, 1, 2respectivamente.

Experimente online! Ou verifique todos os casos de teste .

Explicação

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

  • Obrigado a Peter Cordes pela correção de erros.
  • Economizou quatro vinte e um bytes graças a Peter Cordes ; sugerindo usar um mapeamento de valor de saída diferente; [0 1 2] ~ [3 2 1].
  • Salvo cinco bytes; usando ainda outro mapeamento;[0 1 2] ~ [  ].
  • Salva um byte; jogou golfe for(i=0;i<n;i++,putchar...para 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);}}

Experimente online!


Suas funções de teste no TIO não passam argumentos suficientes e esse comportamento indefinido leva a uma divisão por zero (SIGFPE) do último caso de teste. f(I,7)substitui o primeiro elemento de I[]( A[]em f ()) por um dos argumentos que você está usando como locais. f()assume que arg foi passado na pilha pelo chamador, mas o chamador não sabia disso e o que realmente está na pilha acima do endereço de retorno é A[0]. (ou seja, esse UB causou te A[0]tem o mesmo endereço). De qualquer forma, este é apenas UB na sua função de teste no TIO.
6608 Peter Cordes

E, como não era possível reproduzir o travamento localmente, tive que adicionar execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);ao main para obter o ASM do gcc 7.2.1 do TIO, que não correspondia exatamente ao meu gcc 7.2.1 do Arch Linux. Depois de transformar essa desmontagem novamente na fonte asm para a função de chamada, eu poderia reproduzi-la localmente dentro do gdb e confirmar exatamente o que estava acontecendo.
Peter Cordes

Você pode salvar bytes usando um mapeamento diferente, como 1 para par, 2 para ímpar, 3 para misto, para que você possa o|=1<<(A[j]%A[i]%2)sem precisar de decodificação sofisticada o.
Peter Cordes

@ PeterCordes Obrigado por observar, mesmo que eu ainda não entenda completamente por que a primeira entrada da matriz foi substituída. Agora escolhi usar variáveis ​​globais em vez de locais, removendo o comportamento indefinido.
31818 Jonathan Frech

@ PeterCordes Também aceitei sua sugestão de golfe e consegui salvar quatro bytes. No entanto, eu não sei se isso era realmente o que você estava sugerindo, como você escreveu, em o|=1<<...vez de algo do tipo o|=1<<(t=....
11138 Jonathan Frech

3

Mathematica, 57 49 48 bytes

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

Isso retorna:

  • False.Truepara 0 (misto)
  • True.Truepara 1 (todos ímpares)
  • False.Falsepara 2 (todos iguais)

Experimente online!

Aqui está uma alternativa um pouco mais longa (49 bytes):

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

Este retorna:

  • 1para 0 (misto)
  • -1para 1 (todos ímpares)
  • 0para 2 (todos iguais)

Experimente online!


2

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

Experimente online!

Retorna 1 0para misto, 1para ímpar e 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)

Retorna -1 (par), 1 (ímpar) e 0 (misto).

Como funciona:

O dacumulador será:

  1. Zero se todos os módulos. ( !a[d+1]== falso, !d== 1, false - 1== -1 )
  2. Um menos * que o comprimento da matriz, se todos os módulos ímpares. ( * O acumulador inclui um elemento modulado contra si mesmo, resultando em um módulo par.) ( !a[d+1]== verdadeiro, !d== 0, true - 0== 1 )
  3. Dois ou mais menos que o comprimento da matriz, se uma mistura. ( !a[d+1]== falso, !d== 0, false - 0== 0 )

Casos de teste:


1

J , 27 20 bytes

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

Experimente online!

Usa [1 0] [1] [0] em vez de 0 1 2

Explicação:

|/~ - cria uma tabela com os restantes:

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

2|ímpar ou par? :

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

<@~.@}:@\:"1 - classifique, solte o último elemento (sempre um zero), mantenha os elementos únicos e encaixe cada linha:

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

1
16 bytes com o 2/:~@:|"1]|1]\.]retorno de uma lista de pares.
miles

@ miles Obrigado! Esta saída é aceitável?
Galen Ivanov

Na verdade não, eu perdi essa parte sobre valores distintos. Voltarei a isso daqui a pouco.
miles


1

Perl, 38 bytes

Inclui +3para-p

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

Saídas 1 para todos os pares, 2 para todos os ímpares, 3 para misto


1

Limpo , 95 65 63 bytes

import StdEnv

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

Experimente online!

Como lambda, pegando [Int]e retornando [Int], mapeando para:

  • 0: misturado
  • 1: tudo par
  • -1: todos ímpares



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));}}
  • Using truetrue instead of 2 for even
  • Using falsefalse instead of 1 for odd
  • Using truefalse instead of 0 for mixed

Explanation:

Try it 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 bytes

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

A complete example with output conversion:

(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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.