Od razu mówię, program działa...
Ale za wolno! Czy ktoś potrafiłby to przyspieszyć działanie?
Działanie ułożone z zapałek składa się z cyfr, znaków +, - oraz dokładnie jednego znaku =. Bezpośrednio za każdym znakiem + lub - stoi cyfra. Znak + nie stoi na początku działania, ani od razu po znaku =. Przenoszenie zapałki nie może zmieniać, usuwać ani tworzyć żadnych nowych znaków (można przenosić zapałkę tylko między cyframi). Nie można tworzyć nowych cyfr, ani usuwać istniejących (np zamieniając 4 na dwie 1). Na początku liczby w działaniu nie mają wiodących zer, ale po przełożeniu zapałki mogą mieć. Cyfry są na początku (oraz muszą być po przestawieniu zapałki) zapisane w następujący sposób: 0 123456 789 Wejście W jedynym wierszu wejścia znajduje się napis złożony z cyfr, oraz znaków -, +, =, zgodny z opisem w treści. Długość napisu nie przekroczy 106 . Długość żadnej liczby nie przekroczy 10 cyfr. Możesz założyć, że działanie nie jest poprawne. Wyjście Na wyjście wypisz jeden napis, poprawione działanie w takim samym formacie co na wejściu, lub no jeżeli nie da się poprawić działania przenosząc jedną zapałkę. Jeżeli istnieje wiele poprawnych rozwiązań, twój program może wypisać dowolne z nich.
import re
import copy
transformaty = {
60:{(5,8)},
61:{(5,7)},
63:{(5,9)},
65:{(5,6),(5,9)},
66:{(5,8)},
69:{(5,8)},
70:{(1,8)},
71:{(1,7)},
73:{(1,9)},
75:{(1,6),(1,9)},
76:{(1,8)},
79:{(1,8)},
80:{(0,8),(6,8),(9,8)},
81:{(0,7),(6,7),(9,7)},
83:{(0,9),(6,9),(9,9)},
85:{(0,6),(0,9),(6,6),(6,9),(9,6),(9,9)},
86:{(0,8),(6,8),(9,8)},
89:{(0,8),(6,8),(9,8)},
90:{(5,8),(3,8)},
91:{(5,7),(3,7)},
93:{(5,9),(3,9)},
95:{(5,6),(5,9),(3,6),(3,9)},
96:{(5,8),(3,8)},
99:{(5,8),(3,8)}
}
przesuwanie_zapalki = {
'0': {6,9},
'1': {},
'2': {3},
'3': {2,5},
'4': {},
'5': {3},
'6': {9},
'7': {},
'8': {},
'9': {6}
}
dzialanie = input()
tablica_znakow = []
for znak in dzialanie:
tablica_znakow.append(znak)
def my_eval(dzialanie):
res = 0
current = 0
minus = False
for znak in dzialanie:
if znak in ['+', '-']:
if minus:
res = res - current
else:
res = res + current
current = 0
minus = znak == '-'
else:
current = 10 * current + int(znak)
if current != 0:
if minus:
res = res - current
else:
res = res + current
return res
def sprawdz_dzialanie(tablica_znakow):
dzialanie = ''.join(tablica_znakow)
dzialanie = re.sub(r'\b0([1-9][0-9]*)\b', r'\1', dzialanie)
lewa_strona, prawa_strona = dzialanie.split('=')
wynik_lewa = my_eval(lewa_strona)
wynik_prawa = my_eval(prawa_strona)
return wynik_lewa==wynik_prawa
wynik = sprawdz_dzialanie(tablica_znakow)
def transformacja_cyfr(para):
cyra1, cyfra2 = para;
if cyfra2 == "przesun":
cyfranowa = przesuwanie_zapalki[cyfra1]
if cyfranowa:
transformata = set()
for cyfra in cyfranowa:
nowapara = (int(cyfra1), cyfra)
transformata.add(nowapara)
return transformata
else:
return False
else:
indeks_transformaty = int(cyfra1)*10+int(cyfra2)
transformata = transformaty.get(indeks_transformaty)
if transformata:
return transformata
else:
return False
poprawiono = False
for indeks1, cyfra1 in enumerate(tablica_znakow):
if poprawiono:
break
if cyfra1.isdigit():
for indeks2, cyfra2 in enumerate(tablica_znakow):
if poprawiono:
break
if cyfra2.isdigit():
if indeks1 == indeks2:
para = [cyfra1, 'przesun']
else:
para = [cyfra1, cyfra2]
nowa_para = transformacja_cyfr(para)
if nowa_para:
for para2 in nowa_para:
tablica_znakow2 = copy.deepcopy(tablica_znakow)
tablica_znakow2[indeks1]=str(para2[0])
tablica_znakow2[indeks2]=str(para2[1])
wynik = sprawdz_dzialanie(tablica_znakow2)
if wynik==True:
poprawiono =
True
break
if poprawiono:
print(''.join(tablica_znakow2))
else:
print('no')