最終番号


15

チャレンジ

enter image description here

4つの整数(特定のアルゴリズムによって生成された数値のシーケンスを表す)の配列を受け取り、その後に続く次の整数を返すプログラムを作成します。

単純な加算、減算、乗算、除算アルゴリズムのみを使用し、一定の(つまり非可変の)バリエーションを使用します。

除算のために我々は、使用するfloor整数値を:133/4 = 3333/4 = 8

常に1つの有効な戻り値があると仮定できます。

テストケース

[14,24,34,44] 54(追加アルゴリズム)を返す必要があります

[105,45,-15,-75] -135(減算アルゴリズム)を返す必要があります

[5,25,125,625] 3125(乗算アルゴリズム)を返す必要があります

[256,64,16,4] 1(分割アルゴリズム)を返す必要があります

一般的なルール


2
これは、次に来るものの簡略版です。および境界線の複製。
ピーターテイラー

7
将来的には、他の人のコメントを事前に受け取ることができるように、公開する前にSandboxに投稿することをお勧めします。
リーキー修道女

5
整数除算のテストケースを実際に追加する必要があります。ほとんどの返信は、[261,65,16,4]、[4,2,1,0]、または[2,1,0,0]に対して正しい結果を与えることができません
ダミアン

5
重複した投票に同意しません。アルゴリズムを見つけることは、考慮する操作が1つしかないという意味では簡単ですが、同時に、整数除算を考慮する必要があるため、より困難です。他の課題からの回答を移植することは、ゼロから作成するよりもかなり簡単だとは思いません。
デニス

3
除算系列が負の場合、2つの解釈があるため、おそらく非負の整数を指定する必要があります。たとえば-81/421 r 3または-20 r -1です。
ジョナサンアラン

回答:


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:知らせてくれてありがとう。私はそれを修正し、さらに数バイト節約しました:)
エミグナ

すごい。これで、すべてのテストケースが検証されます。
ダミアン

4で割るためのエッジケースをお試しください:[-325, -82, -21, -6]
ジョナサン・アラン

...実際には、質問は負ではない整数用であるか、使用する規則を指定する必要があると思います。
ジョナサンアラン

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にパターンマッチングがあることは知りませんでした。
リーキー修道女

@LeakyNun- ES6で実際に破壊の割り当てが導入されました。[a,b]=>関数パラメーターに対してはできないことに注意してください。括弧が必要です。
アーナルド

いいですが、整数除算を処理する必要があります:[260、65、16、4] => 0.9846153846153847。1-
ダミアン

@ダミアン-ああ...誰かが気付くと知っていた。;-)それは修正されました。
アーナルド

[2,1,0,0]はどうですか?0を指定する必要があります。これはb*2==c+a<=>加算/減算アルゴリズムの唯一の反例だと思います
ダミアン

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

2
加算と減算は同じです
リーキー修道女

1
@LeakyNun正しい、ありがとう!
16



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]

文字通りPythonに移植されたJSの回答です(@LeakyNunに感謝します!)。私の以前のアプローチは途方もなく長いものでしたが、それは次のとおりです。

Python 2、169 166バイト

2番目と3番目のレベルは、それぞれ未加工のタブと未加工のタブにスペースを加えたもので、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))

ものすごく単純; 定数と考えられるすべての定数と演算子を試し、定数/演算子の組み合わせがリスト内のすべての要素で機能する場合(s を避けるためにtry/ exceptペアを使用ZeroDivisionError)、リストの最後の要素の結果を出力します。

ここにはもっと良い方法があると確信しています。これは単純な方法です。


jsの回答をPythonに移植する方が良いでしょう
Leaky Nun

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

1番目と2番目の要素の違いが2番目と3番目の要素の違いと同じかどうかをチェックします。そうであれば、加算/減算を行い、そうでなければ乗算/除算を行います。


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回答が既にあることは知っていますが、それはエッジケースに対処していません。私のほうが長いですが、それらすべてを処理します。これを正しく行わなかった場合はお知らせください。
誰が

1
別の回答と同じ言語で回答を投稿することは、特にあなたの回答が正しく、他の回答がそうでない場合、何も問題はありません。十分な担当者がいるかどうかはわかりませんが、不足しているエッジケースを知らせるために、その回答にコメントすることもできます。
DJMcMayhem

私は実際に他の投稿からエッジケースを取り上げましたが、問題は解決していません。; P
16


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]

更新:整数除算


これは配列ではなく4つの変数をとっていませんか?そうでない場合はb-a、バイトを節約するために括弧を取り除くことができます(そして、例の呼び出しではスペースが追加されていることに注意してください)。
ジョナサンアラン

@JonathanAllanあなたは正しい。配列を取りません。バイト数が更新されました。括弧は他の理由で必要ですが、代わりにスペースを追加することでバイトを節約できます。呼び出しに追加のスペースは必要ありません。
Vlo

私はあなたが1つのバイトではなく2救うことができると言いました、なぜうん、それはだ
ジョナサン・アラン

現在、整数除算の要件を完全に処理していないことに注意してください。たとえば、261,65,16,4返されるの0.9961686ではなく1(もちろん、質問にはこのためのテストケースがあります)。
ジョナサンアラン

1
@JonathanAllan function(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-Basic、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バイトのエントリよりもはるかに長い(他のほとんどの人がそうでなかったように)。

テストケースとより多くのエッジケースがイデオンにあります

注:ここで負のための整数除算は、除数と同じ符号を持つ余りを有するものとして定義され、そう-81/4であろう-21の残り3-81/-4なり20の残り-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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.