Выразить номер
Еще в 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
Предыдущие похожие пазлы
Создав эту головоломку и разместив ее в песочнице, я заметил нечто похожее (но не то же самое!) В двух предыдущих головоломках: здесь (без решений) и здесь . Эта головоломка несколько отличается, потому что она вводит оператор конкатенации, я не ищу и точное совпадение, и мне нравится видеть стратегии приближения к решению без грубой силы. Я думаю, что это сложно.
Ответы:
С ++ 17, оценка .0086
Эта программа имеет недетерминированную оценку штрафа из-за гонок потоков, поэтому я объявляю на основе в среднем трех запусков, каждый из которых обрабатывал набор тестов менее чем за минуту:
Вот программа; объяснение предоставляется в комментариях. Вы можете определить
CONCAT_NONE
для традиционных правил обратного отсчета, которые не разрешают объединение илиCONCAT_DIGITS
разрешают объединение входных значений, но не каких-либо промежуточных результатов. По умолчанию, без определения, используются самые либеральные правила.Я скомпилировал это, используя GCC 6.2, используя
g++ -std=c++17 -fopenmp -march=native -O3
(наряду с некоторыми опциями отладки и предупреждения).источник
Python 2.7. Оценка: 1,67039106
Итак, я решил бросить это сам. Ничего особенного. Эта программа сортирует числа в обратном порядке (от большого к маленькому) и последовательно проверяет все операторы на числах. Сверкающий быстро, но производительность, которая заслуживает того, чтобы быть замененной.
Вот программа:
Выходные данные для всех тестовых случаев:
источник