Складіть математичне рівняння з дати


19

У моєму класі економіки ми з друзями любимо придумувати способи переставити цифри у формат дати (у форматі MM / DD / YY), щоб створити дійсне математичне рівняння. Здебільшого, ми можемо використовувати додавання, віднімання, множення, ділення, дужки та експоненціацію, крім конкатенації.

Ваша програма повинна робити щось подібне. Програма повинна імпортувати поточну дату та вставляти оператори для друку виразу відповідно до наступних правил.

  • Цифри ОБОВ'ЯЗКОВО використовуватись у порядку. Перестановка цифр заборонена.
  • Отриманий вираз повинен бути математично точним.
  • Додавання, віднімання, множення, ділення, експоненція та використання дужок дозволяється. Так само конкатенація цифр. Однак не всі операції необхідні. Не можна використовувати знак віднімання, щоб зробити цифру від’ємною (наприклад, -1+1+11=1011 листопада 2010 р.).
  • Програма повинна працювати за 60 секунд на стандартній машині.

Наприклад, цей виклик було написано 10 листопада 2015 року. Програма інтерпретувала це як 10.10.2015. Вибірка вибірки буде (1+1)/10=1/5.


Бонуси

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

  • Програма друкує всіх можливі вирази, які можна сформувати, розділивши нові рядки. Помножте на додаткові 0,95, якщо вирази перераховані у порядку збільшення додаткових символів.
  • Програма також працює на дати MM / DD / РРРР, друкуючи можливість з першими двома цифрами року на додаток до можливості без. Якщо цей бонус поєднується з першим бонусом, всі можливості з першими двома цифрами року повинні бути надруковані.
  • Програма також друкує рівняння , коли існує безліч Рівності (наприклад, на 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 Чи достатньо подібності, щоб називати це дублікатом? Я не думав так, тому що в цьому виклику не використовується виключно одна цифра і не має на увазі конкретного РЗС (лише рівність).
Арктур

17
DD / MM / РРРР> MM / DD / РРРР.
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

Брут-змушує всі можливі комбінації операцій у числах і зупиняється, коли знаходить одну.

EDIT: Збережено 4 байти завдяки @NoOneIsHere

EDIT 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 Huh. Дякуємо, що вказали на них. Я буду переробляти код, коли
Тео
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.