模数平价方


15

你给出的阵列Ñ严格为正整数,Ñ≥2

您的任务是将每个条目A i映射到:

  • 1如果Ĵ MOD甲是奇数每个Ĵ使得1≤Ĵ≤ÑĴ≠我
  • 2,如果Ĵ MOD甲是即使针对每个Ĵ使得1≤Ĵ≤ÑĴ≠我
  • 否则为0(混合奇偶校验)

对于A = [73,50,61],我们有:

  • 50模73 = 50,61模73 = 61 →混
  • 73模50 = 23,MOD 61 50 = 11 →所有奇数
  • 73模61 = 12,50 MOD 61 = 50 →所有偶数

因此,预期输出为[0,1,2]

规则

  • 您可以使用任何三个不同的值(任何类型),而不是012,因为他们是一致的,只要。如果您未使用挑战中所述的映射,请指定映射
  • 如果对此有任何疑问,则零为偶数
  • 这是,因此最短答案以字节为单位!

测试用例

[ 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任何一致的值都可以。所以是的,那行得通!
Arnauld

Answers:


9

Python 2中68个 67 66字节

-1字节归功于Xcoder先生
-1字节归功于ovs

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

在线尝试!

返回1,0,2代替0,1,2


更换(k<1)0**k的-1字节。
ovs

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.编辑可以接受的-啊我看你问这个问题询问:)
乔纳森·艾伦

另一种9字节的替代方法是¹-Ƥ%"%2‘Ṭ
英里

3

MATL,12字节

!G\o~tAws1=-

此用途0-11而不是012分别。

在线尝试!验证所有测试用例

说明

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

  • 感谢Peter Cordes的错误修复。
  • 感谢Peter Cordes,节省了四个 21字节;建议使用不同的输出值映射;。[0 1 2] ~ [3 2 1]
  • 保存了五个字节;使用另一个映射;[0 1 2] ~ [  ]
  • 保存一个字节;golfed 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上的测试函数没有传递足够的args,这种未定义的行为导致与上一个测试用例的零除(SIGFPE)。 f(I,7)用您用作本地变量的一个args 覆盖I[]A[]f())中的第一个元素。 f()假设arg是调用方在堆栈上传递的,但调用方不知道,返回地址上方的堆栈上实际是A[0]。(即,该UB导致tA[0]具有相同的地址)。无论如何,这只是TIO上测试功能中的 UB 。
彼得·科德斯

顺便说一句,我无法在本地重现崩溃,因此我不得不添加execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);到main中,以从TIO的gcc 7.2.1中获得asm,该ass与我的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

Mathematica,57 49 48字节

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

返回:

  • False.True0(混合)
  • True.True1(所有的奇数)
  • False.False对于2(甚至全部)

在线尝试!

这是一个稍长的选择(49字节):

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

这个返回:

  • 10(混合)
  • -11(所有的奇数)
  • 0对于2(甚至全部)

在线尝试!


2

红色,101字节

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

在线尝试!

返回1 0混合,1奇数和0偶数

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个字节

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]==否,!d== 1,false - 1== -1
  2. 如果全为奇模,则比数组的长度小*。(*累加器包括一个针对自身模量的元素,导致一个偶数模量。)(!a[d+1]== true,!d== 0,true - 0== 1
  3. 如果混合,则比数组的长度少两个或更多。(!a[d+1]==否,!d== 0,false - 0== 0

测试用例:


1

J27 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]\.]返回对列表。
英里

@哩谢谢!这个输出可以接受吗?
Galen Ivanov '18

实际上,不,我错过了有关独特价值的那一部分。我待会儿再讲。
英里


1

Perl,38个字节

包括+3用于-p

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

输出1表示所有偶数,2表示所有奇数,3表示混合


1

干净95 65 63字节

import StdEnv

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

在线尝试!

作为lambda,[Int]取回[Int],映射到:

  • 0:混合
  • 1:全部
  • -1:都很奇怪



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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.