Вам надають список номерів 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.