• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przyspieszenie działania kodu w python

Object Storage Arubacloud
0 głosów
145 wizyt
pytanie zadane 20 stycznia w Python przez dia_Chann Nowicjusz (180 p.)

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')

 

 

komentarz 20 stycznia przez Abra41 Nowicjusz (100 p.)
Może spróbuj "porozmawiać" na ten temat z jakimś czatem AI? Podejrzewam, że takie wynalazki jak chatgpt albo perplexity dużo szybciej pomogą Ci przyspieszyć ten kod.
komentarz 20 stycznia przez dia_Chann Nowicjusz (180 p.)
edycja 20 stycznia przez dia_Chann
Gpt nic nie daje, nawet bardziej psuje ten kod, ten drugi też nie
komentarz 21 stycznia przez adrian17 Ekspert (344,860 p.)
Na intuicję to zrobiłeś to bardzo "ręcznie", ta logika z evalem wygląda jak coś co... nie powinno istnieć :P

Główne spostrzeżenie na szybko: nie musisz za każdym razem eval'ować całego wyrażenia, ani nawet "podmieniać" czegokolwiek. Jeśli na początku policzysz że przy "46=93-40" lewa i prawa strona różnią się np o 7: to np zmieniając lewą stronę z "46" na "45" i prawą stronę z "93-40" na "93-48", to lewa strona zmniejszyła się o 1 a prawa zmniejszyła o 8, więc różnica zmalała o 7, więc jest poprawnym rozwiązaniem. Nie musisz do tego eval'ować całego wyrażenia, wystarczy że wiesz że zmieniasz N-tą cyfrę liczby i czy ta liczba jest dodawana czy odejmowana. Mylę się?

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 83 wizyt
pytanie zadane 8 listopada 2022 w C# przez prz3m3k Początkujący (280 p.)
+1 głos
1 odpowiedź 299 wizyt
pytanie zadane 24 maja 2021 w Python przez osobliwy nick Użytkownik (900 p.)
0 głosów
4 odpowiedzi 912 wizyt
pytanie zadane 24 lipca 2016 w C i C++ przez Semtex Początkujący (310 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...