Партія модульного паритету


15

Вам дається масив A з n суворо додатних цілих чисел, з n ≥ 2 .

Ваше завдання - скласти карту кожного запису A i на:

  • 1, якщо A j mod A i є непарним для кожного j таким, що 1 ≤ j ≤ n і j ≠ i
  • 2, якщо A j mod A i навіть для кожного j такий, що 1 ≤ j ≤ n і j ≠ i
  • 0 інакше (змішані паритети)

Приклад

Для A = [73, 50, 61] маємо:

  • 50 мод 73 = 50 , 61 мод 73 = 61 → змішаний
  • 73 мод 50 = 23 , 61 мод 50 = 11 → все непарно
  • 73 мод 61 = 12 , 50 мод 61 = 50 → всі рівні

Тому очікуваний вихід становить [0, 1, 2] .

Правила

  • Ви можете використовувати будь-які три різних значення (будь-якого типу) замість 0 , 1 і 2 , якщо вони відповідають. Будь ласка, вкажіть своє відображення, якщо ви не використовуєте описане в виклику.
  • Якщо в цьому є сумніви, нуль рівномірний .
  • Це , тому найкоротша відповідь у байтах виграє!

Тестові справи

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


Є чи вихідні значення повинні бути цілими числами або б [1], [0, 1]і [1, 1]роботу?
Денніс

@Dennis Будь-які послідовні значення добре. Так так, це б спрацювало!
Арнольд

Відповіді:



4

Желе , 9 байт

%þœ-€0Ḃ‘Ṭ

Повертає [1, 1], [0, 1], [1] замість 0, 1, 2 .

Спробуйте в Інтернеті!

Як це працює

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

Чи не могли б ви замінити ‘ṬUḄз , Q€Ḅщоб зберегти байти?
Джонатан Аллан

На жаль, ні. Q€міг повернутися [0, 1]або [1, 0].
Денніс

О, так. Я думаю [1], [1,1]і [0,1]є три різних значення, тому вони %þœ-€0Ḃ‘Ṭповинні бути прийнятними для 9. EDIT - ах, я бачу, ви задали саме це питання :)
Джонатан Аллан

Ще одна альтернатива 9 байт¹-Ƥ%"%2‘Ṭ
милі

3

MATL , 12 байт

!G\o~tAws1=-

При цьому використовується 0, -1, 1замість того 0, 1, 2відповідно.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

!    % 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 байт

  • Дякуємо Пітеру Кордесу за виправлення помилок.
  • Збережено чотири двадцять один байт завдяки Пітеру Кордесу ; пропонувати використовувати інше відображення значень вихідних значень; [0 1 2] ~ [3 2 1].
  • Збережено п’ять байтів; використання ще одного відображення; [0 1 2] ~ [  ].
  • Збережено байт; гольф for(i=0;i<n;i++,putchar...до 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);}}

Спробуйте в Інтернеті!


Ваші тестові функції в TIO не передають достатньо аргументів, і ця невизначена поведінка призводить до ділення на нуль (SIGFPE) від останнього тестового випадку. f(I,7)перезаписує перший елемент I[]( A[]у f ()) одним із аргументів, які ви використовуєте як локальні. f()припускає, що аргумент був переданий на стек абонентом, але той, хто телефонує, цього не знав, і що насправді знаходиться у стеку над зворотною адресою A[0]. (тобто цей UB спричинив tі A[0]мати однакову адресу). У всякому разі, це лише UB у вашій тестовій функції на TIO.
Пітер Кордес

І BTW, я не міг спростувати аварію локально, тому мені довелося додати execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);до main, щоб отримати asm від gcc 7.2.1 TIO, який не відповідав моєму Arch Linux gcc 7.2.1. Після повернення цього розбирання назад у джерело ASM для викличної функції, я міг спростувати його локально всередині gdb і підтвердити, що саме відбувається.
Пітер Кордес

Ви можете зберегти байти, використовуючи інше відображення, як 1 для парного, 2 для непарного, 3 для змішаного, так що ви можете o|=1<<(A[j]%A[i]%2)без необхідності фантазійного декодування o.
Пітер Кордес

@PeterCordes Дякую за те, що зауважив, хоча я ще не повністю розумію, чому перший запис масиву перезаписується. Зараз я вирішив використовувати глобальні змінні замість локальних, видаляючи невизначене поведінку.
Джонатан Фрех

@PeterCordes Я також прийняв вашу пропозицію про гольф і встиг зберегти чотири байти. Однак я не знаю, чи справді це було те, що ви пропонували, як ви писали o|=1<<...замість чогось узгодженого o|=1<<(t=....
Джонатан Фрех

3

Математика, 57 49 48 байт

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

Це повертає:

  • False.Trueдля 0 (змішано)
  • True.Trueдля 1 (все непарно)
  • False.Falseдля 2 (усі рівні)

Спробуйте в Інтернеті!

Ось трохи довша альтернатива (49 байт):

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

Цей повертає:

  • 1для 0 (змішано)
  • -1для 1 (все непарно)
  • 0для 2 (усі рівні)

Спробуйте в Інтернеті!



2

JavaScript (ES6), 46 байт

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

Повертає -1 (парні), 1 (непарні) та 0 (змішані).

Як це працює:

dАкумулятор буде:

  1. Нуль, якщо всі навіть модулі. ( !a[d+1]== false, !d== 1, false - 1== -1 )
  2. На один менше *, ніж довжина масиву, якщо всі непарні модулі. ( * Акумулятор включає в себе елемент, модульований проти самого себе, в результаті чого виникає один рівний модуль.) ( !a[d+1]== true, !d== 0, true - 0== 1 )
  3. На дві або більше довжини масиву, якщо суміш. ( !a[d+1]== false, !d== 0, false - 0== 0 )

Тестові приклади:


1

J , 27 20 байт

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

Спробуйте в Інтернеті!

Використовує [1 0] [1] [0] замість 0 1 2

Пояснення:

|/~ - складає таблицю з залишками:

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

2|непарне чи парне? :

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

<@~.@}:@\:"1 - сортуйте, скиньте останній елемент (завжди нуль), збережіть елементи ùnique та поле для кожного рядка:

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

1
16 байт із 2/:~@:|"1]|1]\.]поверненням списку пар.
милі

@ милі Дякую! Чи прийнятний цей вихід?
Гален Іванов

Насправді ні, я пропустив цю частину про різні цінності. Я повернусь до цього трохи.
милі


1

Perl, 38 байт

Включає +3для-p

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

Виходи 1 для всіх парних, 2 для всіх непарних, 3 для змішаних





1

Java 8, 91 89 байт

a->{for(int z:a){int s=1;for(int y:a)s+=y%z%2;System.out.print(" "+(s<a.length)+(s<2));}}
  • Використання truetrueзамість 2рівного
  • Використання falsefalseзамість 1непарного
  • Використання truefalseзамість 0змішаного

Пояснення:

Спробуйте в Інтернеті.

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 байти

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

Повний приклад з перетворенням виводу:

(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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.