Составьте математическое уравнение из даты

19

На уроках экономики мы с друзьями придумываем способы перестановки цифр в формате даты (в ММ / ДД / ГГ) для создания правильного математического уравнения. По большей части нам разрешено использовать сложение, вычитание, умножение, деление, круглые скобки и возведение в степень в дополнение к объединению.

Ваша программа должна сделать что-то подобное. Программа должна импортировать текущую дату и вставить операторы для печати выражения в соответствии со следующими правилами.

  • Цифры ДОЛЖНЫ использоваться по порядку. Перестановка цифр не допускается.
  • Полученное выражение должно быть математически точным.
  • Допускается сложение, вычитание, умножение, деление, возведение в степень и использование скобок. Так же как и объединение цифр. Однако не все операции необходимы. Вы не можете использовать знак вычитания, чтобы сделать цифру отрицательной (как -1+1+11=1011 ноября 2010 года).
  • Программа должна работать за 60 секунд на стандартном компьютере.

Например, этот вызов был написан 10 ноября 2015 года. Программа будет интерпретировать это как 11/10/15. Пример вывода будет (1+1)/10=1/5.


Бонусы

Вы можете умножить количество байтов в своем коде на 0,9 для каждого из следующих поддерживаемых вашей программой.

  • Программа печатает все возможные выражения, которые могут быть сформированы, разделены символами новой строки. Умножьте на дополнительные 0,95, если выражения перечислены в порядке возрастания количества дополнительных символов.
  • Программа также работает для дат ММ / ДД / ГГГГ, печатая возможность с первыми двумя цифрами года в дополнение к возможности без. Если этот бонус объединен с первым бонусом, должны быть напечатаны все возможности с первыми двумя цифрами года.
  • Программа также печатает уравнение , когда существует множество Равенства (например, на 11 ноября 2011 года, 1=1=1=1=1=1будет напечатан, в дополнение к возможностям , таких как 1*1=1=1=1=1, 1*1*1=1=1=1и 1*1*1*1=1=1. Все такие случаи должны быть напечатаны для первого бонуса должна быть достигнута.
  • Программа поддерживает преобразование в базы от 2 до 16. Обратите внимание, что если основание не равно 10, все числа в выражении должны быть записаны в одной базе, и (Base b)должны быть записаны после выражения (с bсоответствующей заменой).

Это код гольф, поэтому применяются стандартные правила. Самый короткий код в байтах побеждает.

Арктур
источник
1
Какие операции разрешены?
anOKsquirrel
1
@FryAmTheEggman Достаточно ли сходства, чтобы назвать его дубликатом? Я так не думал, потому что в этом задании не используется исключительно одна цифра и не учитывается конкретная RHS (только равенство).
Арктур
17
ДД / ММ / ГГГГ> ММ / ДД / ГГГГ.
orlp
3
Я думаю, что вы хотите использовать уравнение в своем вопросе, где вы написали выражение (выражение - это только одна сторона уравнения, и тогда ваш вопрос на самом деле не имеет смысла).
Paŭlo Ebermann
1
Возможно ли это для какой-либо конкретной даты?
Зак Гейтс

Ответы:

6

Python 3, 424 420 369 363 байта

import time as t
r=range
x=len
d=list(t.strftime('%m%d%y'))
o=([[x,x+'(',x+')']for x in ['']+"+ - == * / **".split()])
n=[]
for l in o:
    n=l+n
o=n
for p in r(x(o)**(x(d)-1)):
    e=''
    for i in r(x(d)-1):
        e+=str(d[i])+o[(p//(x(o)**i))%x(o)]
    e+=str(d[-1])
    try:
        if eval(e)and e.find('=')!=-1:
            print(e.replace('==','=').replace('**','^'))
            break
    except:pass

Брут-форс все возможные комбинации операций в числах и останавливается, когда находит.

РЕДАКТИРОВАТЬ: Сохранено 4 байта благодаря @NoOneIsHere

РЕДАКТИРОВАТЬ 2: 51 (!) Байт благодаря @ValueInk

Тео
источник
1
Здравствуйте и добро пожаловать в PPCG! Вы можете вставить except:passи удалить пробел в [ (p//(len(o)**i))%len(o)].
NoOneIsHere
Если вы импортируете разделение из __future__, подойдет ли обновление до Python 3 лучше для вашей ситуации? Кроме того, я не понимаю, почему вы переворачиваете, oкогда создаете список операторов с паренями, который у вас есть.
Стоимость чернил
@ValueInk Да, я мог бы изменить его на Python 3 и сэкономить немало байтов. Когда я начал выполнять эту задачу, я вообще не был сосредоточен на игре в гольф, так что она определенно может быть еще короче. Кроме того, поскольку программа грубо форсирует все комбинации до тех пор, пока не найдет одну, скорость является проблемой, и я обнаружил, что она имеет тенденцию работать быстрее, если вы используете реверс o. Я, наверное, еще немного проиграю, чтобы сделать его серьезным соперником.
Тео
o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])для 2 байтов
Джонатан Аллан
1
@JonathanAllan Ха. Спасибо за указание на это. Я сделаю переделку кода, когда у меня будет время (вероятно, завтра)
Тео