Crea un'equazione matematica dalla data


19

Nella mia classe di Economia, i miei amici e mi piace inventare modi per riorganizzare le cifre nel formato data (in MM / GG / AA) per creare un'equazione matematica valida. Per la maggior parte, ci è permesso usare addizione, sottrazione, moltiplicazione, divisione, parentesi ed esponenziazione oltre alla concatenazione.

Il tuo programma dovrebbe fare qualcosa di simile. Il programma dovrebbe importare la data corrente e inserire operatori per stampare un'espressione secondo le seguenti regole.

  • Le cifre DEVONO essere utilizzate in ordine. La riorganizzazione delle cifre non è consentita.
  • L'espressione risultante deve essere matematicamente accurata.
  • È consentita l'aggiunta, la sottrazione, la moltiplicazione, la divisione, l'espiazione e l'uso delle parentesi. Così è la concatenazione di cifre. Tuttavia, non tutte le operazioni sono necessarie. Non è possibile utilizzare un segno di sottrazione per rendere una cifra negativa (come -1+1+11=10l'11 novembre 2010).
  • Il programma deve essere eseguito in 60 secondi su una macchina standard.

Ad esempio, questa sfida è stata scritta il 10 novembre 2015. Il programma lo interpreterebbe come l'11 / 10/15. Un output di esempio sarebbe (1+1)/10=1/5.


bonus

Puoi moltiplicare il numero di byte nel tuo codice per 0,9 per ognuna delle seguenti opzioni supportate dal tuo programma.

  • Il programma stampa tutte le possibili espressioni che possono essere formate, separate da nuove righe. Moltiplicare per un ulteriore 0,95 se le espressioni sono elencate in ordine crescente di simboli aggiuntivi.
  • Il programma funziona anche per le date MM / GG / AAAA, stampando una possibilità con le prime due cifre dell'anno oltre alla possibilità senza. Se questo bonus è combinato con il primo bonus, devono essere stampate tutte le possibilità con le prime due cifre dell'anno.
  • Il programma stampa anche un'equazione per quando ci sono più uguaglianze (ad esempio, l'11 novembre, 2011, 1=1=1=1=1=1sarebbe stato stampato, oltre alle possibilità, come 1*1=1=1=1=1, 1*1*1=1=1=1e 1*1*1*1=1=1. Tutti questi casi devono essere stampati per il primo bonus da raggiungere.
  • Il programma supporta la conversione in basi tra 2 e 16. Si noti che se la base non è 10, tutti i numeri nell'espressione devono essere scritti nella stessa base e (Base b)devono essere scritti dopo l'espressione (con la bsostituzione di conseguenza).

Questo è il golf del codice, quindi si applicano le regole standard. Vince il codice più breve in byte.


1
Quali operazioni sono consentite?
anOKsquirrel,

1
@FryAmTheEggman C'è abbastanza somiglianza per chiamare questo un duplicato? Non la pensavo così perché questa sfida non utilizza esclusivamente una cifra e non ha in mente un RHS specifico (solo uguaglianza).
Arcturus,

17
GG / MM / AAAA> MM / GG / AAAA.
orlp,

3
Penso che tu voglia usare l' equazione nella tua domanda in cui hai scritto espressione (un'espressione è solo un lato dell'equazione, e quindi la tua domanda non ha davvero senso).
Paŭlo Ebermann,

1
Questo è dimostrato possibile per una determinata data?
Zach Gates,

Risposte:


6

Python 3, 424 420 369 363 byte

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

Forza bruta tutte le possibili combinazioni di operazioni nei numeri e si ferma quando ne trova una.

EDIT: salvato 4 byte grazie a @NoOneIsHere

EDIT 2: 51 (!) Byte salvati grazie a @ValueInk


1
Ciao e benvenuto in PPCG! È possibile incorporare except:passe rimuovere lo spazio in [ (p//(len(o)**i))%len(o)].
NoOneIsHere

Se stai importando divisione da __future__, l'aggiornamento a Python 3 funzionerebbe meglio per la tua situazione? Inoltre, non capisco perché ti capovolgi oquando stai costruendo l'elenco di operatori con i genitori che hai.
Valore inchiostro

@ValueInk Sì, probabilmente potrei cambiarlo in Python 3 e salvare parecchi byte. Quando ho iniziato a fare la sfida, non ero concentrato sul golf, quindi può sicuramente essere ancora più breve. Inoltre, poiché il programma è forzato a forzare tutte le combinazioni fino a quando non ne trova una, la velocità è un problema e ho scoperto che tende a funzionare più velocemente se si utilizza il contrario di o. Probabilmente giocherò un po 'più a fondo per renderlo un serio contendente.
Theo,

o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])per 2 byte
Jonathan Allan il

1
@JonathanAllan Huh. Grazie per avermelo fatto notare. Farò una rielaborazione del codice quando avrò tempo (probabilmente domani)
Theo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.