Ostateczny numer

15

Wyzwanie

wprowadź opis zdjęcia tutaj

Napisz program, który pobiera tablicę 4 liczb całkowitych ( która reprezentuje sekwencję liczb wygenerowaną przez określony algorytm ) i zwraca następną liczbę całkowitą, która będzie następować.

Będziemy używać tylko prostych algorytmów dodawania, odejmowania, mnożenia i dzielenia ze zmienną stałą (tj. Niezmienną).

Do podziału użyjemy floorwartości całkowitych: 133/4 = 33i33/4 = 8

Możesz założyć, że zawsze będzie jedna poprawna wartość zwracana

Przypadki testowe

[14,24,34,44] powinien zwrócić 54 (algorytm dodawania)

[105,45,-15,-75] powinien zwrócić -135 (algorytm odejmowania)

[5,25,125,625] powinien zwrócić 3125 (algorytm multiplikatywny)

[256,64,16,4] powinien zwrócić 1 (algorytm podziału)

Główne zasady

Daniel
źródło
2
To jest uproszczona wersja Co dalej? i kopia graniczna.
Peter Taylor
7
W przyszłości polecam publikowanie w piaskownicy przed rozpoczęciem transmisji, aby wcześniej móc otrzymywać komentarze innych osób.
Leaky Nun
5
Naprawdę powinieneś dodać kilka przypadków testowych do dzielenia liczb całkowitych. Prawie wszystkie odpowiedzi nie dają poprawnych wyników dla [261,65,16,4], [4,2,1,0] lub [2,1,0,0]
Damien
5
Nie zgadzam się ze zduplikowanymi głosami. Znalezienie algorytmu jest prostsze w tym sensie, że należy wziąć pod uwagę tylko jedną operację, ale jednocześnie jest trudniejsze, ponieważ należy uwzględnić podział na liczby całkowite. Nie sądzę, aby przeniesienie odpowiedzi z drugiego wyzwania było znacznie łatwiejsze niż napisanie jednego od zera.
Dennis
3
Prawdopodobnie powinieneś podać nieujemne liczby całkowite, ponieważ gdy szereg podziału jest ujemny, istnieją dwie interpretacje. Na przykład -81/4jest albo 21 r 3czy -20 r -1.
Jonathan Allan

Odpowiedzi:

6

05AB1E , 18 16 18 bajtów

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

Wyjaśnienie

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

Wypróbuj online!

Emigna
źródło
Dane wyjściowe są niepoprawne w przypadku [4,2,1,0] ...
Damien
@Damien: Dzięki za poinformowanie mnie. Naprawiłem to, a nawet zaoszczędziłem kilka bajtów :)
Emigna
Świetny. Teraz sprawdza poprawność wszystkich moich przypadków testowych.
Damien
Spróbuj podzielić przypadek na cztery:[-325, -82, -21, -6]
Jonathan Allan
... właściwie wydaje mi się, że pytanie powinno dotyczyć tylko liczb całkowitych nieujemnych lub powinno określać, która konwencja ma być zastosowana.
Jonathan Allan
14

JavaScript (ES6),  44   42  44 bajty (stały)

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

Zapisano 2 bajty, zgodnie z radą IsmaelMiguel.
Naprawiono wersję dla [2,1,0,0]i [1,0,0,0]jak sugeruje edc65

Wersja 30 bajtów

Dla przypomnienia, moją pierwszą próbą było 32 30 bajtów, ale brakowało obsługi floor () dla podziału. Nie działa również w szczególnych przypadkach, takich jak [2,1,0,0]i [1,0,0,0].

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

Próbny

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
źródło
Wow, nie wiedziałem, że js ma dopasowanie wzorca.
Leaky Nun
@LeakyNun - Przydział Destrukturyzacji rzeczywiście został wprowadzony w ES6. Zauważ, że nie możesz tego zrobić [a,b]=>dla parametrów funkcji. Nawiasy są wymagane.
Arnauld
Fajnie, ale powinieneś poradzić sobie z dzieleniem liczb całkowitych: [260, 65, 16, 4] => 0,9846153846153847. Powinien dać 1
Damien
@Damien - Ach cóż ... Wiedziałem, że ktoś to zauważy. ;-) Naprawiono.
Arnauld
Co z [2,1,0,0]? Powinien dać 0. Myślę, że to jedyny przeciwny przykład dla b*2==c+aalgorytmu dodawania / odejmowania <=>
Damien
11

Brachylog , 37 33 27 bajtów

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

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Zaoszczędź 10 bajtów dzięki @LeakyNun .

Wyjaśnienie

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

Jak wskazał LeakyNun, nie potrzebujemy wielkości odejmowania, ponieważ Imoże to być dowolna liczba całkowita.

Fatalizować
źródło
4
wow, brachylog (i prolog) są niesamowite
Maltysen
2
Dodawanie i odejmowanie jest takie samo
Leaky Nun
1
@LeakyNun Prawidłowe, dzięki!
Fatalize
3
29 bajtów
Leaky Nun
3
27 bajtów
Leaky Nun
6

Haskell, 65 bajtów

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
źródło
5

Python 2, 40 bajtów

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

To dosłownie odpowiedź JS przeniesiona do Pythona (dzięki @LeakyNun!). Moje poprzednie podejście było absurdalnie długie, ale oto:

Python 2, 169 166 bajtów

