Таким образом, задача проста, учитывая массив чисел и результат, вам нужно найти, какие операции нужно использовать над числами из массива, чтобы получить запрошенный результат.
Давайте сделаем это простым для запуска и разрешим только основные операции, такие как: сложение, вычитание, умножение и деление.
Пример:
Input : [5,5,5,5,5] 100
Output : 5*5*5-5*5
Чтобы дать какое-то преимущество таким языкам, как Java, запрос состоит в реализации функции, а не всей программы, и результат можно вернуть через параметр или вывести на консоль.
Код оценивается на основе количества байтов, и, поскольку это вызов кода гольфа, выигрывает самый низкий балл.
Еще одно требование: Вы можете получить дополнительные -10 баллов, если массив содержит только цифры, поддерживая решения, в которых вы могли бы строить числа из следующих цифр. Т.е.
Input : [1,2,3,4,5] 0
Output : 12-3-4-5
Обратите внимание, что при условии, что выходные данные являются предлагаемыми выходными данными, в некоторых случаях может быть несколько решений. Вам решать, предоставите ли вы одно или несколько решений для данной задачи.
РЕДАКТИРОВАТЬ: Результат должен быть действительным с математической точки зрения, следовательно, деление это рациональное деление, а не целое число, и приоритет операции такой же, как в классической математике (сначала умножение и деление, а затем сложение и вычитание).
источник
*
и/
имеет приоритет над+
и-
? Ваши два примера противоречат друг другу.Ответы:
Pyth, 23 байта
По соображениям безопасности
*
и/
не буду оценивать онлайн, но они теоретически работают.Тестовый набор только с
+
и-
.источник
Oracle SQL 11.2,
322304270 байт: 1 - список цифр
: 2 - результат поиска
Без гольфа:
источник
TSQL (sqlserver 2016)
310294280 байтКакая замечательная возможность написать некрасивый код:
Golfed:
Попробуйте онлайн
Читаемо: (вставка десятичной точки (.) И ее удаление необходимы для того, чтобы sql мог принять, что 4/5 - это не 0 - это хорошо для людей, которые его тестируют)
Это решение также может обрабатывать следующие типы ввода:
источник
JavaScript (ES6),
165147 байтВложенный
eval
... прекрасный.источник
Python 3,
170155 байтСоздайте генератор со всеми возможными порядками операторов, объедините его с числами, затем вычисляйте до тех пор, пока мы не получим ответ.
https://repl.it/C2F5
источник
['+','-','*','/']
на'+-*/'
; Так какstring
s итерируемы, он будет обрабатывать его как a,array
где каждый элемент является каждым символом вstring
- так что он будет действовать так же, как вы предоставили ему массив, который у вас есть в данный момент.Python,
195186 байтВот ужасный способ сделать это.
Функция
x
принимает аргументы alist
и aresult
-x([1,2,3,4,5], 15)
например.Программа начинает цикл, в котором мы начинаем случайный выбор, добавлять ли мы
"+", "-", "*", or "/"
между каждым числом или объединять их вместе. Это казалось более лаконичным вариантом, чем на самом деле проходить перестановки и пробовать каждую комбинацию, чтобы найти каждый результат, и хотя это занимает больше времени и гораздо менее эффективно. (К счастью, это не проблема в этом контексте!)Также добавляется "." для каждого числа, чтобы избежать выполнения целочисленных операций, таких как
6/4 = 1
. Затем оноeval
выражает наше выражение и определяет, равен ли результат тому, что мы ожидаем, и если да, выводит выражение.Эта программа никогда не завершается - она будет постоянно выводить результаты, пока не будет уничтожена.
РЕДАКТИРОВАТЬ 1 : удалить ненужные новые строки, где
if
можно использовать однострочные операторы.источник
Матлаб, 234
238258байтовИсходя из ограничений других ответов, я предполагаю, что порядок чисел входного массива поддерживается fiat.
Этот код берет строку чисел
x
, скажем ,x = '12345'
и в результатеr
, скажем ,r = 15
и возвращает все строки из выражений , которые вы можете оценить , чтобы получитьr
отx
использования четырех операторов.Я использовал два различных эквивалентных по длине способа избегания использования выражений
ones(length())
-type илиrepmat(length())
-type:~~p(1,:)
который возвращает значения not-not вp
(т.1
Е. Список с той же длиной, что и первое измерениеp
) и0|p(:,1)
который возвращает 0 или is-there -a-значение-в-p
(т. е. список1
s такой же длины, что и второе измерениеp
).Matlab не имеет метода
nchoosek
с заменой , поэтому я продублировал правильное количество раз, вычислил все пространствоnchoosek
для большего выбора операторов, а затем использовалunique
вызов, чтобы свести результат к тому, что должно быть (удаление эквивалентных комбинаций, таких как «*** +» и «*** +»). Я добавляю завершающий пробел, чтобы соответствовать длине входного вектора для целей конкатенации, а затем объединяю строки оператора со входными строками в столбцы матрицы. Затем я оцениваю выражения по столбцам, чтобы получить результаты и найти порядок операторов, соответствующий тем столбцам с результатами, которые соответствуют нашему вводуr
.Тест:
x = '12345'
,r = 15
:Если бы мне нужно было взять массив значений двойной точности, мне нужно было
x = num2str(x,'%d');
бы преобразовать цифры в строку, добавив 21 (20 без;
) к моему счету. * Дополнительные байты были точками с запятой, которые я оставил только для того, чтобы любой, кто запускает этот код, не видел, чтобы их командная строка была взорвана длинными массивами. Так как мое редактирование теперь генерирует огромную кучу предупреждений о логиках и операндах двоеточия, я удалил точки с запятой в новой версии.Изменить 2: Забыла замените
2*n+2
сk
.Старый ответ:
источник
JavaScript (ES6), 88 байт
Добавил немного случайности в смесь. Гораздо проще, чем систематически повторять комбинации.
Тестирование
источник
PHP, 108 байт
принимает входные данные из аргументов командной строки в обратном порядке. Беги с
-r
.сломать
источник
Perl 5 с
-pa
, 46 байтовПопробуйте онлайн!
источник