Выразить номер
Еще в 60-х годах французы изобрели телеигру "Des Chiffres et des Lettres" ("Цифры и буквы"). Цель цифровой части шоу состояла в том, чтобы как можно ближе приблизиться к определенному трехзначному целевому номеру, используя несколько случайно выбранных чисел. Участники могут использовать следующие операторы:
- конкатенация (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 цифрами.
- Возможно (на самом деле вполне вероятно), что целевое число не может быть выражено через числа и операторы. Цель состоит в том, чтобы подобраться как можно ближе.
- Программа должна завершиться в разумные сроки (несколько минут на современном настольном ПК).
- Применяются стандартные лазейки.
- Ваша программа не может быть оптимизирована для набора тестов в разделе «Оценка» этой головоломки. Я оставляю за собой право изменить набор тестов, если подозреваю, что кто-либо нарушает это правило.
- Это не Codegolf.
вход
Ввод состоит из массива чисел, которые могут быть отформатированы любым удобным способом. Первое число является целевым числом. Остальные числа - это числа, с которыми вы должны работать, чтобы сформировать целевое число.
Выход
Требования к выходу:
- Это должна быть строка, которая состоит из:
- любое подмножество входных чисел (кроме целевого числа)
- любое количество операторов
- Я предпочитаю вывод одной строкой без пробелов, но при необходимости вы можете добавить пробелы и переводы строк по своему усмотрению. Они будут игнорироваться в управляющей программе.
- Вывод должен быть допустимым математическим выражением.
Примеры
Для удобства чтения все эти примеры имеют точное решение, и каждое входное число используется ровно один раз.
Вход: 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, ваш штрафной балл составляет abs (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
Предыдущие похожие пазлы
Создав эту головоломку и разместив ее в песочнице, я заметил нечто похожее (но не то же самое!) В двух предыдущих головоломках: здесь (без решений) и здесь . Эта головоломка несколько отличается, потому что она вводит оператор конкатенации, я не ищу и точное совпадение, и мне нравится видеть стратегии приближения к решению без грубой силы. Я думаю, что это сложно.