หมายเลขสุดท้าย


15

ท้าทาย

ป้อนคำอธิบายรูปภาพที่นี่

เขียนโปรแกรมที่ใช้อาร์เรย์จำนวนเต็ม 4 ตัว ( ซึ่งหมายถึงลำดับของตัวเลขที่สร้างโดยอัลกอริธึมที่แน่นอน ) และส่งคืนจำนวนเต็มถัดไปที่จะตามมา

เราจะใช้อัลกอริธึมการบวกการลบการคูณและการหารอย่างง่าย ๆ ด้วยรูปแบบคงที่เท่านั้น (เช่นไม่มีตัวแปร)

สำหรับการหารเราจะใช้floorค่าจำนวนเต็ม: 133/4 = 33และ33/4 = 8

คุณสามารถสมมติว่าจะมีค่าส่งคืนที่ถูกต้องหนึ่งค่าเสมอ

กรณีทดสอบ

[14,24,34,44] ควรกลับ 54 (อัลกอริธึมเพิ่มเติม)

[105,45,-15,-75] ควรกลับมา -135 (อัลกอริทึมการลบ)

[5,25,125,625] ควรกลับ 3125 (อัลกอริทึมแบบ multiplicative)

[256,64,16,4] ควรกลับ 1 (อัลกอริทึมการหาร)

กฎทั่วไป


2
นี่เป็นเวอร์ชั่นที่เรียบง่ายของWhat are next ถัดไป? และเส้นขอบที่ซ้ำกัน
Peter Taylor

7
ในอนาคตฉันแนะนำให้คุณโพสต์ในแซนด์บ็อกซ์ก่อนที่จะเผยแพร่เพื่อให้คุณสามารถรับความคิดเห็นของผู้อื่นได้ล่วงหน้า
Leun Nun

5
คุณควรเพิ่มกรณีทดสอบสำหรับการหารจำนวนเต็ม คำตอบเกือบทั้งหมดล้มเหลวในการให้ผลลัพธ์ที่ถูกต้องสำหรับ [261,65,16,4], [4,2,1,0] หรือ [2,1,0,0]
Damien

5
ฉันไม่เห็นด้วยกับการลงคะแนนซ้ำ การค้นหาอัลกอริทึมนั้นง่ายกว่าในแง่ที่ว่ามีเพียงหนึ่งการดำเนินการที่ต้องพิจารณา แต่ในเวลาเดียวกันมันก็ยากกว่าเพราะการหารจำนวนเต็ม ฉันไม่คิดว่าจะมีการตอบคำถามจากการท้าทายอื่น ๆ จะง่ายกว่าการเขียนตั้งแต่ต้น
Dennis

3
คุณควรระบุจำนวนเต็มที่ไม่เป็นลบเช่นเมื่อซีรีย์หารเป็นลบจะมีการตีความสองแบบ ยกตัวอย่างเช่น-81/4เป็นทั้งหรือ21 r 3 -20 r -1
Jonathan Allan

คำตอบ:


6

05AB1E , 18 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: ขอบคุณที่แจ้งให้เราทราบ ฉันแก้ไขมันและยังช่วยฉันสักสองสามไบต์ :)
Emigna

ยิ่งใหญ่ ตอนนี้มันตรวจสอบกรณีทดสอบของฉันทั้งหมด
ดาเมียน

ลองใช้ตัวพิมพ์เล็กเพื่อแบ่งเป็นสี่:[-325, -82, -21, -6]
Jonathan Allan

... จริง ๆ แล้วฉันเดาว่าคำถามนั้นควรจะเป็นแค่จำนวนเต็มไม่เป็นลบหรือควรระบุแบบแผนที่จะใช้
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

บันทึก 2 ไบต์ตามคำแนะนำของ IsmaelMiguel
รุ่นที่แก้ไขสำหรับ[2,1,0,0]และ[1,0,0,0]ตามที่แนะนำโดย edc65

รุ่น 30 ไบต์

