Modułowa partia parzystości


15

Podane są tablicę A z n ściśle dodatnimi liczbami całkowitymi, a n 2 .

Twoim zadaniem jest zmapowanie każdego wpisu A i do:

  • 1, jeżeli A j mod A i jest nieparzyste dla każdego j, tak że 1 ≤ j ≤ n i j ≠ i
  • 2, jeżeli A j mod Ai jest nawet dla każdego j taki, że 1 ≤ j ≤ n i j ≠ i
  • 0 w przeciwnym razie (mieszane parytety)

Przykład

Dla A = [73, 50, 61] mamy:

  • 50 mod 73 = 50 , 61 mod 73 = 61 → mieszany
  • 73 mod 50 = 23 , 61 mod 50 = 11 → wszystkie nieparzyste
  • 73 mod 61 = 12 , 50 mod 61 = 50 → wszystkie parzyste

Dlatego oczekiwany wynik to [0, 1, 2] .

Zasady

  • Możesz użyć dowolnych trzech różnych wartości (dowolnego typu) zamiast 0 , 1 i 2, o ile są one spójne. Podaj swoje mapowanie, jeśli nie korzystasz z opisanego w wyzwaniu.
  • W razie jakichkolwiek wątpliwości zero jest parzyste .
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

Przypadki testowe

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


Czy wartości wyjściowe muszą być liczbami całkowitymi lub będzie [1], [0, 1]i [1, 1]praca?
Dennis

@Dennis Wszelkie spójne wartości są w porządku. Tak, to by zadziałało!
Arnauld

Odpowiedzi:


9

Python 2 , 68 67 66 bajtów

-1 bajt dzięki Mr. Xcoder
-1 bajt dzięki ovs

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

Wypróbuj online!

Zwraca 1,0,2zamiast tego 0,1,2.


zastępuje (k<1)się 0**kprzez około 1 bajtu.
ovs

4

Galaretka , 9 bajtów

%þœ-€0Ḃ‘Ṭ

Zwraca [1, 1], [0, 1], [1] zamiast 0, 1, 2 .

Wypróbuj online!

Jak to działa

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

Czy możesz wymienić ‘ṬUḄz Q€Ḅzapisać bajt?
Jonathan Allan

Niestety nie. Q€może wrócić [0, 1]lub [1, 0].
Dennis

Och, racja. Myślę [1], [1,1]i [0,1]są trzy różne wartości, tak %þœ-€0Ḃ‘Ṭpowinno być do zaakceptowania dla 9. Edycja - ach widzę dokładnie pytasz to pytanie :)
Jonathan Allan

Inną 9-bajtową alternatywą jest¹-Ƥ%"%2‘Ṭ
mil

3

MATL , 12 bajtów

!G\o~tAws1=-

Wykorzystuje 0, -1, 1zamiast 0, 1, 2odpowiednio.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

!    % 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 bajtów

  • Podziękowania dla Petera Cordesa za naprawienie błędów.
  • Zaoszczędził cztery dwadzieścia jeden bajtów dzięki Peterowi Cordesowi ; sugerowanie zastosowania innego mapowania wartości wyjściowej; [0 1 2] ~ [3 2 1].
  • Zapisano pięć bajtów; używając jeszcze innego mapowania; [0 1 2] ~ [  ].
  • Zapisano bajt; grał for(i=0;i<n;i++,putchar...w golfa 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);}}

Wypróbuj online!


Twoje funkcje testowe w TIO nie przekazują wystarczającej liczby argumentów, a to niezdefiniowane zachowanie prowadzi do podziału przez zero (SIGFPE) od ostatniego przypadku testowego. f(I,7)nadpisuje pierwszy element I[]( A[]in f ()) jednym z argumentów, których używasz jako miejscowych. f()zakłada, że ​​arg został przekazany na stos przez rozmówcę, ale dzwoniący nie wiedział o tym, a to, co faktycznie znajduje się na stosie powyżej adresu zwrotnego, to A[0]. (tj. ten UB spowodował ti A[0]ma ten sam adres). W każdym razie jest to tylko UB w twojej funkcji testowej na TIO.
Peter Cordes,

