Số cuối cùng


15

Thử thách

nhập mô tả hình ảnh ở đây

Viết chương trình lấy một mảng gồm 4 số nguyên ( đại diện cho một chuỗi các số được tạo bởi một thuật toán nhất định ) và trả về số nguyên tiếp theo sẽ theo sau.

Chúng tôi sẽ chỉ sử dụng các thuật toán cộng, trừ, nhân và chia đơn giản với một biến thể không đổi (tức là không biến).

Để phân chia, chúng tôi sẽ sử dụng các floorgiá trị nguyên: 133/4 = 3333/4 = 8

Bạn có thể giả định rằng sẽ luôn có một giá trị trả về hợp lệ duy nhất

Các trường hợp thử nghiệm

[14,24,34,44] nên trả về 54 (Thuật toán bổ sung)

[105,45,-15,-75] nên trả về -135 (thuật toán trừ)

[5,25,125,625] nên trả về 3125 (thuật toán nhân)

[256,64,16,4] nên trả về 1 (thuật toán chia)

Quy tắc chung


2
Đây là phiên bản đơn giản hóa của Điều gì tiếp theo? và đường biên trùng lặp.
Peter Taylor

7
Trong tương lai, tôi khuyên bạn nên đăng bài trong Sandbox trước khi phát hành trực tuyến để bạn có thể nhận được bình luận của người khác trước.
Nữ tu bị rò rỉ

5
Bạn thực sự nên thêm một số trường hợp thử nghiệm để phân chia số nguyên. Hầu như tất cả các câu trả lời không đưa ra kết quả chính xác cho [261,65,16,4], [4.2,1,0] hoặc [2,1,0,0]
Damien

5
Tôi không đồng ý với (các) phiếu bầu trùng lặp. Việc tìm kiếm thuật toán đơn giản hơn theo nghĩa chỉ có một thao tác để xem xét, nhưng đồng thời, nó khó hơn vì phải tính toán phân chia số nguyên. Tôi không nghĩ rằng có một câu trả lời từ thử thách khác sẽ dễ dàng hơn nhiều so với viết từ đầu.
Dennis

3
Bạn có thể nên chỉ định các số nguyên không âm, vì khi một chuỗi phân chia âm có hai cách hiểu. Ví dụ -81/4là một trong hai 21 r 3hoặc -20 r -1.
Jonathan Allan

Câu trả lời:


6

05AB1E , 18 16 18 byte

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

Giải trình

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

Hãy thử trực tuyến!


Đầu ra sai với [4.2,1,0] ...
Damien

@Damien: Cảm ơn đã cho tôi biết. Tôi đã sửa nó và nó thậm chí còn tiết kiệm cho tôi một vài byte :)
Emigna

Tuyệt quá. Bây giờ nó xác nhận tất cả các trường hợp thử nghiệm của tôi.
Damien

Hãy thử trường hợp cạnh để chia cho bốn:[-325, -82, -21, -6]
Jonathan Allan

... thực sự tôi đoán câu hỏi nên chỉ dành cho số nguyên không âm hoặc nên chỉ định quy ước nào sẽ được sử dụng.
Jonathan Allan

14

Javascript (ES6),  44   42  44 byte (đã sửa)

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

Đã lưu 2 byte, theo lời khuyên của IsmaelMiguel.
Đã sửa phiên bản cho [2,1,0,0][1,0,0,0]theo đề xuất của edc65

Phiên bản 30 byte

Đối với bản ghi, lần thử đầu tiên của tôi là 32 30 byte nhưng thiếu hỗ trợ sàn () cho phân chia. Nó cũng thất bại cho các trường hợp đặc biệt như [2,1,0,0][1,0,0,0].

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

Bản giới thiệu

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


Ồ, tôi không biết rằng js có khớp mẫu.
Nữ tu bị rò rỉ

@LeakyNun - Nhiệm vụ hủy cấu trúc đã thực sự được giới thiệu trong ES6. Lưu ý rằng bạn không thể làm [a,b]=>cho các tham số chức năng. Các dấu ngoặc đơn là bắt buộc.
Arnauld

Đẹp, nhưng bạn nên xử lý phép chia số nguyên: [260, 65, 16, 4] => 0.9846153846153847. Nó sẽ cung cấp cho 1
Damien

@Damien - À ... tôi biết sẽ có người chú ý. ;-) Điều đó đã được sửa.
Arnauld

Còn [2,1,0,0] thì sao? Nên cho 0. Tôi nghĩ đó là ví dụ phản biện duy nhất cho b*2==c+a<=> thuật toán cộng / nền
Damien

11

Brachylog , 37 33 27 byte

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

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Đã lưu 10 byte nhờ @LeakyNun .

Giải trình

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

Như LeakyNun đã chỉ ra, chúng tôi không cần trường hợp trừ vì Icó thể là bất kỳ số nguyên nào.


4
wow, brachylog (& prolog) thật tuyệt vời
Maltysen

2
Phép cộng và phép trừ là như nhau
Leaky Nun

1
@LeakyNun Đúng, cảm ơn!
Gây tử vong vào



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

5

Python 2, 40 byte

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

Đó đúng là câu trả lời của JS được chuyển sang Python (cảm ơn @LeakyNun!). Cách tiếp cận trước đây của tôi rất dài một cách nực cười, nhưng đây là:

Python 2, 169 166 byte

Cấp thứ hai và thứ ba là một tab thô và một tab thô cộng với một khoảng trắng , tương ứng, chơi rất tệ với Markdown, vì vậy các tab đã được thay thế bằng 2 khoảng trắng.

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

