Mod 2多项式系数


14

quintopia在这里发布了计算多项式系数的挑战(此处的某些文本是从此处复制的)。有一个有趣的算法可以计算系数2的多项式。

给定数字列表k 1k 2,...,k m,输出多项式系数的余数:

在此处输入图片说明

降低模2.下列算法并此有效地:对于每个ķ ,计算的二进制展开ķ ,即,找到一个IJ,使得每个一个IJ是1或0和

在此处输入图片说明

如果存在j使r≠s rj = a sj = 1,则相关的mod 2多项式系数为0,否则mod 2多项式系数为1。

任务

编写一个程序或函数,该程序或函数采用m个数字k 1k 2,...,k m,并输出或返回相应的多项式系数。如果需要,您的程序可以选择将m作为附加参数。

  • 这些数字可以按喜欢的任何格式输入,例如分组到列表中或以一元编码或其他方式输入,只要多项式系数的实际计算是由您的代码执行的,而不是由编码过程执行的。

  • 如果多项式系数为奇数,则输出可以为任何真值,如果多项式系数为偶数,则输出可以为任何假值。

  • 不允许设计用于计算多项式系数的内置函数。

  • 有标准漏洞。

计分

这就是代码高尔夫:以字节为单位的最短解决方案获胜。

例子:

为了找到7、16和1000的多项式系数,我们对它们分别进行二进制扩展:

在此处输入图片说明

由于没有列具有不超过1的列,因此多项式系数是奇数,因此我们应该输出真实值。

为了找到7、16和76的多项式系数,我们对它们分别进行二进制扩展:

在此处输入图片说明

由于76和7的二进制扩展均为4,因此多项式系数为偶数,因此我们输出了falsey值。

测试用例:

Input: [2, 0, 1]
Output: Truthy

Input: [5,4,3,2,1]
Output: Falsey

Input: [1,2,4,8,16]
Output: Truthy

Input: [7,16,76]
Output: Falsey

Input: [7,16,1000]
Output: Truthy

Input: [545, 1044, 266, 2240]
Output: Truthy

Input: [1282, 2068, 137, 584]
Output: Falsey

Input: [274728976, 546308480, 67272744, 135004166, 16790592, 33636865]
Output: Truthy

Input: [134285315, 33849872, 553780288, 544928, 4202764, 345243648]
Output: Falsey

1
欢迎来到PPCG!不错的第一篇文章!
Rɪᴋᴇʀ

我认为,==如果允许翻转真假,那么几种平等的语言本可以节省一个字节。
与Orjan约翰森

@ØrjanJohansen听起来不错。
胡德

Answers:







2

JavaScript(ES6), 37 35 34字节

@ Mr.Xcoder节省了2个字节@ETHproductions
节省了1个字节

将总和与按位OR进行比较(如pizzapant184Leaky Nun所做的那样)为1 比我的初始方法短 3 4字节:

a=>(q=c=>eval(a.join(c)))`|`==q`+`

测试用例


Alt。版本,38字节

a=>!a.some((x,i)=>a.some(y=>i--&&x&y))

测试用例


从技术上讲,pizzapant184比我早了14秒……
Leaky Nun

-1个字节:a=>(q=c=>eval(a.join(c)))`|`==q`+`;
ETHproductions

@ETHproductions不错!在Node.js中可以正常工作。但是您设法使其在浏览器中运行了吗?
Arnauld

在Firefox 57中对我来说效果很好。您遇到错误还是只是无法正常工作?
ETH生产

@ETHproductions实际上,是的,它确实起作用。它恰好在repl.it上失败。
Arnauld

2

Haskell,38个字节

(==).sum<*>foldl1 xor是返回的匿名函数Bool。用作((==).sum<*>foldl1 xor) [2,0,1]

import Data.Bits
(==).sum<*>foldl1 xor

在线尝试!

  • 每个人都使用Pizzapant184和Leaky Nun的技巧几乎相同,除了使用Haskell运算符名称外,它节省了一个字节以供使用(按位)xor而不是(.|.)(按位或)。

  • (==).sum<*>foldl1 xor 是的无积分版本 \l->sum l==foldl1 xor l


2

Java 8,53字节

a->{int i=0,j=0;for(int x:a){i+=x;j|=x;}return i==j;}

的港口 @LeakyNun的果冻答案

说明:

在这里尝试。

a->{             // Method with integer-array parameter and boolean return-type
  int i=0,j=0;   //  Two integers, both starting at 0
  for(int x:a){  //  Loop over the array
    i+=x;        //   Add them to the first integer
    j|=x;}       //   And bitwise-OR it with the second integer
  return i==j;}  //  Return if both integers are the same after the loop




1

红色,78字节

f: func[x][b: :to-binary t: 0 s: b 0 foreach n x[t: t + n s: s or b n]s = b t]

怎么运行的:

取消高尔夫:

Red []
f: func [x][         -  a function taking a block as an argument
    b: :to-binary    -  an alias for the to-binary function
    t: 0             -  set the sum of the numbers to 0
    s: b 0           -  set the "or" total to binary 0
    foreach n x[     -  for each number in the block
        t: t + n     -  add it to the sum
        s: s or b n  -  bitwise or of its binary representation with the total
    ]
    s = b t          - are the sum (binary) and the "or" total equal?
]

在线尝试!



0

批处理,73个字节

@set/as=o=0
@for %%i in (%*)do @set/as+=%%i,o^|=%%i
@if %s%==%o% echo 1

输出1真实,虚假无益。Pizzapant184 / Leaky Nun算法的另一个明显端口。


0

J,10个字节

+/=+./&.#:

Pizzapant184和Leaky Nun的解决方案的另一个港口。

怎么运行的?

+/.&.#: -将数字转换为二进制,按位或应用2的幂,然后从二进制转换为十进制

+/ -通过添加减少输入

= -以上相等吗?

在线尝试!

简单的选择

J,12个字节

2>[:>./+/@#:

怎么运行的?

+/@#: -将每个数字转换为二进制并找到2的幂的和

>./ -找到最大值

2>-小于2吗?->真实

在线尝试!


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.