Nihai Numara


15

Meydan okuma

resim açıklamasını buraya girin

4 tamsayı dizisini (belirli bir algoritma tarafından oluşturulan bir sayı dizisini temsil eder ) alan ve izleyen bir sonraki tamsayıyı döndüren bir program yazın .

Yalnızca sabit (yani değişken olmayan) varyasyonlu basit toplama, çıkarma, çarpma ve bölme algoritmaları kullanacağız.

Bölme için floortamsayı değerlerini kullanacağız : 133/4 = 33ve33/4 = 8

Her zaman tek bir geçerli dönüş değeri olacağını varsayabilirsiniz.

Test senaryoları

[14,24,34,44] 54 (dönüş Algoritması) döndürmelidir

[105,45,-15,-75] -135 (çıkarma algoritması) döndürmelidir

[5,25,125,625] 3125 (çarpma algoritması) döndürmelidir

[256,64,16,4] 1 döndürmelidir (bölme algoritması)

Genel kurallar


2
Bu, Sırada ne var? ve sınırda yinelenen.
Peter Taylor

7
Gelecekte, başkalarının yorumlarını önceden alabilmeniz için yayınlanmadan önce Sandbox'ta yayınlamanızı tavsiye ederim .
Leaky Nun

5
Tamsayı bölümü için gerçekten bazı test örnekleri eklemelisiniz. Hemen hemen tüm yanıtlar [261,65,16,4], [4,2,1,0] veya [2,1,0,0] için doğru sonuç verememektedir
Damien

5
Yinelenen oylara katılmıyorum. Algoritmayı bulmak, dikkate alınması gereken tek bir işlem olması açısından daha basittir, ancak aynı zamanda daha zordur, çünkü tamsayı bölümünün hesaba katılması gerekir. Diğer zorluğun cevabını taşıdığının, sıfırdan yazmaktan çok daha kolay olacağını düşünmüyorum.
Dennis

3
Büyük olasılıkla negatif olmayan tamsayılar belirtmelisiniz, çünkü bir bölüm serisi negatif olduğunda iki yorum vardır. Örneğin -81/4ya 21 r 3ya -20 r -1.
Jonathan Allan

Yanıtlar:


6

05AB1E , 18 16 18 bayt

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

açıklama

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

Çevrimiçi deneyin!


[4,2,1,0] ile çıkış yanlış ...
Damien

@Damien: Bana bildirdiğiniz için teşekkürler. Bunu düzelttim ve hatta birkaç bayt kurtardı :)
Emigna

Harika. Şimdi tüm test vakalarımı geçerli kılıyor.
Damien

Dörde bölmek için kenar davasını deneyin:[-325, -82, -21, -6]
Jonathan Allan

... aslında soru ya negatif olmayan tamsayılar için olmalı ya da hangi kuralın kullanılacağını belirtmelidir.
Jonathan Allan

14

Javascript (ES6),  44   42  44 bayt (sabit)

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

IsmaelMiguel'in tavsiyesi üzerine 2 bayt kaydedildi. EDC65
için önerilen [2,1,0,0]ve [1,0,0,0]önerilen düzeltiler

30 bayt sürümü

Kayıt için ilk denemem 32 30 bayt oldu, ancak bölüm için zemin desteği yoktu. Ayrıca, [2,1,0,0]ve gibi özel durumlar için başarısız olur [1,0,0,0].

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

gösteri

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


Vay be, js'nin desen eşleşmesi olduğunu bilmiyordum.
Leaky Nun

@LeakyNun - Yıkım ataması gerçekten de ES6'da tanıtıldı. [a,b]=>İşlev parametreleri için yapamayacağınızı unutmayın . Parantezler zorunludur.
Arnauld

Güzel, ama tamsayı bölümünü işlemelisin: [260, 65, 16, 4] => 0.9846153846153847.
Damien

@Damien - Ah iyi ... Birisinin fark edeceğini biliyordum. ;-) Bu düzeltildi.
Arnauld

[2,1,0,0] ne olacak? 0 vermek gerekir. Bence bu b*2==c+a<=> toplama / çıkarma algoritması için tek sayaç örneği
Damien

11

Brachylog , 37 33 27 bayt

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

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

@LeakyNun sayesinde 10 bayt kaydedildi .

açıklama

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'un belirttiği gibi, çıkarma davasına ihtiyacımız yok çünkü Iherhangi bir tam sayı olabilir.


4
vay, brachylog (& prolog) harika
Maltysen

2
Toplama ve çıkarma aynı
Leaky Nun

1
@LeakyNun Doğru, teşekkürler!
14'te ölümcül



6

Haskell, 65 bayt

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 bayt

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

Kelimenin tam anlamıyla Python'a taşınan JS cevabı (teşekkürler @LeakyNun!). Önceki yaklaşımım gülünç derecede uzundu, ama işte burada:

Python 2, 169 166 bayt

İkinci ve üçüncü düzeyler ham sekme ve ham sekme artı Markdown ile gerçekten kötü oynayan bir boşluktur , bu nedenle sekmeler 2 boşlukla değiştirilmiştir.

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

