最终号码


15

挑战

enter image description here

编写一个程序,该程序接受一个由4个整数组成的数组(表示由某种算法生成的数字序列),并返回随后的下一个整数。

我们将只使用简单的加,减,乘和除法算法,该算法具有恒定的(即不变的)变化。

对于除法,我们将使用floor整数值:133/4 = 3333/4 = 8

您可以假设总会有一个有效的返回值

测试用例

[14,24,34,44] 应该返回54(加法算法)

[105,45,-15,-75] 应该返回-135(减法算法)

[5,25,125,625] 应返回3125(乘法算法)

[256,64,16,4] 应该返回1(除法算法)

通用规则


2
这是“ 下一步做什么”的简化版本和边界重复。
彼得·泰勒

7
将来,我建议您先发布在沙箱中,然后再上线,以便您可以事先收到其他人的评论。
Leaky Nun

5
您确实应该为整数除法添加一些测试用例。几乎所有答复都无法给出[261,65,16,4],[4,2,1,0]或[2,1,0,0]的正确结果
Damien

5
我不同意重复的投票。从仅考虑一个操作的意义上讲,找到算法更简单,但同时,由于必须考虑整数除法,因此很难。我认为从另一个挑战移植一个答案要比从头开始写一个要容易得多。
丹尼斯

3
您可能应该指定非负整数,因为除数级数为负时,会有两种解释。例如-81/421 r 3-20 r -1
乔纳森·艾伦

Answers:


6

05AB1E18 16 18字节

D¥¬QPi`+s-ë`r/s\*î

说明

D                   # duplicate
 ¥                  # delta's
  ¬Q                # compare first delta to the other deltas
    P               # product (1 if all deltas are equal, otherwise 0)
     i              # if 1 (we're dealing with addition or subtraction)
      `+s-          # add the difference between the elements to the last element
          ë         # else (we're dealing with multiplication or division)
           `r/      # divide the 2nd element by the 1st
              s\*   # multiply with the 4th element
                 î  # round up

在线尝试!


输出错误[4,2,1,0] ...
Damien

@Damien:感谢您让我知道。我修复了它,它甚至为我节省了几个字节:)
Emigna '16

大。现在,它验证了我所有的测试用例。
达米安

尝试将边缘情况除以四:[-325, -82, -21, -6]
Jonathan Allan

...实际上,我想这个问题应该只是针对非负整数,或者应该指定要使用哪种约定。
乔纳森·艾伦

14

Javascript(ES6), 44   42  44字节(固定)

(a,b,c,d)=>a-b+d-c?d/(a<b?a/b:a/b|0)|0:d+c-b

按照IsmaelMiguel的建议,保存了2个字节。
固定版本[2,1,0,0],并[1,0,0,0]通过edc65的建议

30字节版本

为了记录,我的第一次尝试是32 30字节,但是缺少该分区的floor()支持。对于诸如[2,1,0,0]和的特殊情况,它也会失败[1,0,0,0]

(a,b,c,d)=>c-2*b+a?d*c/b:d+c-b

演示版

var f =
(a,b,c,d)=>a-b+d-c?d/(a<b?a/b:a/b|0)|0:d+c-b

var test = [
  [ 14, 24, 34, 44 ],     // should return 54 (addition Algorithm)
  [ 105, 45, -15, -75 ],  // should return -135 (subtraction algorithm)
  [ 5, 25, 125, 625 ],    // should return 3125 (multiplicative algorithm)
  [ 256, 64, 16, 4 ],     // should return 1 (division algorithm)
  [ 260, 65, 16, 4 ],     // should return 1 (division algorithm with floor())
  [ 2, 1, 0, 0 ],         // should return 0 (special case of division algorithm)
  [ 1, 0, 0, 0 ]          // should return 0 (special case of division algorithm)
];

test.forEach(l => console.log('[' + l.join`, `+ '] => ' + f(...l)));


哇,我不知道js具有模式匹配。
Leaky Nun

@LeakyNun- ES6中确实引入了销毁结构的任务。请注意,您不能[a,b]=>对函数参数进行操作。括号是必需的。
Arnauld

很好,但是您应该处理整数除法:[260、65、16、4] => 0.9846153846153847。应该给1
Damien

@Damien-嗯...我知道有人会注意到的。;-)是固定的。
Arnauld

那[2,1,0,0]呢?应该给0。我认为这是b*2==c+a<=>加/减算法的唯一反例
Damien

11

Brachylog37 33 27字节

