Machen Sie eine mathematische Gleichung aus dem Datum

19

In meinem Economics-Kurs möchten meine Freunde und ich Wege finden, die Ziffern im Datumsformat (MM / TT / JJ) neu anzuordnen, um eine gültige mathematische Gleichung zu erstellen. Zum größten Teil dürfen wir zusätzlich zur Verkettung Addition, Subtraktion, Multiplikation, Division, Klammern und Exponentiation verwenden.

Ihr Programm sollte etwas Ähnliches tun. Das Programm sollte das aktuelle Datum importieren und Operatoren einfügen, um einen Ausdruck gemäß den folgenden Regeln zu drucken.

  • Die Ziffern MÜSSEN der Reihe nach verwendet werden. Eine Umstellung der Ziffern ist nicht zulässig.
  • Der resultierende Ausdruck muss mathematisch korrekt sein.
  • Addition, Subtraktion, Multiplikation, Division, Exponentiation und Verwendung von Klammern ist zulässig. So ist die Verkettung von Ziffern. Es sind jedoch nicht alle Operationen erforderlich. Sie können kein Subtraktionszeichen verwenden, um eine negative Ziffer zu erhalten (wie -1+1+11=10am 11. November 2010).
  • Das Programm muss auf einem Standardcomputer in 60 Sekunden ausgeführt werden.

Diese Herausforderung wurde zum Beispiel am 10. November 2015 geschrieben. Das Programm würde dies als 11.10.15 interpretieren. Eine Beispielausgabe wäre (1+1)/10=1/5.


Boni

Sie können die Anzahl der Bytes in Ihrem Code mit 0,9 für jedes der folgenden von Ihrem Programm unterstützten Elemente multiplizieren.

  • Das Programm druckt alle möglichen Ausdrücke, die gebildet werden können, durch Zeilenumbrüche getrennt. Mit zusätzlichen 0,95 multiplizieren, wenn die Ausdrücke in aufsteigender Reihenfolge der zusätzlichen Symbole aufgeführt sind.
  • Das Programm funktioniert auch für MM / TT / JJJJ-Daten, wobei zusätzlich zur Möglichkeit ohne eine Möglichkeit mit den ersten beiden Stellen des Jahres gedruckt wird. Wenn dieser Bonus mit dem ersten Bonus kombiniert wird, müssen alle Möglichkeiten mit den ersten beiden Ziffern des Jahres gedruckt werden.
  • Das Programm druckt auch eine Gleichung für , wenn es mehrere Gleichheiten (zum Beispiel am 11. November 2011 1=1=1=1=1=1habe gedruckt werden, zusätzlich zu den Möglichkeiten, wie 1*1=1=1=1=1, 1*1*1=1=1=1und 1*1*1*1=1=1. Alle solche Fälle gedruckt werden müssen , damit der erste Bonus erreicht werden.
  • Das Programm unterstützt die Konvertierung in Basen zwischen 2 und 16. Beachten Sie, dass, wenn die Basis nicht 10 ist, alle Zahlen im Ausdruck in dieselbe Basis (Base b)geschrieben und nach dem Ausdruck geschrieben werden müssen ( bentsprechend ersetzt).

Dies ist Codegolf, daher gelten die Standardregeln. Kürzester Code in Bytes gewinnt.

Arcturus
quelle
1
Welche Operationen sind erlaubt?
anOKsquirrel
1
@FryAmTheEggman Gibt es genug Ähnlichkeit, um dies als Duplikat zu bezeichnen? Ich habe das nicht gedacht, weil diese Herausforderung nicht ausschließlich eine Ziffer verwendet und keine bestimmte RHS im Auge hat (nur Gleichheit).
Arcturus
17
TT / MM / JJJJ> MM / TT / JJJJ.
Orlp
3
Ich denke, Sie möchten Gleichung in Ihrer Frage verwenden, in der Sie Ausdruck geschrieben haben (ein Ausdruck ist nur eine Seite der Gleichung, und dann ergibt Ihre Frage keinen Sinn).
Paŭlo Ebermann,
1
Ist dies nachweislich zu einem bestimmten Zeitpunkt möglich?
Zach Gates

Antworten:

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

Brute erzwingt alle möglichen Kombinationen von Operationen in den Zahlen und stoppt, wenn eine gefunden wird.

BEARBEITEN: 4 Bytes dank @NoOneIsHere gespeichert

EDIT 2: 51 (!) Bytes dank @ValueInk gespeichert

Theo
quelle
1
Hallo und willkommen bei PPCG! Sie können das einfügen except:passund das Leerzeichen entfernen [ (p//(len(o)**i))%len(o)].
NoOneIsHere
Wenn Sie eine Division aus importieren __future__, würde ein Upgrade auf Python 3 für Ihre Situation besser funktionieren? Ich verstehe auch nicht, warum Sie obeim Erstellen der Liste der Operatoren mit gleichen Rechten das Gegenteil tun .
Wert Tinte
@ValueInk Ja, ich könnte es wahrscheinlich auf Python 3 ändern und einige Bytes sparen. Als ich mit der Herausforderung anfing, war ich überhaupt nicht auf das Golfen fokussiert, daher kann sie definitiv noch kürzer gemacht werden. Da das Programm alle Kombinationen brutal erzwingt, bis es eine findet, ist die Geschwindigkeit ein Problem, und ich habe festgestellt, dass es tendenziell schneller funktioniert, wenn Sie die Umkehrung von o verwenden. Ich werde wahrscheinlich noch ein bisschen Golf spielen, um es zu einem ernsthaften Konkurrenten zu machen.
Theo
o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])für 2 Bytes
Jonathan Allan
1
@ JonathanAllan Huh. Vielen Dank für diesen Hinweis. Ich werde den Code überarbeiten, wenn ich Zeit habe (wahrscheinlich morgen)
Theo