Gayet basit; sabit olabileceğini düşündüğü her sabiti ve operatörü dener, eğer sabit / operatör kombinasyonu listedeki her eleman için çalışıyorsa ( önlemek için bir try/ exceptçift kullanarak ZeroDivisionError), listedeki son elemanın sonucunu yazdırır.

Eminim burada daha iyi bir yöntem vardır, bu naif yöntemdir.


Js cevabını Python'a
aktarsan iyi olur

Çıkması [1,0,0,0]gereken 0
Jonathan Allan

3

TSQL, 55 bayt

Bu komut dosyası aynı denetimde toplama ve çıkarma işlemlerini deniyor, sonra çoğalmaya çalışıyor, bu başarısız olursa bölme olmalı.

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

Vaktini boşa harcamak


3

C #, 63 bayt

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

Birinci ve ikinci eleman arasındaki farkın, ikinci ve üçüncü eleman arasındaki farkla aynı olup olmadığını kontrol eder. Eğer öyleyse toplama / çıkarma yapar, aksi takdirde çarpma / bölme yapar.


2

JavaScript, 73 bayt

(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

Testler :

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

Hepsi için çalışıyor.


1
Burada görgü kurallarından emin değildim. Zaten başka bir JS cevabı olduğunu biliyorum, ancak uç durumları ele almıyor. Benimki daha uzun, ama bunların hepsini hallediyor. Bunu doğru yapmadıysam bana haber ver.
16:13 de Whothehellisthat

1
Başka bir cevapla aynı dilde yanıt göndermenin yanlış bir yanı yoktur, özellikle de cevabınız doğruysa ve diğeri doğru değilse. Bunu yapmak için yeterli temsilciniz olup olmadığını bilmiyorum, ancak hangi kenar durumlarının eksik olduğunu bildirmek için bu cevaba yorum yapmak da isteyebilirsiniz.
James

Aslında bu diğer gönderiden son davaları aldım, ancak sorunu çözmediler. P
Whothehellisthat31

2

GameMaker Dili, 70 bayt

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

Dizi: 68 bayt

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 giriş: 45 bayt

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

Ek çözeltisi log, exp,var , 71 bayt

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

güncelleme: tamsayı bölümü


Bu bir dizi yerine dört değişken almıyor mu? Değilse b-abir bayt kaydetmek için etrafında parantez kurtulmak (ve ben örnek aramaları boşluk eklemek olduğunu unutmayın).
Jonathan Allan

@JonathanAllan Haklısın. Bir dizi almaz. Bayt sayısı güncellendi. Parantez başka bir nedenle gereklidir, ancak bunun yerine boşluk ekleyerek bir bayt kaydedebiliriz. Çağrıların ek alanlara ihtiyacı yoktur.
Vlo

Evet, bu yüzden 2 yerine 1 bayt tasarruf edebileceğinizi söyledim
Jonathan Allan

Not, şu anda tamsayı bölme gereksinimini tam olarak ele almamaktadır, örneğin 261,65,16,4, 0.9961686yerine döndürür 1(elbette soru için bunun için bir test durumu olmalıdır).
Jonathan Allan

1
@JonathanAllan işlevi (x) eğer (x [2] -x [1] == x [3] -x [2]) x [4] + x [2] -x [1] diğer x [4]% / % (x [1]% /% x [2])
Vlo

1

Java, 125 123 bayt

golfed:

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

Bu kod kesinlikle bazı sorunlara sahiptir, çünkü sıfıra bölünmeyi ve bu gibi şeyleri işlemez. Ayrıca, giriş dizisinde 4'ten fazla tamsayı varsa elbette işe yaramaz a. Bu aptal ötesinde yapar, ama eğlendim :)

Deneyin: https://ideone.com/nELH5I


1

TI-Basic, 37 bayt

Herhangi bir TI-83/84 hesap makinesinde çalışır

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 bayt

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

(Diğerlerinin çoğu gibi) doğru bir şekilde bölüm serisi için hitap etmedi önceki 38 bayt giriş çok daha uzun.

Test senaryoları ve daha fazla vaka ideone'de

Not: Burada bir negatif tamsayı bölümü bölen olarak aynı işaretin bir kalan sahip olarak tanımlanır, yani -81/4olacaktır -21bir geri kalan kısmı ile 3ve -81/-4olur 20bir geri kalan kısmı ile -1.


1
negatif sayının negatif sayıya bölünmesi pozitiftir ... -81/-4 != -21
Yıkılabilir Limon

@DestructibleWatermelon Gerçekten de öyle. Bunu düzenledim ve test senaryosunu ekledim [325, -82,20, -5].
Jonathan Allan

1

Jöle , 14 bayt

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

Çevrimiçi deneyin!

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

?-+vzJEyQ/^E2J-yEJ

Girdiyi satır satırıyla ayrılmış değerler listesi olarak kabul eder.

Çevrimiçi deneyin!

Açıklama:

?                         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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.