b:[E]cL,?:Iz{:+a|:*a|:/a}Lt

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

@LeakyNun节省了10个字节

说明

Input = [A:B:C:D]

b:[E]cL,     L = [B:C:D:E]
?:Iz         Create the list [[B:I]:[C:I]:[D:I]:[E:I]]
{            Either…
    :+a          Sum all couples of that list
|            or…
    :*a          Multiply all couples of that list
|            or…
    :/a          Integer divide all couples of that list
}L          The result is L
t           Output is the last element of L

正如LeakyNun指出的,我们不需要减法,因为它I可以是任何整数。


4
哇,brachylog(&prolog)很棒
Maltysen '16

2
加法和减法相同
Leaky Nun

1
@LeakyNun正确,谢谢!
致命



6

Haskell,65个字节

f l@[a,b,c,d]|[a,b..d]==l=d+b-a|z<-b+0^b=div(d*b)$a-mod(max b a)z

5

Python 2,40个字节

lambda(a,b,c,d):[d+c-b,d*c/b][c-2*b+a>0]

从字面上看,这是将JS答案移植到Python中(感谢@LeakyNun!)。我以前的方法荒谬可笑,但是这里是:

Python 2中,169个 166字节

第二层和第三层分别是原始选项卡和原始选项卡以及一个空格,这在Markdown中的表现非常差,因此这些选项卡已被2个空格代替。

x=input()
q='%d%s%d'
for i in range(max(x)):
 for o in'+-*/':
  a=1
  for e,n in zip(x,x[1:]):
   try:1/(eval(q%(e,o,i))==n)
   except:a=0
  if a:print eval(q%(x[-1],o,i))

很简单;尝试每个它认为可能是常量的常量和运算符,然后,如果该常量/运算符组合适用于列表中的每个元素(使用try/ except对避免ZeroDivisionErrors),它将为列表中的最后一个元素打印结果。

我确定这里有更好的方法,这是幼稚的方法。


你最好只是口JS回答成Python
漏尼姑

[1,0,0,0]应当输出的中断0
乔纳森·艾伦

3

TSQL,55个字节

该脚本尝试在同一检查中进行加减运算,然后尝试相乘,如果失败,则必须进行除法运算。

DECLARE 
@1 INT=6561,
@2 INT=729,
@3 INT=81,
@  INT=9

PRINT IIF(@2-@1=@-@3,@*2-@3,IIF(@1*@2=@3,@*@1,sqrt(@)))

小提琴


3

C#,63个字节

int f(int[]x)=>2*x[1]-x[0]==x[2]?x[3]+x[1]-x[0]:x[3]*x[1]/x[0];

检查第一元素和第二元素之间的差异是否与第二元素和第三元素之间的差异相同。如果是这样,则进行加/减,否则进行乘法/除法。


2

JavaScript,73个字节

(a,b,c,d)=>(x=b-a,c-b==x&&d-c==x)?d+x:(x=b/a,b*x|0==c&&c*x|0==d)?d*x|0:-1

测试

console.log(s.apply(null,[14,24,34,44]), 54);
console.log(s.apply(null,[105,45,-15,-75]), -135);
console.log(s.apply(null,[5,25,125,625]), 3125);
console.log(s.apply(null,[256,64,16,4]), 1);

console.log(s.apply(null,[2,1,0,0]),0);
console.log(s.apply(null,[1,0,0,0]),0);
console.log(s.apply(null,[-325,-82,-21,-6]),-1);

console.log(s.apply(null,[-1,-1,-1,-1]),-1);
console.log(s.apply(null,[0,0,0,0]),0);

为他们所有。


1
不确定这里的礼节。我知道已经有了另一个JS答案,但是它无法解决极端情况。我的更长,但能处理所有这些。让我知道我是否做错了。
Whothehellisthat

1
以与另一答案相同的语言发布答案没有任何问题,尤其是当您的答案正确而另一答案不正确时。我不知道您是否有足够的代表这样做,但是您可能还想评论该答案,以使他们知道他们缺少哪些边缘情况。
DJMcMayhem

实际上,我从另一篇文章中拿到了一些案例,但他们还没有解决问题。; P
Whothehellisthat

2

GameMaker语言,70字节

a=argument0;If a[3]+a[1]=a[2]*2return a[4]*2-a[3]return a[4]*a[4]/a[3]

2

R,68 74

数组:68个字节

function(x)if(x[2]-x[1]==x[3]-x[2])x[4]+x[2]-x[1]else x[4]%/%(x[1]%/%x[2])

