Финальный номер

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
В будущем я рекомендую вам публиковать в Песочнице перед выходом в эфир, чтобы вы могли получать комментарии других людей заранее.
Утренняя монахиня
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

Попробуйте онлайн!

Emigna
источник
Вывод неправильный с [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 байта, следуя совету Исмаэля Мигеля.
Исправлена ​​версия для [2,1,0,0]и [1,0,0,0]как предложено edc65

Версия 30 байтов

Для записи, моя первая попытка была 32 30 байт, но мне не хватало поддержки floor () для деления. Это также не помогает в особых случаях, таких как [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)));

Arnauld
источник
Вау, я не знал, что у js есть соответствие шаблону.
Утренняя монахиня
@LeakyNun - Разрушающее назначение действительно было введено в ES6. Обратите внимание, что вы не можете сделать [a,b]=>для параметров функции. Скобки обязательны.
Арно
Хорошо, но вы должны обработать целочисленное деление: [260, 65, 16, 4] => 0,9846153846153847. Это должно дать 1
Дэмиен
@Damien - Ну хорошо ... Я знал, что кто-то заметит. ;-) Это исправлено.
Арно
Как насчет [2,1,0,0]? Должен дать 0. Я думаю, что это единственный контрпример для b*2==c+a<=> алгоритма сложения / вычитания
Дэмиен
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может быть любым целым числом.

Fatalize
источник
4
вау, брахилог (и пролог) потрясающие
Maltysen
2
Сложение и вычитание то же самое
Leaky Nun
1
@LeakyNun Правильно, спасибо!
Роковая
3
29 байт
Утренняя монахиня
3
27 байт
Утренняя монахиня
6

Haskell, 65 байт

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
источник
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
Джонатан Аллан
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(@)))

скрипка

t-clausen.dk
источник
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];

Проверяет, является ли разница между первым и вторым элементом такой же, как разница между вторым и третьим элементом. Если это так, он делает сложение / вычитание, в противном случае он делает умножение / деление.

Scepheo
источник
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);

Работает на них всех.

Whothehellisthat
источник
1
Не был уверен насчет этикета здесь. Я знаю, что уже есть другой ответ JS, но он не касается крайних случаев. Моя длиннее, но справляется со всем этим. Дайте мне знать, если я не сделал это правильно.
Кто сказал, что
1
Нет ничего плохого в том, чтобы опубликовать ответ на том же языке, что и другой ответ, особенно если ваш ответ правильный, а другой - нет. Я не знаю, достаточно ли у вас представителей, чтобы сделать это, но вы можете также прокомментировать этот ответ, чтобы сообщить им, какие крайние случаи они пропускают.
DJMcMayhem
Я на самом деле взял крайние случаи из этого другого поста, но они не решили проблему. ; 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]
Timtech
источник
2

Р, 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]

обновление: целочисленное деление

Vlo
источник
Разве это не принимает четыре переменные, а не массив? Если нет, вы можете избавиться от круглых скобок, b-aчтобы сохранить байт (и я отмечаю, что ваши примеры вызовов добавляют пробелы обратно).
Джонатан Аллан
@JonathanAllan Вы правы. Это не занимает массив. Количество байтов было обновлено. Скобки нужны из-за else, но мы можем сохранить байт, добавив вместо него пробел. Для звонков не нужны дополнительные пробелы.
Вло
Да, именно поэтому я сказал, что вы можете сэкономить 1 байт, а не 2
Джонатан Аллан
Обратите внимание, что в настоящее время он не обрабатывает требование целочисленного деления полностью, например, 261,65,16,4возвращает, 0.9961686а не 1(конечно, в этом вопросе должен быть тестовый пример).
Джонатан Аллан
1
Функция @JonathanAllan (x) if (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 байта

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

Этот код, безусловно, имеет некоторые проблемы, поскольку он не обрабатывает деление на ноль и тому подобное. Конечно, это также не сработает, если во входном массиве больше (или меньше) 4 целых чисел a. Что делает его дурацким, но мне было весело :)

Попробуйте это: https://ideone.com/nELH5I

Peech
источник
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
Timtech
источник
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)
HyperNeutrino
источник
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
Стивен Х.
источник