Wykonaj równanie matematyczne od daty

19

Na mojej lekcji ekonomii wraz z przyjaciółmi lubimy wymyślać sposoby zmiany kolejności cyfr w formacie daty (w formacie MM / DD / RR), aby utworzyć prawidłowe równanie matematyczne. W większości przypadków oprócz konkatenacji możemy używać dodawania, odejmowania, mnożenia, dzielenia, nawiasów i potęgowania.

Twój program powinien zrobić coś podobnego. Program powinien zaimportować bieżącą datę i wstawić operatory, aby wydrukować wyrażenie zgodnie z następującymi regułami.

  • Cyfry MUSZĄ być używane w kolejności. Zmiana kolejności cyfr jest niedozwolona.
  • Wynikowe wyrażenie musi być matematycznie dokładne.
  • Dozwolone jest dodawanie, odejmowanie, mnożenie, dzielenie, potęgowanie i stosowanie nawiasów. Podobnie jest łączenie cyfr. Jednak nie wszystkie operacje są konieczne. Nie można użyć znaku odejmowania, aby cyfra była ujemna (jak -1+1+11=1011 listopada 2010 r.).
  • Program musi zostać uruchomiony w ciągu 60 sekund na standardowej maszynie.

Na przykład to wyzwanie zostało napisane 10 listopada 2015 r. Program zinterpretuje to jako 11/10/15. Przykładowy wynik to (1+1)/10=1/5.


Bonusy

Możesz pomnożyć liczbę bajtów w kodzie przez 0,9 dla każdego z poniższych programów obsługiwanych przez Twój program.

  • Program drukuje wszystkie możliwe wyrażenia, które można utworzyć, oddzielone znakami nowej linii. Pomnóż przez dodatkowe 0,95, jeśli wyrażenia są wymienione w porządku rosnącym dodatkowych symboli.
  • Program działa również dla dat MM / DD / RRRR, drukując możliwość z pierwszymi dwiema cyframi roku oprócz możliwości bez. Jeśli premia ta zostanie połączona z pierwszą premią, wszystkie możliwości z pierwszymi dwiema cyframi roku muszą zostać wydrukowane.
  • Program wyświetla również równanie gdy istnieje wiele równości (na przykład, w dniu 11 listopada 2011 roku, 1=1=1=1=1=1zostanie wydrukowana, oprócz możliwości, takich jak 1*1=1=1=1=1, 1*1*1=1=1=1i 1*1*1*1=1=1. Wszystkie takie przypadki muszą być wydrukowane na pierwszej premii mają być osiągnięte.
  • Program obsługuje konwersję do podstaw między 2 a 16. Zauważ, że jeśli podstawa nie jest 10, wszystkie liczby w wyrażeniu muszą być zapisane w tej samej bazie i (Base b)muszą być zapisane po wyrażeniu ( bodpowiednio zamienione).

To jest kod golfowy, więc obowiązują standardowe zasady. Najkrótszy kod w bajtach wygrywa.

Arktur
źródło
1
Jakie operacje są dozwolone?
anOKsquirrel
1
@FryAmTheEggman Czy istnieje wystarczające podobieństwo, aby nazwać to duplikatem? Nie myślałem tak, ponieważ to wyzwanie nie używa wyłącznie jednej cyfry i nie ma na myśli konkretnego RHS (tylko równość).
Arcturus,
17
DD / MM / RRRR> MM / DD / RRRR.
orlp
3
Myślę, że chcesz użyć równania w swoim pytaniu, w którym napisałeś wyrażenie (wyrażenie jest tylko jedną stroną równania, a wtedy twoje pytanie naprawdę nie ma sensu).
Paŭlo Ebermann
1
Czy jest to udowodnione dla dowolnej daty?
Zach Gates

Odpowiedzi:

6

Python 3, 424 420 369 363 bajtów

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 wymusza wszystkie możliwe kombinacje operacji na liczbach i zatrzymuje się, gdy je znajdzie.

EDYCJA: Zaoszczędź 4 bajty dzięki @NoOneIsHere

EDYCJA 2: Zapisano 51 (!) Bajtów dzięki @ValueInk

Theo
źródło
1
Witaj i witaj w PPCG! Możesz wstawić except:passi usunąć spację w [ (p//(len(o)**i))%len(o)].
NoOneIsHere
Jeśli importujesz dywizję __future__, czy aktualizacja do Python 3 będzie lepsza w twojej sytuacji? Nie rozumiem też, dlaczego cofasz się, ogdy tworzysz listę operatorów z parenami, którą masz.
Wartość tuszu
@ValueInk Tak, prawdopodobnie mógłbym zmienić go na Python 3 i zapisać sporo bajtów. Kiedy zacząłem podejmować wyzwanie, wcale nie skupiałem się na grze w golfa, więc zdecydowanie można go skrócić. Ponadto, ponieważ program brutalnie wymusza wszystkie kombinacje, dopóki nie znajdzie jednej, prędkość jest problemem, a ja odkryłem, że zwykle działa szybciej, jeśli użyjesz odwrotności o. Prawdopodobnie będę grał w golfa nieco bardziej, aby stał się poważnym przeciwnikiem.
Theo,
o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])za 2 bajty
Jonathan Allan,
1
@JathanathanAllan Huh. Dzięki za zwrócenie na to uwagi. Zrobię przeróbkę kodu, kiedy będę miał czas (prawdopodobnie jutro)
Theo