обзор
Учитывая список цифр, найдите наименьшее количество операций, чтобы сделать 100
вход
Строка цифр, которая может быть или не быть в числовом порядке. Порядок цифр не может быть изменен, однако операторы плюс (+) или минус (-) могут быть добавлены между каждым, так что общая сумма равна 100.
Выход
Количество добавленных операторов, сопровождаемое полной последовательностью цифр и операторов. Они могут быть разделены пробелом, табуляцией или новой последовательностью строк.
Примеры
действительный
Вход: 123456789
Выход:3 123–45–67+89
Неверный
ввод: 123456789
вывод:
6
1+2+34-5+67-8+9
(Есть способы решения этой проблемы с меньшим количеством операций)
+
и-
? Можем ли мы предположить, что мы всегда сможем сделать100
из входа?299399
, будет-299+399
действительным?Ответы:
JavaScript (ES6),
153176 байтРЕДАКТИРОВАНИЕ: В нестрогом режиме JS интерпретирует числовые выражения с префиксом 0 как восьмеричные (например
017
, анализируется как 15 в десятичном виде). Это фиксированная версия, которая поддерживает ведущие нули.источник
2-017-2+117
. Но017
это восьмеричное обозначение в JS, которое дает 15 в десятичном виде. Так что мой текущий код только находит2-0-17-2+117
. Я постараюсь решить эту проблему позже сегодня.3**(l=s.length,l-1)
=>3**~-(l=s.length)
MATL ,
3736 байтТестовый пример занимает около 6 секунд в TIO.
Попробуйте онлайн!
Как это устроено
источник
299399
не имеет решения и, следовательно, не является допустимым вводом (операторы были указаны для перехода «между» цифрами, для этого ввода потребуется,-299+399
чтобы-
между цифрами не было).-299+399
, и в этом случае мне нужно небольшое изменение в моем коде . Я попросил у ОП уточнения123456789
должно быть число операторов4
not3
.299399
является недопустимым входом, потому что, как выяснил ОП, каждый вход должен иметь хотя бы одно решение[Python 2],
164158 байтПопробуйте онлайн!
Возьмите N как строку цифр; возвращает кортеж (numOps, expressionString).
В основном такой же подход, как и другие; использует itertools.product для построения отдельных «падежей», например, для N == «1322», «падеж» будет иметь
('-','','+')
значение 1-32 + 2.Выдает ValueError, если ввод неверен (но я думаю, что OP гарантированно не допустил ввод).
источник
PHP,
166171 байтЗапустите как трубу с
-nR
или проверьте это онлайн .использует форматированные числа для сортировки результатов ->
может печатать начальные пробелы (и может не сработать при вводе более 99 цифр; увеличьте число при
%2d
исправлении).не более 10 цифр, 161 байт
сломать
источник
Желе , 32 байта
Полная программа, которая отображает с использованием операторов Jelly (
_
вместо-
).Замечания: для отображения
-
в выходных данных вместо_
(не обязательно) добавьте⁾_-y
междуF
иṄ
(⁾_-
является литералом пары символов['_','-']
иy
является диадическим атомом "перевода").Как?
Попробуйте онлайн!
источник
Математика, 136
146149156165166байтовВозвращает
{3, 123-45-67+89}
к примеру.Тестовый пример занимает около 0,09 секунды.
источник
Python 2 ,
256230208205172171170165 байтов, итерационный методlen(a)
наw
z-=1;d=z
наd=z=z-1
Попробуйте онлайн!
Небольшое объяснение Используя представление в базе 3, код чередует цифры с операторами {'+', '-', конкатенация} в соответствии со всеми возможными комбинациями.
Python 2 , 167 байт, рекурсивный метод
Попробуйте онлайн!
Некоторые выводы
источник
list(input())
на justinput()
, поскольку строка уже повторяется, чтобы сохранить 6 байт; заменитьb.count('+')+b.count('-')
на,len(b)-len(a)
чтобы сохранить 12 байтов; и заменитьchr(r+43)
на,chr(r+43)*(d>0!=r-1)
а затем вы можете удалить строку,b=b[:-1].replace(',','')
чтобы сохранить чистые 15 байтов ((d>0!=r-1)
эквивалентно(d>0 and 0!=r-1)
).Брахилог , 36 байт
Попробуйте онлайн!
Более половины этого - чтобы получить правильный формат вывода. Фактическая логика ядра:
15 байт
Попробуйте онлайн!
Это возвращает список как [123, –45, –67,89]. Выражение является суммой элементов, а количество операторов на 1 меньше длины списка.
~cLhℕ∧100~+L
почти работает для 12 байтов ( попробуйте онлайн! ) - но он слишком медленный, чтобы обрабатывать полные 9-значные вводы на TIO, и, что более важно, он не работает для таких входов, как10808
- Brachylog слишком умен, чтобы разбивать числа, чтобы иметь лидирующие нули, так что см. раздел [108, -08].источник
Haskell ,
180178 байтПопробуйте онлайн! Использование:
g "123456789"
урожайность(3,"123-45-67+89")
.#
создает список всех возможных терминов,?
оценивает термин иg
фильтрует те термины, которые оцениваются как 100, и возвращает один с минимальным количеством операндов.источник
Желе , 27 байт
Попробуйте онлайн!
Не могу сказать, что я не взял несколько подсказок из более старого ответа Джонатана Аллана. ;-)
По сравнению с его ответом, этот на два байта короче (30), а не на пять, если мы сделаем сравнение справедливым из-за языковых обновлений:
Если мы сравним другой способ (более новая версия вместо старой), разница будет той же (его становится 29 байтов, как показано ниже):
источник