Вам надають список номерів L = [17, 5, 9, 17, 59, 14]
, мішок операторів O = {+:7, -:3, *:5, /:1}
та номер N = 569
.
Завдання
Виведіть рівняння, яке використовує всі числа в L
лівій частині і лише число N
на правій частині. Якщо це неможливо, виведіть помилково. Приклад рішення:
59*(17-5)-9*17+14 = 569
Обмеження та уточнення
- Ви не можете об'єднати числа (
[13,37]
не можна використовувати як1337
) - У ньому відображатимуться лише натуральні числа та нуль
L
. - Порядок
L
не має значення. - Ви повинні використовувати всі номери в
L
. - Тільки оператори
+
,-
,*
,/
з'являтьсяO
. O
може мати більше операторів, ніж потрібно, але принаймні|L|-1
операторів- Ви можете використовувати кожного оператора будь-яку кількість разів до значення в
O
. - Усі чотири операції в
O
- це стандартні математичні операції; зокрема,/
це нормальний поділ на точні дроби.
Очки
- Чим менше очок, тим краще
- Кожен символ вашого коду дає вам один бал
Ви повинні надати версію без гольфу, яку легко читати.
Фон
Аналогічне питання було поставлено питання про переповнення стека. Я подумав, що це може бути цікавим завданням з коду-гольфу.
Комп'ютерна складність
Як сказав Пітер Тейлор у коментарях, ви можете вирішити суму підмножини за допомогою цього:
- У вас є екземпляр суми підмножини (звідси набір S цілих чисел і число x)
- L: = S + [0, ..., 0] (| S | разів нуль), N: = x, O: = {+: | S | -1, *: | S | - 1, /: 0, -: 0}
- Тепер вирішіть цей приклад моєї проблеми
- Рішення для сукупності підмножини - це числа S, які не перемножуються на нуль.
Якщо ви знайдете алгоритм, кращий за O (2 ^ n), ви докажете, що P = NP. Оскільки P vs NP - проблема премії тисячоліття і, отже, коштує 1 000 000 доларів США, то малоймовірно, що хтось знайде рішення для цього. Тому я зняв цю частину рейтингу.
Тестові справи
Нижче наведено не єдино вагомі відповіді, інші рішення існують і дозволені:
- (
[17,5,9,17,59,14]
,{+:7, -:3, *:5, /:1}
,569
)
=>59 * (17-5)- 9 * 17 + 14 = 569
- (
[2,2]
,{'+':3, '-':3, '*':3, '/':3}
,1
)
=>2/2 = 1
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,16
)
=>5+10-2*3+7+0+0+0+0+0+0+0 = 16
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,15
)
=>5+10+0*(2+3+7)+0+0+0+0+0+0 = 15
/
≡ div
), просто плаваюча точка і помилки з надією на відсутність округлення, ...?
5+10+2*3+7*0+0...
m = |L|
? Якщо так, то як ви можете очікувати, що час виконання не залежатиме від розміру цього списку? Наприклад,[2,2],[+,+,...,+,/],1
. Насправді, оскільки n - O (m), ви можете просто записати все це через m.