Codegolf - (Могу Ли Я) Добавьте Круглые Скобки, Чтобы Это Было Правдой

  • Автор темы Слава2
  • Обновлено
  • 21, Oct 2024
  • #1

Я видел этот недавний загадочный вопрос:

Добавьте круглые скобки, чтобы это было правдой

И увидел это в одном ответе использовался скрипт Python, чтобы опробовать все возможности.

Ваша задача состоит в том, чтобы, учитывая выражение (в виде строки) и целое число, создать программу, которая может определить, можете ли вы добавить круглые скобки, чтобы выражение стало равным целому числу.

Например, если выражение

 * 
и целое число 2(5) , чем вы можете добавить круглые скобки, например (10 + (9 - 8)) * 7 + (6 - 5) * 4 + 3 - 2 * 1 , which equals 9, so the output should be truthy. But if the expression is 1 + 2 - 3 * 4 / 9 and -1 -> truthy, ((1 + 2) - (3 * 4)) / 9 10 - 9 * 8 - 7 * 6 - 5 * 4 - 3 * 2 - 2 * 1 and 1, falsey, see linked question 10 + 9 - 8 * 7 + 6 - 5 * 4 + 3 - 2 * 1 and 82 -> truthy, (10 + (9 - 8)) * 7 + (6 - 5) * 4 + 3 - 2 * 1 34 + 3 and 15 -> falsey 1 + 2 + 5 + 7 and 36 -> falsey 1 / 10 * 3 + 3 / 10 * 10 and 6 -> truthy, (1/10*3+3/10)*10 and the integer is - , you can't add any amount of parens to make that equal + , поэтому вывод должен быть ложным.

Обратите внимание, что входное целое число может быть положительным или отрицательным, но выражение будет содержать только положительные целые числа. Фактически, выражение всегда будет соответствовать / (regex). In other words, no parens, no exponents, just * , / , * и - . Standard operator order ( + и (\d+ [+*/-] )+ \d , then 9999999999999 и 9999999999999 ).

Еще тест-кейсы:

1 + 2 - 3 * 4 / 5

Есть вопросы?

Вы можете вывести выражение в круглых скобках, если это возможно, например (1 + 2) * 3 for the last test case. I would prefer this over just a truthy value, but it is up to you. Using 9 для умножения не допускается, только 1 + 2 * 3 .

#код-гольф #математика #арифметика #задача принятия решения

Слава2


Рег
16 Apr, 2006

Тем
77

Постов
177

Баллов
602
  • 26, Oct 2024
  • #2

Python 2, 286 285 282 байта

 
 from fractions import*
# Sublist Partitions (ref 1)
P=lambda L:[p+[L[i:]]for i in range(len(L))for p in P(L[:i])]or[L]
x,y=input()
x=x.split()
# Convert all numbers to Fractions for division to work
n=['Fraction(%s)'%e for e in x[::2]]
# Operators
o=x[1::2]
# Try each partition
for p in P(n):

# Move parens to be inside strings

n=eval(`p`.replace("['","'(").replace("']",")'"))

# Alternate numbers and operators (ref 2)

x=''.join(sum(zip(n,o+[0]),())[:-1])

# Prevent division by zero errors

try:

# Evaluate and check equality

if eval(x)==y:print x

except:0
 

Попробуйте онлайн

Объяснение:

Эта версия будет печатать все рабочие выражения (с Fraction objects).

from fractions import* P=lambda L:[p+[L[i:]]for i in range(len(L))for p in P(L[:i])]or[L] x,y=input() x=x.split() for p in P(['Fraction(%s)'%e for e in x[::2]]): try:print 1/(eval(''.join(sum(zip(eval(`p`.replace("['","'(").replace("']",")'")),x[1::2]+[0]),())[:-1]))==y) except:0

Попробуйте онлайн

Ссылки:

  1. Функция разделения

  2. Альтернативная молния

Сэкономлено 3 байта благодаря Фелипе Нарди Батисте.

 

Ivankr2000


Рег
24 Mar, 2020

Тем
97

Постов
206

Баллов
701
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно