Faça uma equação matemática a partir da data

19

Na minha aula de economia, meus amigos e eu gostamos de encontrar maneiras de reorganizar os dígitos no formato de data (em MM / DD / AA) para criar uma equação matemática válida. Na maioria das vezes, podemos usar adição, subtração, multiplicação, divisão, parênteses e exponenciação além da concatenação.

Seu programa deve fazer algo semelhante. O programa deve importar a data atual e inserir operadores para imprimir uma expressão de acordo com as seguintes regras.

  • Os dígitos DEVEM ser usados ​​em ordem. O rearranjo de dígitos não é permitido.
  • A expressão resultante deve ser matematicamente precisa.
  • É permitida a adição, subtração, multiplicação, divisão, exponenciação e uso de parênteses. O mesmo acontece com a concatenação de dígitos. No entanto, nem todas as operações são necessárias. Você não pode usar um sinal de subtração para tornar um dígito negativo (como -1+1+11=10em 11 de novembro de 2010).
  • O programa deve ser executado em 60 segundos em uma máquina padrão.

Por exemplo, esse desafio foi escrito em 10 de novembro de 2015. O programa interpretaria isso como 10/11/15. Uma saída de amostra seria (1+1)/10=1/5.


Bônus

Você pode multiplicar o número de bytes no seu código por 0,9 para cada um dos seguintes programas suportados pelo seu programa.

  • O programa imprime todas as expressões possíveis que podem ser formadas, separadas por novas linhas. Multiplique por 0,95 adicional se as expressões estiverem listadas em ordem crescente de símbolos adicionais.
  • O programa também funciona para datas MM / DD / AAAA, imprimindo uma possibilidade com os dois primeiros dígitos do ano, além da possibilidade sem. Se esse bônus for combinado com o primeiro bônus, todas as possibilidades com os dois primeiros dígitos do ano deverão ser impressas.
  • O programa também imprime uma equação para quando há várias igualdades (por exemplo, em 11 de Novembro de 2011, 1=1=1=1=1=1seria impresso, além de possibilidades, como 1*1=1=1=1=1, 1*1*1=1=1=1, e 1*1*1*1=1=1. Todos esses casos devem ser impressos pela primeira bônus a ser alcançado.
  • O programa suporta conversão para bases entre 2 e 16. Observe que, se a base não for 10, todos os números na expressão deverão ser escritos na mesma base e (Base b)depois da expressão ( bsubstituídos de acordo).

Isso é código de golfe, então as regras padrão se aplicam. O menor código em bytes vence.

Arcturus
fonte
11
Quais operações são permitidas?
Anoksquirrel 10/11/2015
11
@FryAmTheEggman Existe semelhança suficiente para chamar isso de duplicado? Acho que não, porque esse desafio não usa exclusivamente um dígito e não tem um RHS específico em mente (apenas igualdade).
quer
17
DD / MM / AAAA> MM / DD / AAAA.
orlp
3
Eu acho que você deseja usar a equação na sua pergunta em que escreveu a expressão (uma expressão é apenas um lado da equação e, em seguida, sua pergunta realmente não faz sentido).
Paŭlo Ebermann 10/11/2015
11
Isso é provado possível para qualquer data?
Zach Gates4 /

Respostas:

6

Python 3, 424 420 369 363 bytes

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

O Brute força todas as combinações possíveis de operações nos números e para quando encontra uma.

EDIT: Salvo 4 bytes graças a @NoOneIsHere

EDIT 2: Salvo 51 (!) Bytes graças a @ValueInk

Theo
fonte
11
Olá, e bem-vindo ao PPCG! Você pode incorporar except:passe remover o espaço [ (p//(len(o)**i))%len(o)].
NoOneIsHere
Se você está importando a divisão de __future__, a atualização para o Python 3 funcionaria melhor para a sua situação? Além disso, não entendo por que você inverte oao criar a lista de operadores com parênteses que possui.
Value Ink
@ ValueInk Sim, eu provavelmente poderia alterá-lo para python 3 e economizar alguns bytes. Quando comecei a fazer o desafio, eu não estava nem um pouco concentrado no golfe, para que ele ainda possa ser reduzido. Além disso, como o programa é bruto, forçando todas as combinações até encontrar uma, a velocidade é um problema e descobri que ele tende a funcionar mais rapidamente se você usar o inverso de o. Provavelmente vou jogar um pouco mais para torná-lo um candidato sério.
Theo
o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])para 2 bytes
Jonathan Allan
11
@JonathanAllan Huh. Obrigado por apontar isso. Ill fazer um retrabalho do código quando tenho tempo (provavelmente amanhã)
Theo