Faire une équation mathématique à partir de la date

19

Dans mon cours d'économie, mes amis et moi aimons trouver des moyens de réorganiser les chiffres au format date (au format MM / JJ / AA) pour créer une équation mathématique valide. Pour la plupart, nous sommes autorisés à utiliser l'addition, la soustraction, la multiplication, la division, les parenthèses et l'exponentiation en plus de la concaténation.

Votre programme devrait faire quelque chose de similaire. Le programme doit importer la date actuelle et insérer des opérateurs pour imprimer une expression selon les règles suivantes.

  • Les chiffres DOIVENT être utilisés dans l'ordre. Le réarrangement des chiffres n'est pas autorisé.
  • L'expression résultante doit être mathématiquement exacte.
  • L'addition, la soustraction, la multiplication, la division, l'exponentiation et l'utilisation de parenthèses sont autorisées. Il en va de même pour la concaténation des chiffres. Cependant, toutes les opérations ne sont pas nécessaires. Vous ne pouvez pas utiliser un signe de soustraction pour rendre un chiffre négatif (comme -1+1+11=10le 11 novembre 2010).
  • Le programme doit s'exécuter en 60 secondes sur une machine standard.

Par exemple, ce défi a été écrit le 10 novembre 2015. Le programme interpréterait cela comme 11/10/15. Un exemple de sortie serait (1+1)/10=1/5.


Bonus

Vous pouvez multiplier le nombre d'octets de votre code par 0,9 pour chacun des éléments suivants pris en charge par votre programme.

  • Le programme imprime toutes les expressions possibles qui peuvent être formées, séparées par des retours à la ligne. Multipliez par 0,95 supplémentaire si les expressions sont répertoriées dans l'ordre croissant des symboles supplémentaires.
  • Le programme fonctionne également pour les dates MM / JJ / AAAA, en imprimant une possibilité avec les deux premiers chiffres de l'année en plus de la possibilité sans. Si ce bonus est combiné avec le premier bonus, toutes les possibilités avec les deux premiers chiffres de l'année doivent être imprimées.
  • Le programme imprime aussi une équation quand il y a plusieurs égalités (par exemple, le 11 Novembre 2011, 1=1=1=1=1=1serait imprimé, en plus de possibilités telles que 1*1=1=1=1=1, 1*1*1=1=1=1et 1*1*1*1=1=1. Tous ces cas doivent être imprimés pour la première prime à atteindre.
  • Le programme prend en charge la conversion en bases entre 2 et 16. Notez que si la base n'est pas 10, tous les nombres de l'expression doivent être écrits dans la même base et (Base b)doivent être écrits après l'expression (avec bremplacé en conséquence).

C'est du golf de code, donc les règles standard s'appliquent. Le code le plus court en octets gagne.

Arcturus
la source
1
Quelles opérations sont autorisées?
anOKsquirrel
1
@FryAmTheEggman Y a-t-il suffisamment de similitude pour appeler cela un doublon? Je ne le pensais pas parce que ce défi n'utilise pas exclusivement un chiffre et n'a pas de RHS spécifique à l'esprit (seulement l'égalité).
Arcturus
17
JJ / MM / AAAA> MM / JJ / AAAA.
orlp
3
Je pense que vous voulez utiliser l' équation dans votre question où vous avez écrit l' expression (une expression n'est qu'un côté de l'équation, puis votre question n'a pas vraiment de sens).
Paŭlo Ebermann
1
Est-ce possible pour une date donnée?
Zach Gates

Réponses:

6

Python 3, 424 420 369 363 octets

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

Brute force toutes les combinaisons possibles d'opérations dans les nombres et s'arrête quand il en trouve une.

EDIT: 4 octets enregistrés grâce à @NoOneIsHere

EDIT 2: 51 (!) Octets enregistrés grâce à @ValueInk

Théo
la source
1
Bonjour et bienvenue chez PPCG! Vous pouvez aligner le except:passet supprimer l'espace [ (p//(len(o)**i))%len(o)].
NoOneIsHere
Si vous importez une division depuis __future__, la mise à niveau vers Python 3 fonctionnerait-elle mieux dans votre situation? De plus, je ne comprends pas pourquoi vous inversez olorsque vous créez cette liste d'opérateurs avec parenthèses que vous avez.
Value Ink
@ValueInk Ouais, je pourrais probablement le changer en python 3 et économiser pas mal d'octets. Quand j'ai commencé à relever le défi, je ne me concentrais pas du tout sur le golf, donc il peut certainement encore être raccourci. De plus, étant donné que le programme force toutes les combinaisons brutalement jusqu'à ce qu'il en trouve une, la vitesse est un problème et j'ai constaté qu'il a tendance à fonctionner plus rapidement si vous utilisez l'inverse de o. Je vais probablement jouer au golf un peu plus pour en faire un concurrent sérieux.
Theo
o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])pour 2 octets
Jonathan Allan
1
@JonathanAllan Huh. Merci de les avoir signalés. Je ferai un remaniement du code quand j'aurai le temps (probablement demain)
Theo