Haz una ecuación matemática a partir de la fecha

19

En mi clase de Economía, a mis amigos y a mí nos gusta encontrar formas de reorganizar los dígitos en el formato de fecha (en MM / DD / AA) para crear una ecuación matemática válida. En su mayor parte, se nos permite usar suma, resta, multiplicación, división, paréntesis y exponenciación además de la concatenación.

Su programa debería hacer algo similar. El programa debe importar la fecha actual e insertar operadores para imprimir una expresión de acuerdo con las siguientes reglas.

  • Los dígitos DEBEN usarse en orden. La reorganización de los dígitos no está permitida.
  • La expresión resultante debe ser matemáticamente precisa.
  • Se permite la suma, resta, multiplicación, división, exponenciación y uso de paréntesis. Así es la concatenación de dígitos. Sin embargo, no todas las operaciones son necesarias. No puede usar un signo de resta para hacer un dígito negativo (como -1+1+11=10el 11 de noviembre de 2010).
  • El programa debe ejecutarse en 60 segundos en una máquina estándar.

Por ejemplo, este desafío se escribió el 10 de noviembre de 2015. El programa interpretaría esto como el 10/11/15. Una salida de muestra sería (1+1)/10=1/5.


Bonos

Puede multiplicar la cantidad de bytes en su código por 0.9 para cada uno de los siguientes elementos que admite su programa.

  • El programa imprime todas las expresiones posibles que se pueden formar, separadas por nuevas líneas. Multiplique por 0.95 adicional si las expresiones se enumeran en orden creciente de símbolos adicionales.
  • El programa también funciona para fechas MM / DD / AAAA, imprimiendo una posibilidad con los dos primeros dígitos del año además de la posibilidad sin. Si este bono se combina con el primer bono, se deben imprimir todas las posibilidades con los dos primeros dígitos del año.
  • El programa también imprime una ecuación para cuando hay varias igualdades (por ejemplo, el 11 de noviembre de 2011, 1=1=1=1=1=1se imprimiría, además de posibilidades tales como 1*1=1=1=1=1, 1*1*1=1=1=1, y 1*1*1*1=1=1. Todos estos casos se deben imprimir para que se logre el primer bono.
  • El programa admite la conversión a bases entre 2 y 16. Tenga en cuenta que si la base no es 10, todos los números en la expresión deben escribirse en la misma base y (Base b)deben escribirse después de la expresión (con el breemplazo correspondiente).

Este es el código de golf, por lo que se aplican reglas estándar. El código más corto en bytes gana.

Arcturus
fuente
1
¿Qué operaciones están permitidas?
anOKsquirrel
1
@FryAmTheEggman ¿Hay suficiente similitud para llamar a esto un duplicado? No lo creo porque este desafío no usa exclusivamente un dígito y no tiene en mente un RHS específico (solo igualdad).
Arcturus
17
DD / MM / AAAA> MM / DD / AAAA.
orlp
3
Creo que desea usar la ecuación en su pregunta donde escribió la expresión (una expresión es solo un lado de la ecuación, y luego su pregunta realmente no tiene sentido).
Paŭlo Ebermann
1
¿Es esto posible probado para una fecha determinada?
Zach Gates

Respuestas:

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

Fuerza bruta todas las combinaciones posibles de operaciones en los números y se detiene cuando encuentra una.

EDITAR: guardado 4 bytes gracias a @NoOneIsHere

EDIT 2: ahorró 51 (!) Bytes gracias a @ValueInk

Theo
fuente
1
Hola y bienvenidos a PPCG! Puede en línea except:passy eliminar el espacio [ (p//(len(o)**i))%len(o)].
NoOneIsHere
Si está importando una división __future__, ¿la actualización a Python 3 funcionaría mejor para su situación? Además, no entiendo por qué revierte ocuando está creando esa lista de operadores con padres que tiene.
Value Ink el
@ValueInk Sí, probablemente podría cambiarlo a Python 3 y guardar bastantes bytes. Cuando comencé a hacer el desafío, no estaba enfocado en jugar golf en absoluto, por lo que definitivamente todavía se puede acortar. Además, dado que el programa es bruto forzando todas las combinaciones hasta que encuentra una, la velocidad es un problema, y ​​descubrí que tiende a funcionar más rápido si usa el reverso de o. Probablemente jugaré golf un poco más para convertirlo en un contendiente serio.
Theo
o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])para 2 bytes
Jonathan Allan
1
@JonathanAllan Huh. Gracias por señalar esto. Volveré a trabajar el código cuando tenga tiempo (probablemente mañana)
Theo