Умножение между двумя целыми числами может быть сведено к серии сложений, например, так
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
Возведение в степень (возведение а в степень б ) также может быть сведено к серии умножений:
5 ^ 3 = 5 * 5 * 5
Следовательно, возведение в степень может быть сведено к серии сложений, путем создания выражения умножения, а затем к серии сложений. Например, 5 ^ 3
(5 кубов) можно переписать как
5 ^ 3 = 5 * 5 * 5
= (5 + 5 + 5 + 5 + 5) * 5
= (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5)
= 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5
Ваша задача состоит в том, чтобы, учитывая выражения, сложенные вместе, состоящие из возведения в степень, умножения и сложения, сократить его до кратчайшего ряда сложений. «Самое короткое» выражение определяется как выражение с наименьшим количеством +
символов, в котором по-прежнему используется только одно из двух чисел в исходном выражении. Например, самым коротким выражением 10 * 2
является 10 + 10
.
Все числа, входящие во входные данные, будут положительными целыми числами, а выражение будет состоять только из +
(сложение), *
(умножение) и ^
(возведение в степень), а также целых чисел и скобок ( ()
) для обозначения приоритета.
Вывод должен состоять из натуральных чисел и +
символов. Вы не должны выводить отдельные шаги сокращений, только конечный результат. Вывод может не состоять из каких-либо чисел, которые не отображаются на входе. Тем не менее, вы можете использовать любые 3 различных символа вместо +*^
, но, пожалуйста, скажите, какие они символы
Пробелы, разделяющие входы и выходы, могут или не могут использоваться в ваших программах, т.е. 3 * 5
могут выводиться как 5 + 5 + 5
или 5+5+5
.
Обратите внимание, что в большинстве случаев добавление фактически не выполняется. Единственный случай, когда дополнение должно быть выполнено, когда у вас есть что-то вроде5 ^ (1 + 2)
, и в этом случае добавление необходимо продолжить -> 5 ^ 3 -> 5 * 5 * 5 -> ...
. Смотри контрольный пример № 4.
Ваш код не должен обрабатывать входные данные, которые получают неоднозначное выражение. Например,(2 + 2) * (4 + 1)
. Из-за правил, изложенных до сих пор, цель не состоит в том, чтобы вычислить ответ, цель состоит в том, чтобы упростить дополнения. Таким образом, результат может отличаться в зависимости от порядка, в котором выражения разрешаются или коммутируются (какие дополнения упростить, какие оставить?). Другой недопустимый пример: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
.
Это код-гольф, поэтому выигрывает самый короткий код
Контрольные примеры
Input => output
5 ^ 3 + 4 * 1 ^ 5 => 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 4
2 ^ 1 * 2 + 3 + 9 => 2 + 2 + 3 + 9
2 ^ 1 * (2 + 3) + 9 => 2 + 3 + 2 + 3 + 9
2 ^ (1 * (2 + 3)) + 9 => 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 9
10 + 3 * 2 + 33 ^ 2 => 10 + 3 + 3 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33
100 * 3 => 100 + 100 + 100
2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1 => 2 + 2 + 2 + 2 + 8
(1 + 2 + 5 * 8 + 2 ^ 4) * 2 => 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2
источник
**
вместо^
?using only one of the two numbers in the original expression.
но оригинальное выражение может иметь более двух чисел. Я не понимаю, почему8 + 8
неверный вывод для2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
. Этот вопрос все еще довольно неясен для меня.Ответы:
Сетчатка , 302 байта
Я уверен, что это можно сыграть в гольф, но на данный момент, я просто рад, что это работает. Разделы возведения в степень и умножения очень похожи, но поскольку порядок операций важен, я не знаю, как их объединить.
y
- экспонированиеx
- умножениеp
- сложениеПопробуйте онлайн - все тестовые случаи
Тестовый конвертер
объяснение
Вы также можете заметить, что наиболее часто используемая группа
(\(\w+\)|1+)
. Это соответствует внутреннему выражению с круглыми скобками или целым числом. Я решил использовать символы, которые я сделал, чтобы я мог использовать,\w
а не класс символов. Я не уверен, что было бы лучше использовать несловарные символы и заменить некоторые обходные пути на границы слов (\b
).источник
Mathematica,
250218183170 байтОно работает! В заключение!
Определяет функцию в
f
.Ввод представляет собой простое математическое выражение. (т.е.
1 + 2
нет"1 + 2"
).Попробуйте онлайн!
Обратите внимание, что ссылка TIO имеет немного другой код, так как TIO (который, я полагаю, использует ядро Mathematica) не нравится
Infix
.Riffle
Вместо этого я использовал тот же внешний вид, что и Mathematica REPL.Ungolfed
источник
Mathematica,
405406 байтРазгромил и объяснил
Я приложил много усилий, чтобы получить следующий эффект: эта функция принимает в качестве входных данных стандартное выражение Mathematica с обычным
+
,*
и^
операциями (и круглые скобки) в нем, и выводит то , что выглядит как стандартное выражение Mathematica (но с «деактивированные» плюсы) как ответ.Вышеприведенная функция начинается с деактивации всех операций на входе. Затем он несколько раз применяет правила расширения, пока ничто больше не может быть упрощено. Всякий раз, когда он сталкивается с таким продуктом, как
2 * 3 * 4
, который может быть расширен несколькими способами, он составляет список возможных расширений и продолжает работу. В конце мы получаем список возможных окончательных ответов, и выбирается самый короткий.источник