Кінцевий номер


15

Виклик

введіть тут опис зображення

Напишіть програму, яка приймає масив із 4 цілих чисел ( який представляє послідовність чисел, породжених певним алгоритмом ) і повертає наступне ціле число, яке було б наступним.

Ми будемо використовувати лише алгоритми простого складання, віднімання, множення та ділення з постійною (тобто незмінною) варіацією.

Для ділення будемо використовувати floorцілі значення: 133/4 = 33і33/4 = 8

Ви можете припустити, що завжди буде одне дійсне повернене значення

Тестові справи

[14,24,34,44] має повернути 54 (алгоритм додавання)

[105,45,-15,-75] має повернути -135 (алгоритм віднімання)

[5,25,125,625] має повернути 3125 (мультиплікативний алгоритм)

[256,64,16,4] повинен повернути 1 (алгоритм поділу)

Загальні правила


2
Це спрощена версія Що далі? і прикордонний дублікат.
Пітер Тейлор

7
Надалі я рекомендую вам опублікувати в Sandbox перед тим, як перейти наживо, щоб ви могли заздалегідь отримувати коментарі інших людей.
Leaky Nun

5
Вам слід дійсно додати кілька тестових випадків для цілого поділу. Майже всі відповіді не дають правильного результату для [261,65,16,4], [4,2,1,0] або [2,1,0,0]
Демієн

5
Я не погоджуюся з дублюючими голосами. Пошук алгоритму простіший в тому сенсі, що слід розглянути лише одну операцію, але в той же час, це складніше, оскільки потрібно враховувати ціле ділення. Я не думаю, що передати відповідь з іншого виклику було б суттєво простіше, ніж написати з нуля.
Денніс

3
Вам, мабуть, слід вказати невід’ємні цілі числа, тому що, коли ряд ділення є від’ємним, є дві інтерпретації. Наприклад -81/4, 21 r 3або -20 r -1.
Джонатан Аллан

Відповіді:


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]
Джонатан Аллан

... Насправді я здогадуюсь, що питання повинно бути лише для невід'ємних цілих чисел, або повинно вказати, яку умову слід використовувати.
Джонатан Аллан

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 є відповідність шаблонів.
Leaky Nun

@LeakyNun - Завдання з руйнування дійсно було запроваджено в ES6. Зверніть увагу, що ви не можете робити [a,b]=>для параметрів функції. Дужки потрібні.
Арнольд

Добре, але вам слід обробити цілий поділ: [260, 65, 16, 4] => 0,9846153846153847. Він повинен дати 1
Демієна

@Damien - Ну добре ... Я знав, що хтось помітить. ;-) Це виправлено.
Арнольд

А як щодо [2,1,0,0]? Потрібно дати 0. Я думаю, що це єдиний зустрічний приклад для b*2==c+aалгоритму додавання / субстракції <=>
Демієн

11

Брахілог , 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
уау, брахілог (& пролог) приголомшливий
Малтісен

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

Досить простий; намагається кожну константу та оператор, який, на її думку, може бути константою, тоді, якщо комбінація константа / оператор працює для кожного елемента в списку (використовуючи a try/ exceptпару, щоб уникнути ZeroDivisionErrors), він друкує результат для останнього елемента в списку.

Я впевнений, що тут є кращий метод, це наївний метод.


Тобі краще просто перенести відповідь js на Python
Leaky Nun

Перерви, для [1,0,0,0]яких слід вийти0
Джонатан Аллан

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, але вона не стосується кращих випадків. Моя довша, але обробляє все це. Дайте мені знати, якщо я не зробив це правильно.
Хто все, що

1
Немає нічого поганого в опублікуванні відповіді тією ж мовою, що й інша відповідь, особливо якщо ваша відповідь правильна, а інша - ні. Я не знаю, чи є у вас достатньо представників для цього, але ви, можливо, також захочете прокоментувати цю відповідь, щоб вони могли знати, у яких крайніх випадках вони відсутні.
Джеймс

Насправді я взяв кращі справи з цієї іншої посади, але вони не вирішили питання. ; P
Хто все, що

2

Мова GameMaker, 70 байт

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

Масив: 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

Bonus рішення з log, exp,var , 71 байт

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

оновлення: ціле ділення


Хіба це не чотири змінних, а не масив? Якщо ні, ви можете позбутися дужок навколо, b-aщоб зберегти байт (і зауважу, що ваші приклади викликів додають пробіли назад).
Джонатан Аллан

@JonathanAllan Ви маєте рацію. Це не приймає масив. Кількість байтів оновлено. Дужки потрібні через інше, але ми можемо зберегти байт, додавши натомість пробіл. Для дзвінків не потрібні додаткові місця.
Вло

Так, тому я сказав, що ви можете зберегти 1 байт, а не 2
Джонатан Аллан

Зверніть увагу, вона наразі не повністю відповідає вимозі поділу на цілі числа, наприклад, а не 261,65,16,4повертається (звичайно, у цьому питанні має бути тестовий випадок). 0.99616861
Джонатан Аллан

1
@JonathanAllan функція (x) якщо (x [2] -x [1] == x [3] -x [2]) x [4] + x [2] -x [1] else x [4]% / % (x [1]% /% x [2])
Вло

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

Безголівки:

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
Лимон, що

@DestructibleWatermelon Дійсно так і є. Я це відредагував і додав тестовий випадок [325, -82,20, -5].
Джонатан Аллан

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

Піт, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.