Angka Terakhir

15

Tantangan

masukkan deskripsi gambar di sini

Tulis sebuah program yang mengambil array 4 bilangan bulat ( yang mewakili urutan angka yang dihasilkan oleh algoritma tertentu ) dan mengembalikan bilangan bulat berikutnya yang akan mengikuti.

Kami hanya akan menggunakan algoritma penjumlahan, pengurangan, perkalian, dan pembagian sederhana dengan variasi konstan (yaitu non-variabel).

Untuk divisi kita akan menggunakan nilai floorinteger: 133/4 = 33dan33/4 = 8

Anda dapat mengasumsikan bahwa akan selalu ada satu nilai pengembalian yang valid

Uji kasus

[14,24,34,44] harus mengembalikan 54 (tambahan Algoritma)

[105,45,-15,-75] harus mengembalikan -135 (algoritma pengurangan)

[5,25,125,625] harus mengembalikan 3125 (algoritme multiplikatif)

[256,64,16,4] harus mengembalikan 1 (algoritma pembagian)

Aturan umum

Daniel
sumber
2
Ini adalah versi sederhana dari Apa yang akan terjadi selanjutnya? dan duplikat garis batas.
Peter Taylor
7
Di masa depan, saya sarankan Anda untuk mengirim di Sandbox sebelum ditayangkan sehingga Anda dapat menerima komentar orang lain sebelumnya.
Leaky Nun
5
Anda harus benar-benar menambahkan beberapa test case untuk pembagian integer. Hampir semua balasan gagal memberikan hasil yang benar untuk [261,65,16,4], [4,2,1,0], atau [2,1,0,0]
Damien
5
Saya tidak setuju dengan suara rangkap. Menemukan algoritma lebih sederhana dalam arti bahwa hanya ada satu operasi untuk dipertimbangkan, tetapi pada saat yang sama, itu lebih sulit karena pembagian integer harus diperhitungkan. Saya tidak berpikir ada porting jawaban dari tantangan lain akan jauh lebih mudah daripada menulis satu dari awal.
Dennis
3
Anda mungkin harus menentukan bilangan bulat non-negatif, karena ketika seri pembagian negatif ada dua interpretasi. Misalnya -81/4adalah 21 r 3atau -20 r -1.
Jonathan Allan

Jawaban:

6

05AB1E , 18 16 18 byte

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

Penjelasan

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

Cobalah online!

Emigna
sumber
Outputnya salah dengan [4,2,1,0] ...
Damien
@ Damen: Terima kasih telah memberi tahu saya. Saya memperbaikinya dan bahkan menyelamatkan saya beberapa byte :)
Emigna
Bagus. Sekarang ini memvalidasi semua kasus pengujian saya.
Damien
Coba tepi case untuk dibagi oleh empat:[-325, -82, -21, -6]
Jonathan Allan
... sebenarnya saya kira pertanyaannya harus hanya untuk bilangan bulat non-negatif atau harus menentukan konvensi mana yang akan digunakan.
Jonathan Allan
14

Javascript (ES6),  44   42  44 byte (tetap)

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

Disimpan 2 byte, mengikuti saran IsmaelMiguel.
Memperbaiki versi untuk [2,1,0,0]dan [1,0,0,0]seperti yang disarankan oleh edc65

Versi 30 byte

Sebagai catatan, upaya pertama saya adalah 32 30 byte tetapi kurang dukungan lantai () untuk divisi. Itu juga gagal untuk kasus khusus seperti [2,1,0,0]dan [1,0,0,0].

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

Demo

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)));

Arnauld
sumber
Wow, saya tidak tahu bahwa js memiliki pencocokan pola.
Leaky Nun
@LeakyNun - Penugasan penghancuran memang diperkenalkan di ES6. Perhatikan bahwa Anda tidak dapat melakukannya [a,b]=>untuk parameter fungsi. Dibutuhkan tanda kurung.
Arnauld
Bagus, tetapi Anda harus menangani pembagian bilangan bulat: [260, 65, 16, 4] => 0.9846153846153847. Itu harus memberi 1
Damien
@ Damen - Ah well ... Saya tahu seseorang akan memperhatikan. ;-) Itu sudah diperbaiki.
Arnauld
Bagaimana dengan [2,1,0,0]? Harus memberikan 0. Saya pikir itu satu-satunya contoh counter untuk b*2==c+a<=> algoritma penambahan / substraksi
Damien
11

Brachylog , 37 33 27 byte

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

Cobalah online!atau verifikasi semua kasus uji .

Disimpan 10 byte berkat @LeakyNun .

Penjelasan

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

Seperti yang LeakyNun tunjukkan, kita tidak perlu kasus pengurangan karena Ibisa berupa bilangan bulat apa pun.

Fatalisasi
sumber
4
wow, brachylog (& prolog) luar biasa
Maltysen
2
Penambahan dan pengurangannya sama
Leaky Nun
1
@ LeakyNun Benar, terima kasih!
Fatalkan
3
29 byte
Leaky Nun
3
27 byte
Leaky Nun
6

Haskell, 65 byte

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
Damien
sumber
5

Python 2, 40 byte

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

Ini benar-benar jawaban JS porting ke Python (terima kasih @LeakyNun!). Pendekatan saya sebelumnya sangat panjang, tapi ini dia:

Python 2, 169 166 byte

