Висловіть число
Ще в 60-х роках французи винайшли телевізійне шоу "Des Chiffres et des Lettres" (цифри та букви). Метою цієї частини цифри було максимально наблизитись до певного 3-розрядного цільового номера, використовуючи кілька напів випадкових вибраних чисел. Учасники змагань могли використовувати наступних операторів:
- конкатенація (1 і 2 - 12)
- додавання (1 + 2 - 3)
- віднімання (5 - 3 = 2)
- ділення (8/2 = 4); ділення дозволяється лише в тому випадку, якщо результат - натуральне число
- множення (2 * 3 = 6)
- дужки, щоб замінити регулярний пріоритет операцій: 2 * (3 + 4) = 14
Кожне задане число можна використовувати лише один раз або взагалі не використовувати.
Наприклад, цільове число 728 може точно узгоджуватися з числами: 6, 10, 25, 75, 5 і 50 з наступним виразом:
75 * 10 - ( ( 6 + 5 ) * ( 50 / 25 ) ) = 750 - ( 11 * 2 ) = 750 - 22 = 728
У цьому виклику коду вам надається завдання знайти вираз якомога ближче до певного цільового числа. Оскільки ми живемо у 21 столітті, ми запровадимо більшу кількість цільових чисел і більше цифр, з якими можна працювати, ніж у 60-ті роки.
Правила
- Дозволені оператори: конкатенація, +, -, /, *, (і)
- Оператор конкатенації не має символу. Просто з'єднайте числа.
- Не існує "зворотного конкатенації". 69 - це 69, і їх не можна розділити на 6 та 9.
- Цільове число є натуральним числом і має максимум 18 цифр.
- Для роботи потрібно принаймні два числа та максимум 99 номерів. Ці числа також є натуральними цілими числами, максимум 18 цифр.
- Можливо (насправді цілком ймовірно), що цільове число не може бути виражене за допомогою чисел та операторів. Мета - максимально наблизитися.
- Програма повинна закінчитися в розумний час (кілька хвилин на сучасному настільному ПК).
- Застосовуються стандартні лазівки.
- Можливо, ваша програма не буде оптимізована для тестового набору в розділі "підрахунок" цієї головоломки. Я залишаю за собою право змінити тестовий набір, якщо я підозрюю, що хтось порушує це правило.
- Це не кодегольф.
Вхідні дані
Вхід складається з масиву чисел, який можна відформатувати будь-яким зручним способом. Перше число - це цільове число. Решта чисел - це числа, з якими слід працювати, щоб сформувати цільове число.
Вихідні дані
Вимоги до виходу:
- Це має бути рядок, що складається з:
- будь-який підмножина вхідних чисел (крім цільового числа)
- будь-яка кількість операторів
- Я вважаю за краще, щоб результат був однорядним без пробілів, але якщо потрібно, ви можете додати пробіли та нові рядки, як вважаєте за потрібне. Вони будуть ігноровані в контрольній програмі.
- Вихід повинен бути дійсним математичним виразом.
Приклади
Для читабельності всі ці приклади мають точне рішення, і кожен номер введення використовується точно один раз.
Вхід: 1515483, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
Вихід:111*111*(111+11+1)
Вхід: 153135, 1, 2, 3, 4, 5, 6, 7, 8, 9
Вихід:123*(456+789)
Вхід: 8888888888, 9, 9, 9, 99, 99, 99, 999, 999, 999, 9999, 9999, 9999, 99999, 99999, 99999, 1
Вихід:9*99*999*9999-9999999-999999-99999-99999-99999-9999-999-9-1
Вхід: 207901, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
Вихід:1+2*(3+4)*(5+6)*(7+8)*90
Вхід: 34943, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
Вихід: 1+2*(3+4*(5+6*(7+8*90)))
Але також дійсний вихід:34957-6-8
Оцінка балів
Штрафний бал програми - це сума відносних помилок виразів для тестового набору нижче.
Наприклад, якщо цільове значення 125, а вираз дає 120, то ваш штрафний бал становить абс (1 - 120/125) = 0,04.
Виграє програма з найнижчою оцінкою (найнижчою загальною відносною помилкою). Якщо дві програми закінчуються однаково, виграє перше подання.
Нарешті, тестовий набір (8 випадків):
14142, 10, 11, 12, 13, 14, 15
48077691, 6, 9, 66, 69, 666, 669, 696, 699, 966, 969, 996, 999
333723173, 3, 3, 3, 33, 333, 3333, 33333, 333333, 3333333, 33333333, 333333333
589637567, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
8067171096, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199
78649377055, 0, 2, 6, 12, 20, 30, 42, 56, 72, 90, 110, 132, 156, 182, 210, 240, 272, 306, 342, 380, 420, 462, 506, 552, 600, 650, 702, 756, 812, 870, 930, 992
792787123866, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169
2423473942768, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 2000000, 5000000, 10000000, 20000000, 50000000
Попередні подібні пазли
Створивши цю головоломку та розмістивши її на пісочниці, я помітив щось подібне (але не те саме!) У двох попередніх пазлах: тут (немає рішень) і тут . Ця головоломка дещо інша, тому що вона вводить оператор конкатенації, я не шукаю і точної відповідності, і мені подобається бачити стратегії наближення до рішення без грубої сили. Я думаю, що це складно.