> (function(x)if(x[2]-x[1]==x[3]-x[2])x[4]+x[2]-x[1]else x[4]*x[2]/x[1])(c(14,24,34,44))
[1] 54

4个输入:45个字节

function(a,b,c,d)if(b-a==c-b)d+b-a else d*b/a

有花红溶液logexpvar,71个字节

if(var(v<-diff(x<-scan(,1)))==0)x[4]+v[1]else x[4]*exp(diff(log(x)))[1]

更新:整数除法


这不是采用四个变量而不是数组吗?如果不是这样,您可以删除括号b-a以节省一个字节(我注意到您的示例调用又增加了空格)。
乔纳森·艾伦

@JonathanAllan你是对的。它不需要数组。字节数已更新。由于其他原因,需要使用括号,但是我们可以通过添加空格来节省字节。呼叫不需要额外的空格。
Vlo

是的,这就是为什么我说您可以保存1个字节而不是2个字节
乔纳森·艾伦

注意,它当前不能完全处理整数除法要求,例如261,65,16,4返回0.9961686而不是1(当然,问题中应该有一个测试用例)。
乔纳森·艾伦

1
@JonathanAllan函数(x)if(x [2] -x [1] == x [3] -x [2])x [4] + x [2] -x [1] else x [4]%/ %(x [1]%/%x [2])
Vlo

1

Java,125 123字节

打高尔夫球:

int m(int[]a){int r=(a[1]>a[0])?a[1]/a[0]:a[0]/a[1];return(a[0]-a[1]==a[1]-a[2])?a[3]-a[0]+a[1]:(a[0]<a[1])?a[3]*r:a[3]/r;}

取消高尔夫:

int m(int[] a)
{
    int r = (a[1] > a[0]) ? a[1] / a[0] : a[0] / a[1];
    return (a[0] - a[1] == a[1] - a[2]) ? a[3] - a[0] + a[1] : (a[0] < a[1]) ? a[3] * r : a[3] / r;
}

该代码肯定存在一些问题,因为它不处理零除等问题。如果输入数组中的整数多于(或少于)4,那么它当然也不起作用a。这使它超出了愚蠢的范围,但是我玩得很开心:)

试试看:https : //ideone.com/nELH5I


1

TI基本(37字节)

适用于任何TI-83 / 84计算器

Input L1                     gets input into an array
L1(4)²/L1(3                  calculate the fifth number in a geometric series
If not(sum(ΔList(ΔList(L1    if ΔList(ΔList(L1)) yields an array of all zeroes
L1(4)2-L1(3                  calculate the fifth number in an arithmetic series
                             Ans is implicitly returned

1

Python 2,75 66 65 61字节

lambda(a,b,c,d):d*2-c if d-c==b-a else d*b/a or b and d/(a/b)

比我以前的38个字节的条目要长得多,该条目不能正确地满足分区的要求(就像大多数其他人不一样)。

测试用例和更多边缘用例在ideone上

注意:整数除法对于这里的负被定义为具有与所述符号相同的除数剩余部分,所以-81/4-21与其余3-81/-420具有的剩余部分-1


1
负数除以负数就是正...-81/-4 != -21
破坏的柠檬

@DestructibleWatermelon确实是。我已经对其进行了编辑,并添加了测试用例[325,-82,20,-5]。
乔纳森·艾伦

1

果冻,14字节

ṪḤ_ṪµṪ²:ṪµIE$?

在线尝试!

ṪḤ_ṪµṪ²:ṪµIE$?  Main Link =
             ?  If
          IE$   [condition]
          I     The differences between consecutive elements
           E    Is equal
ṪḤ_Ṫ            [then]
Ṫ               The last element
 Ḥ              Doubled
  _             Minus
   Ṫ            The last element (second-last of original list)
    µṪ²:Ṫµ      [else]
     Ṫ          The last element
      ²         Squared
       :        Divided by
        Ṫ       The last element (second-last of original list)

0

Pyth,18个字节

?-+vzJEyQ/^E2J-yEJ

接受输入作为以换行符分隔的值列表。

在线尝试!

说明:

?                         If
 -                          the following are not equal:
  +vzJE                      the sum of first and third values (and call the third value J)
       yQ                    and the second value * 2;
                            (i.e. if it is not an additive or subtractive formula)
          ^E2             Then: square the fourth value
         /   J              and divide by the third
?                         Else:
               yE           double the fourth value
              -  J          and subtract the third
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.