Drugi i trzeci poziom to odpowiednio surowa karta i surowa karta plus spacja, która bardzo źle gra z Markdown, więc karty zostały zastąpione 2 spacjami.

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

Dość proste; wypróbowuje każdą stałą i operator, który według niej może być stałą, to jeśli kombinacja stała / operator działa dla każdego elementu na liście (przy użyciu try/except pary aby uniknąć ZeroDivisionErrors), wypisuje wynik dla ostatniego elementu na liście.

Jestem pewien, że jest tutaj lepsza metoda, to naiwna metoda.

Miedź
źródło
Lepiej po prostu przenieś odpowiedź js do Pythona
Leaky Nun
Przerwy, [1,0,0,0]które powinny dać wynik0
Jonathan Allan
3

TSQL, 55 bajtów

Ten skrypt próbuje dodawać i odejmować w ramach tej samej kontroli, a następnie próbuje się pomnożyć, jeśli to się nie powiedzie, musi to być podział.

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

Skrzypce

t-clausen.dk
źródło
3

C #, 63 bajty

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

Sprawdza, czy różnica między pierwszym i drugim elementem jest taka sama, jak różnica między drugim i trzecim elementem. Jeśli tak, dodaje / odejmuje, w przeciwnym razie dokonuje mnożenia / dzielenia.

Scepheo
źródło
2

JavaScript, 73 bajty

(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

Testy :

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

Działa dla nich wszystkich.

Kto to do cholery jest
źródło
1
Nie byłam pewna co do etykiety tutaj. Wiem, że jest już inna odpowiedź JS, ale nie dotyczy ona przypadków skrajnych. Mój jest dłuższy, ale obsługuje wszystkie te. Daj mi znać, jeśli nie zrobiłem tego dobrze.
Whothehellisthat,
1
Nie ma nic złego w opublikowaniu odpowiedzi w tym samym języku co inna odpowiedź, szczególnie jeśli Twoja odpowiedź jest poprawna, a druga nie. Nie wiem, czy masz wystarczającą liczbę przedstawicieli, aby to zrobić, ale możesz również skomentować tę odpowiedź, aby poinformować ich, które przypadki skrajne brakuje.
James
Właściwie wziąłem sprawy z tego drugiego postu, ale nie rozwiązały problemu. ; P
Whothehellisthat
2

GameMaker Language, 70 bajtów

a=argument0;If a[3]+a[1]=a[2]*2return a[4]*2-a[3]return a[4]*a[4]/a[3]
Timtech
źródło
2

R, 68 74

Tablica: 68 bajtów

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 wejścia: 45 bajtów

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

Roztwór Bonus log, exp, var, 71 bajtów

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

aktualizacja: dzielenie liczb całkowitych

Vlo
źródło
Czy to nie bierze czterech zmiennych zamiast tablicy? Jeśli nie, możesz pozbyć się nawiasów, b-aaby zaoszczędzić bajt (i zauważam, że twoje przykładowe wywołania dodają spacje).
Jonathan Allan
@JonathanAllan Masz rację. Nie wymaga tablicy. Liczba bajtów została zaktualizowana. Nawiasy są potrzebne z innych powodów, ale możemy zapisać bajt, dodając spację. Połączenia nie wymagają dodatkowych spacji.
Vlo
Tak, dlatego powiedziałem, że możesz zaoszczędzić 1 bajt zamiast 2
Jonathan Allan
Zauważ, że obecnie nie obsługuje on w pełni wymogu podziału liczb całkowitych, np. 261,65,16,4Zwraca ( 0.9961686zamiast 1oczywiście (w pytaniu powinno być w tym przypadku test).
Jonathan Allan
1
@JonathanAllan funkcja (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

Jawa, 125 123 bajty

Gra w golfa:

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

Nie golfowany:

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

Ten kod z pewnością ma pewne problemy, ponieważ nie obsługuje dzielenia przez zero i takie rzeczy. Oczywiście to również nie zadziała, jeśli w tablicy wejściowej znajduje się więcej (lub mniej) 4 liczb całkowitycha . Co czyni go bardziej głupim, ale dobrze się bawiłem :)

Wypróbuj: https://ideone.com/nELH5I

brzoskwinia
źródło
1

TI-Basic, 37 bajtów

Działa na dowolnym kalkulatorze 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
źródło
1

Python 2, 75 66 65 61 bajtów

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

Znacznie dłużej niż mój poprzedni 38-bajtowy wpis, który nie spełniał poprawnie serii podziałów (tak jak większość innych nie).

Przypadki testowe i więcej przypadków na krawędzi są na ideone

Uwaga: podział całkowitą o ujemnej jest tu zdefiniowane jako posiadające resztę o tym samym znaku, co dzielnik, więc -81/4będzie -21w dalszej części 3, a -81/-4będzie 20z resztą -1.

Jonathan Allan
źródło
1
liczba ujemna podzielona przez liczbę ujemną jest dodatnia ...-81/-4 != -21
Destructible Lemon
@DestructibleWatermelon Rzeczywiście tak jest. Zedytowałem to i dodałem przypadek testowy [325, -82, 20, -5].
Jonathan Allan
1

Galaretka , 14 bajtów

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

Wypróbuj 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
źródło
0

Pyth, 18 bajtów

?-+vzJEyQ/^E2J-yEJ

Akceptuje dane wejściowe jako listę wartości oddzieloną znakiem nowej linii.

Wypróbuj online!

Wyjaśnienie:

?                         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.
źródło