I BTW, nie mogłem lokalnie naprawić awarii, więc musiałem dodać execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);do main, aby uzyskać asm z gcc 7.2.1 TIO, który nie pasował dokładnie do mojego gcc Arch Linux 7.2.1. Po przekształceniu tego deasemblera z powrotem w źródło asm dla funkcji wywołującej, mogłem ponownie go lokalnie zainstalować w gdb i potwierdzić dokładnie, co się dzieje.
Peter Cordes,

Możesz zaoszczędzić bajty, używając innego odwzorowania, na przykład 1 na parzyste, 2 na nieparzyste, 3 na mieszane, więc możesz o|=1<<(A[j]%A[i]%2)bez potrzeby wymyślnego dekodowania o.
Peter Cordes,

@PeterCordes Dziękuję za uwagę, mimo że nadal nie rozumiem w pełni, dlaczego pierwszy wpis w tablicy zostaje zastąpiony. Teraz zdecydowałem się użyć zmiennych globalnych zamiast lokalnych, usuwając niezdefiniowane zachowanie.
Jonathan Frech,

@PeterCordes Wziąłem również twoją sugestię gry w golfa i udało mi się zaoszczędzić cztery bajty. Nie wiem jednak, czy to było to, co sugerowałeś, ponieważ pisałeś o|=1<<...zamiast czegoś podobnego o|=1<<(t=....
Jonathan Frech,

3

Mathematica, 57 49 48 bajtów

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

Zwraca to:

  • False.Truedla 0 (mieszane)
  • True.Trueza 1 (wszystkie nieparzyste)
  • False.Falseza 2 (wszystkie parzyste)

Wypróbuj online!

Oto nieco dłuższa alternatywa (49 bajtów):

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

Ten zwraca:

  • 1dla 0 (mieszane)
  • -1za 1 (wszystkie nieparzyste)
  • 0za 2 (wszystkie parzyste)

Wypróbuj online!


2

Czerwony , 101 bajtów

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

Wypróbuj online!

Zwraca 1 0mieszane, 1nieparzyste i 0parzyste

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 bajtów

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

Zwraca -1 (parzysty), 1 (nieparzysty) i 0 (mieszany).

Jak to działa:

dAkumulator będzie:

  1. Zero, jeśli wszystkie moduły parzyste. ( !a[d+1]== fałsz, !d== 1, false - 1== -1 )
  2. Jeden mniej * niż długość tablicy, jeśli wszystkie moduły nieparzyste. ( * Akumulator zawiera element zmodulowany względem siebie, co daje jeden parzysty moduł.) ( !a[d+1]== true, !d== 0, true - 0== 1 )
  3. Dwa lub więcej mniej niż długość tablicy w przypadku miksu. ( !a[d+1]== fałsz, !d== 0, false - 0== 0 )

Przypadki testowe:


1

jot , 27 20 bajtów

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

Wypróbuj online!

Używa [1 0] [1] [0] zamiast 0 1 2

Wyjaśnienie:

|/~ - tworzy stół z resztkami:

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

2|nieparzysty czy parzysty? :

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

<@~.@}:@\:"1 - posortuj, upuść ostatni element (zawsze zero), zachowaj oryginalne elementy i zaznacz każdy wiersz:

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

1
16 bajtów ze 2/:~@:|"1]|1]\.]zwróconą listą par.
mile

@ mile Dziękujemy! Czy to wyjście jest akceptowalne?
Galen Iwanow

Właściwie nie, tęskniłem za tą częścią dotyczącą odrębnych wartości. Wrócę do tego za chwilę.
mile


1

Perl, 38 bajtów

Obejmuje +3dla-p

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

Wyjścia 1 dla wszystkich parzystych, 2 dla wszystkich nieparzystych, 3 dla mieszanych


1

Czysty , 95 65 63 bajtów

import StdEnv

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

Wypróbuj online!

Jako lambda, biorąc [Int]i wracając [Int], mapowanie na:

  • 0: mieszane
  • 1: wszystkie nawet
  • -1: wszystkie nieparzyste



1

Java 8, 91 89 bajtów

a->{for(int z:a){int s=1;for(int y:a)s+=y%z%2;System.out.print(" "+(s<a.length)+(s<2));}}
  • Używanie truetruezamiast2 parzystego
  • Używanie falsefalsezamiast1 nieparzystych
  • Używanie truefalsezamiast 0mieszanych

Wyjaśnienie:

Wypróbuj 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 bajty

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

Kompletny przykład z konwersją danych wyjściowych:

(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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.