Khá đơn giản; thử mọi hằng số và toán tử mà nó nghĩ có thể là hằng số, sau đó nếu tổ hợp toán tử / toán tử hoạt động cho mọi phần tử trong danh sách (sử dụng try/ exceptcặp để tránh ZeroDivisionErrors), nó sẽ in kết quả cho phần tử cuối cùng trong danh sách.

Tôi chắc chắn có một phương pháp tốt hơn ở đây, đây là phương pháp ngây thơ.


Tốt hơn hết là bạn nên chuyển câu trả lời của js vào Python
Leaky Nun

Nghỉ giải lao [1,0,0,0]sẽ xuất ra0
Jonathan Allan

3

TSQL, 55 byte

Kịch bản này đang thử cộng và trừ trong cùng một kiểm tra, sau đó nó cố gắng nhân lên, nếu thất bại, nó phải được chia.

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

Vĩ cầm


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

Kiểm tra xem sự khác biệt giữa yếu tố thứ nhất và thứ hai có giống như sự khác biệt giữa yếu tố thứ hai và thứ ba hay không. Nếu vậy, nó sẽ cộng / trừ, nếu không nó sẽ nhân / chia.


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

Các xét nghiệm :

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

Làm việc cho tất cả họ.


1
Không chắc chắn về nghi thức ở đây. Tôi biết đã có một câu trả lời JS khác, nhưng nó không giải quyết các trường hợp cạnh. Của tôi là dài hơn, nhưng xử lý tất cả những người. Hãy cho tôi biết nếu tôi không làm điều này đúng.
Whothehellisthat

1
Không có gì sai khi đăng một câu trả lời bằng cùng một ngôn ngữ với câu trả lời khác, đặc biệt nếu câu trả lời của bạn là đúng và câu trả lời khác thì không. Tôi không biết nếu bạn có đủ đại diện để làm như vậy, nhưng bạn cũng có thể muốn nhận xét về câu trả lời đó để cho họ biết những trường hợp cạnh nào họ đang thiếu.
DJMcMayhem

Tôi thực sự đã lấy các trường hợp cạnh từ bài đăng khác, nhưng họ đã không giải quyết vấn đề. ; P
Whothehellisthat

2

Ngôn ngữ 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]

2

R, 68 74

Mảng: 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 đầu vào: 45 byte

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

Giải pháp thưởng với log, exp, var, 71 byte

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

cập nhật: chia số nguyên


Đây không phải là lấy bốn biến chứ không phải là một mảng? Nếu không, bạn có thể thoát khỏi dấu ngoặc đơn xung quanh b-ađể lưu một byte (và tôi lưu ý rằng các cuộc gọi ví dụ của bạn đang thêm khoảng trắng trở lại).
Jonathan Allan

@Jonathan ALLan Bạn nói đúng. Nó không có một mảng. Số lượng byte đã được cập nhật. Dấu ngoặc đơn là cần thiết do người khác, nhưng chúng ta có thể lưu một byte bằng cách thêm một khoảng trắng thay thế. Các cuộc gọi không cần thêm không gian.
Vlo

Đúng, đó là lý do tại sao tôi nói bạn có thể tiết kiệm 1 byte thay vì 2
Jonathan Allan

Lưu ý, hiện tại nó không xử lý đầy đủ yêu cầu phân chia số nguyên, ví dụ 261,65,16,4trả về 0.9961686chứ không phải 1(tất nhiên phải có trường hợp kiểm tra cho điều này trong câu hỏi).
Jonathan Allan

1
Hàm @Jonathan ALLan (x) if (x [2] -x [1] == x [3] -x [2]) x [4] + x [2] -x [1] khác x [4]% / % (x [1]% /% x [2])
Vlo

1

Java, 125 123 byte

Chơi gôn

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

Ung dung:

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

Mã này chắc chắn có một số vấn đề vì nó không xử lý chia cho số 0 và những thứ như vậy. Tất nhiên nó cũng không hoạt động nếu có nhiều hơn (hoặc ít hơn) 4 số nguyên trong mảng đầu vàoa . Điều đó làm cho nó vượt quá ngu ngốc, nhưng tôi đã có niềm vui :)

Dùng thử: https://ideone.com/nELH5I


1

TI-Basic, 37 byte

Hoạt động trên mọi máy tính 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 byte

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

Lâu hơn nhiều so với mục nhập 38 byte trước đây của tôi không phục vụ chính xác cho chuỗi phân chia (giống như hầu hết các mục khác).

Các trường hợp thử nghiệm và nhiều trường hợp cạnh là trên ideone

Lưu ý: phép chia số nguyên cho âm ở đây được định nghĩa là có phần dư có cùng dấu với ước số, do đó -81/4sẽ -21có phần còn lại 3-81/-4sẽ 20có phần còn lại -1.


1
số âm chia cho số âm là dương ...-81/-4 != -21
Lemon phá hủy

@DeststallibleWateriwi Quả thực là như vậy. Tôi đã chỉnh sửa nó và thêm trường hợp thử nghiệm [325, -82,20, -5].
Jonathan Allan

1

Thạch , 14 byte

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

Hãy thử trực tuyến!

ṪḤ_ṪµṪ²:Ṫµ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

Bình thường, 18 byte

?-+vzJEyQ/^E2J-yEJ

Chấp nhận đầu vào dưới dạng danh sách giá trị được phân tách bằng dòng mới.

Hãy thử trực tuyến!

Giải trình:

?                         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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.