สำหรับบันทึกความพยายามครั้งแรกของฉันคือ32 30 ไบต์ แต่ขาดการสนับสนุน () สำหรับการแบ่ง นอกจากนี้ยังล้มเหลวสำหรับกรณีพิเศษเช่นและ[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 มีการจับคู่รูปแบบ
Leun Nun

@LeakyNun - มีการแนะนำการทำลายล้างใน ES6 โปรดทราบว่าคุณไม่สามารถทำได้[a,b]=>สำหรับพารามิเตอร์ฟังก์ชัน จำเป็นต้องใส่วงเล็บ
Arnauld

ดี แต่คุณควรจัดการกับการหารจำนวนเต็ม: [260, 65, 16, 4] => 0.9846153846153847 ควรให้ 1
ดาเมียน

@Damien - เอ่อ ... ฉันรู้ว่ามีคนสังเกตเห็น ;-) นั่นคือการแก้ไข
Arnauld

แล้ว [2,1,0,0] ล่ะ? ควรให้ 0 ฉันคิดว่ามันเป็นเพียงตัวอย่างเดียวสำหรับb*2==c+aอัลกอริธึมการเพิ่ม / การแทนที่ / <st> substraction
Damien

11

Brachylog , 37 33 27 ไบต์

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

ที่บันทึกไว้ 10 ไบต์ขอบคุณที่ @LeakyNun

คำอธิบาย

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
การบวกและการลบเหมือนกัน
Leaky Nun

1
@LeakyNun ถูกต้องขอบคุณ!
ลดขนาด




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
Leaky Nun

ตัวแบ่ง[1,0,0,0]ที่ควรส่งออก0
Jonathan Allan

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

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

ทางออกโบนัสด้วย log , exp, var71 ไบต์

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

update: การหารจำนวนเต็ม


นี่ไม่ใช่การรับตัวแปรสี่ตัวแทนที่จะเป็นอาร์เรย์ใช่หรือไม่ ถ้าไม่ใช่คุณสามารถกำจัดวงเล็บที่อยู่รอบ ๆb-aเพื่อบันทึกไบต์ได้ (และฉันทราบว่าการเรียกตัวอย่างของคุณเพิ่มช่องว่างกลับเข้าไป)
Jonathan Allan

@JanathanAllan คุณพูดถูก มันไม่ได้ใช้อาร์เรย์ จำนวนไบต์ได้รับการปรับปรุง จำเป็นต้องใช้วงเล็บเพราะอย่างอื่น แต่เราสามารถบันทึกไบต์ด้วยการเพิ่มช่องว่างแทน การโทรไม่ต้องการช่องว่างเพิ่มเติม
Vlo

ใช่นั่นคือเหตุผลที่ฉันบอกว่าคุณสามารถบันทึก 1 ไบต์มากกว่า 2
โจนาธานอัลลัน

หมายเหตุปัจจุบันยังไม่สามารถจัดการกับข้อกำหนดการหารจำนวนเต็มทั้งหมดเช่น261,65,16,4ส่งคืน0.9961686มากกว่า1(แน่นอนควรมีกรณีทดสอบสำหรับคำถามนี้)
Jonathan Allan

1
ฟังก์ชัน @JonathanAllan (x) ถ้า (x [2] -x [1] == x [3] -x [2]) x [4] + x [2] -x [1] อื่น ๆ 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;}

Ungolfed:

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 ไบต์ก่อนหน้าของฉันซึ่งไม่รองรับชุดส่วนอย่างถูกต้อง (เช่นเดียวกับที่คนอื่นไม่ได้ทำ)

กรณีทดสอบและกรณีขอบเพิ่มเติมอยู่ในideone

หมายเหตุ: การแบ่งจำนวนเต็มเชิงลบที่นี่ถูกกำหนดให้เป็นมีที่เหลือที่มีเครื่องหมายเดียวกันเป็นตัวหารดังนั้น-81/4จะเป็น-21กับส่วนที่เหลือของ3และ-81/-4จะเป็นกับส่วนที่เหลือของ20-1


1
จำนวนลบหารด้วยจำนวนลบเป็นค่าบวก ...-81/-4 != -21
มะนาวที่ถูกทำลายได้

@ ทำลายน้ำแตงโมแน่นอนมันเป็น ฉันได้แก้ไขแล้วและเพิ่มกรณีทดสอบ [325, -82,20, -5]
Jonathan Allan

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.