Level kedua dan ketiga adalah tab mentah dan tab mentah ditambah spasi, yang masing-masing memainkan sangat buruk dengan Markdown, sehingga tab telah digantikan oleh 2 spasi.

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

Cukup mudah; mencoba setiap konstanta dan operator yang dianggapnya adalah konstanta, maka jika kombinasi konstanta / operator berfungsi untuk setiap elemen dalam daftar (menggunakan a try/ exceptpair untuk menghindariZeroDivisionError s), ia mencetak hasil untuk elemen terakhir dalam daftar.

Saya yakin ada metode yang lebih baik di sini, ini adalah metode naif.

Tembaga
sumber
Anda sebaiknya hanya port jawaban js ke Python
Leaky Nun
Istirahat [1,0,0,0]yang seharusnya menghasilkan0
Jonathan Allan
3

TSQL, 55 byte

Skrip ini mencoba menambahkan dan mengurangi dalam centang yang sama, kemudian mencoba untuk menggandakan, jika gagal, itu harus pembagian.

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(@)))

Biola

t-clausen.dk
sumber
3

C #, 63 byte

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

Cek apakah perbedaan antara elemen pertama dan kedua sama dengan perbedaan antara elemen kedua dan ketiga. Jika demikian, ia melakukan penambahan / pengurangan, jika tidak maka akan terjadi perkalian / pembagian.

Scepheo
sumber
2

JavaScript, 73 byte

(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

Tes :

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);

Bekerja untuk mereka semua.

Siapa itu
sumber
1
Tidak yakin dengan etiket di sini. Saya tahu sudah ada jawaban JS lain, tetapi tidak membahas kasus tepi. Milik saya lebih lama, tetapi menangani semua itu. Beri tahu saya jika saya tidak melakukan ini dengan benar.
Whothehellisthat
1
Tidak ada yang salah dengan memposting jawaban dalam bahasa yang sama dengan jawaban lain, terutama jika jawaban Anda benar dan yang lainnya tidak. Saya tidak tahu apakah Anda memiliki cukup perwakilan untuk melakukannya, tetapi Anda mungkin juga ingin mengomentari jawaban itu untuk memberi tahu mereka kasus tepi mana yang hilang.
DJMcMayhem
Saya benar-benar mengambil kasus tepi dari pos lain itu, tetapi mereka belum menyelesaikan masalah. ; P
Whothehellisthat
2

Bahasa GameMaker, 70 byte

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

R, 68 74

Array: 68 byte

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 input: 45 byte

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

Solusi bonus dengan log, exp, var, 71 bytes

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

pembaruan: pembagian integer

Vlo
sumber
Bukankah ini mengambil empat variabel daripada array? Jika tidak, Anda bisa menghilangkan tanda kurung di sekitar b-auntuk menyimpan byte (dan saya perhatikan bahwa panggilan contoh Anda menambahkan spasi kembali).
Jonathan Allan
@ Jonathan Allan Kamu benar. Tidak perlu array. Hitungan byte telah diperbarui. Tanda kurung diperlukan karena ada yang lain, tetapi kita bisa menghemat byte dengan menambahkan spasi. Panggilan tidak membutuhkan ruang tambahan.
Vlo
Yap, itu sebabnya saya bilang Anda bisa menghemat 1 byte daripada 2
Jonathan Allan
Catatan, saat ini tidak sepenuhnya menangani persyaratan pembagian bilangan bulat, mis. 261,65,16,4Mengembalikan 0.9961686daripada 1(tentu saja harus ada uji kasus untuk ini dalam pertanyaan).
Jonathan Allan
1
@JonathanAllan berfungsi (x) jika (x [2] -x [1] == x [3] -x [2]) x [4] + x [2] -x [1] selain itu x [4]% / % (x [1]% /% x [2])
Vlo
1

Java, 125 123 byte

Golf:

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;}

Tidak Disatukan:

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;
}

Kode ini pasti memiliki beberapa masalah karena tidak menangani pembagian dengan nol dan hal-hal semacam itu. Tentu saja ini juga tidak akan berfungsi jika ada lebih dari (atau kurang) dari 4 bilangan bulat di dalam array input a. Yang membuatnya sangat bodoh, tapi aku bersenang-senang :)

Cobalah: https://ideone.com/nELH5I

Peech
sumber
1

TI-Basic, 37 byte

Berfungsi pada kalkulator 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
Timtech
sumber
1

Python 2, 75 66 65 61 byte

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

Jauh lebih lama dari entri 38 byte saya sebelumnya yang tidak memenuhi seri divisi dengan benar (seperti kebanyakan orang lain tidak).

Kasus uji dan lebih banyak kasus tepi ada di ideone

Catatan: pembagian integer untuk negatif di sini didefinisikan sebagai memiliki sisa dengan tanda yang sama dengan pembagi, sehingga -81/4akan -21dengan sisa 3dan -81/-4akan 20dengan sisa -1.

Jonathan Allan
sumber
1
negative number divided by negative number is positive... -81/-4 != -21
Destructible Lemon
@DestructibleWatermelon Indeed it is. I have edited that and added the test case [325,-82,20,-5].
Jonathan Allan
1

Jelly, 14 bytes

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

Try it online!

ṪḤ_ṪµṪ²:Ṫµ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)
HyperNeutrino
sumber
0

Pyth, 18 Bytes

?-+vzJEyQ/^E2J-yEJ

Accepts input as a newline-separated list of values.

Try it online!

Explanation:

?                         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
Steven H.
sumber