Arytmetyka… tock… tik… tock

15

To pytanie pochodzi od gry, w którą lubię grać, gdy tkwię w długich spotkaniach telefonicznych.

Biorąc pod uwagę dowolne dwa razy z zegara 24-godzinnego (od 00:00 do 23:59), ile prawidłowych równań matematycznych można wygenerować za każdym razem pomiędzy tylko przy użyciu podstawowych operacji arytmetycznych?

Dane wejściowe: dwa czterocyfrowe ciągi znaków (bez dwukropka) reprezentujące prawidłowe czasy w cyklu 24 godzinnym.

Przykłady:

Dla danych wejściowych = 0000, 1300

03:26 produces: "0+3*2=6" and "03*2=6" etc.
11:10 produces quite a few, including: "1*1=1+0" and "1=1=1^0" and  "1=11^0" etc.
12:24 produces: "1/2=2/4" and "1=(2*2)/4" etc.

Prawidłowe operacje to:

  • dodanie
  • odejmowanie
  • mnożenie
  • podział (zmiennoprzecinkowy)
  • potęgowanie
  • Factorial

Inne dopuszczalne symbole

  • Zdanie wtrącone
  • Znaki równości

Najkrótszy kod wygrywa.

Notatki

  • Celem jest znalezienie liczby prawidłowych wyrażeń między dwa razy, a nie liczby, które zawierają poprawne wyrażenie.
  • Dwa razy podane jako dane wejściowe są zawarte w zakresie czasów.
  • Cyfry można grupować w dowolny sposób, więc „1223” może być „12 23” lub „1 2 23” lub „1 223” itd. Itd.
  • Możesz użyć dowolnej liczby nawiasów.
  • Możesz użyć więcej niż jednego =znaku. Na przykład czas 11:11ma prawidłowe wyrażenie 1=1=1=1.
  • Jeśli po raz pierwszy nastąpi chronologicznie po raz drugi, przedział czasu powinien się zawinąć, jakby przechodził do następnego dnia.
  • Liczby muszą pozostać w oryginalnej kolejności - nie można ponownie porządkować cyfr.
  • Podczas grupowania liczb, zero może być absolutnie pierwszą cyfrą, w takim przypadku są one ignorowane („0303” zgrupowane jako „03 03” to tylko dwie cyfry o wartości 3.)
  • NIE WOLNO używać znaku minus jako jednoznacznej negacji. Dlatego też „12:01” NIE daje „1-2 = - (01)”, ale NIE „1-2 = 0-1”.
  • NIE MOŻESZ dodawać kropek dziesiętnych do cyfr. Dlatego też „12:05” NIE produkuje „1/2 = 0,5”.
  • Bez łączenia silni - po cyfrze może następować najwyżej jedna „!”, Nie więcej, w przeciwnym razie wiele razy miałoby nieskończone rozwiązania. Np .: „5!” jest ważny, ale „5 !!” nie jest poprawny.
nobillygreen
źródło
4
Wydaje się, że „ prawidłowe operacje obejmują ” uniemożliwiają dodanie przypadków testowych. Lepszym pytaniem byłoby zmienić to na „ Poprawne operacje są ” i dodać kilka przypadków testowych. Przydałoby się również precyzyjne określenie punktów końcowych: czy dla danych wejściowych 0000 1300należy wyprowadzić równania 0000i 1300uwzględnić je w obliczeniach?
Peter Taylor,
1
Biorąc pod uwagę cyfry „1423”, wykonaj „1 + 4 = 2 + 3”, „(1 + 4) = (2 + 3)”, „(1 + 4) = 2 + 3” i „1 + 4 = (2) +3) „liczyć jako jedno lub cztery równania? I ... jakie są wszystkie równania „0000”? Myślę o około 100 możliwościach, a nawet więcej ... Czy to możliwe?
Bobbel
2
Czy są jakieś ograniczenia w stosowaniu jednoargumentowych operatorów? W przypadku braku takiego ograniczenia w regułach czynnik można zastosować wielokrotnie, a zatem idealne rozwiązanie może okazać się niemożliwe.
Michael Stern,
1
Michael, to świetna obserwacja. Tak więc ze względu na układankę, myślę, że ograniczę ją do jednej silni na „cyfrę”, jeśli ma to sens. Dlatego 5! jest ważny, ale 5 !! nie jest poprawny.
nobillygreen,

Odpowiedzi:

1

Python3, 363 znaków

Ponieważ do dziś nie udzielono odpowiedzi, oddaję to, co dostałem. Niestety blok try / try jest zbyt gruby, nie znalazłem tam sposobu na zapisanie znaków. To naprawdę trudne z zagnieżdżonymi pętlami, nie wszystko można zrobić za pomocą list, tak myślę, ale może ktoś może mi powiedzieć, jak to zrobić.

Jednak sam ograniczyłem wyzwanie do używania tylko podstawowej matematyki „+ - * /” i żadnych nawiasów.

a,b = input().split()
r=0
for time in [c for c in range(int(a),int(b)) if c/10%10<6]:
 t,*ts='%04d'%time
 e=[t]
 for d in ts:
  e=[(n+o+d,n+d)[o==' '] for o in ' -+*/=' for n in e]
 for h in [g for g in [e.split('=') for e in e if '='in e] if len(g)>1]:
  for k in h:
   try:
    if eval(h[0]) != eval(k):
     break
   except:
    break
  else:
   r+=1
print(r)

Mój pełny kod (mam nadzieję, że coś wyjaśniającego) na temat tego CodeGolf można znaleźć na moim pastebin .

Oliver Friedrich
źródło