Zgadywanie liczb na podstawie symboli

0

Witam

Mam problem z opracowaniem algorytmu dla takiego programu:

Program rozszyfrowujacy rozwiazanie A $ B = C gdzie
A = A1 * 102 + A2 * 101 + A3 * 10^0,
B = B1 * 102 + B2 * 101 + B3 * 10^0
C = C0 * 103 + C1 * 102 + C2 * 101 + C3 * 100,
$ - działanie (+, -, *)

Użytkownik podaje A1, A2, A3, B1, B2, B3, C0, C1, C2, C3 w formie liter (a, b, c...) oraz działanie (+, -, *), a program powinien zwrócić co kryje się pod literami (np. a = 1, b=3, c=5 ...) żeby się zgadzało rownanie.

np. dla
A1 = a, A2 = b, A3 = a (A to liczba aba)
B1 = c, B2 = d, B3 = b (B to liczba cdb)
C1 = d, C2 = f, C3 = c (C to liczba dfc)
$ = +

program powinien zwrócić:

a=1, b=3, c=4, d=5, f=8 ( istotnie 131 + 453 = 584 )

Jedyne co mi przychodzi do głowy to sprawdzanie wszystkich możliwości, ale może jest inny sposób?

0

Nie wiem, czy szybsze nie będzie wygenerowanie wszystkich możliwości, a potem sprawdzenie czy jest rozwiązanie spełniające warunki. Albo po prostu generowanie dla A i B możliwych cyfr i sprawdzanie czy C jest wynikiem. Jest tylko 10^6 wszystkich możliwości dla A i B, więc nie ma problemu z długim czasem działania algorytmu.

Przy wygenerowaniu wszystkich możliwości możesz je wrzucić do słownika w celu szybkiego wyszukiwania pod względem tych masek, przykładowo 113+213=326 byłoby pod aabcabbcd.

0

Zazwyczaj rozwiązań będzie dużo. Program ma zwrócić wszystkie, czy wystarczy jedno (pierwsze na które trafi)?

0

Pierwsze na które natrafi.

0

Jeszcze jedno pytanie. Jak na wejściu będzie liczba aec, to można założyć, że a<>0? Podany przez Ciebie przykład takie coś sugeruje.

0

W sumie mogło by być, bo zero na początku nie zmienia wartości liczby ( po wstawieniu do równania pasuje ) ten przykład był z głowy nie koniecznie związany z wynikiem programu.

0

Propozycja @Zjarka jest chyba najlepsza (a na pewno prosta w realizacji).

0

W apogeum to jest 10 liczb do przemielenia, czyli 10^10 kombinacji... Sprawdzanie wszystkich to nie jest najlepszy pomysł, raczej ostateczność :P

0

W najgorszym przypadku (w liczbach A i B jest 6 różnych liter) 106.
Załóżmy, że dostałeś na wejściu acd bde afce.
Za każdą literę w liczbach A i B podstawiasz kolejno cyfry od 0 do 9. Przy każdym podstawieniu obliczasz wartość liczb A i B, wyliczasz A+B, znajdujesz cztery cyfry liczby A+B, sprawdzasz czy zachodzą trzy równości: pierwsza cyfra liczby A+B jest równa pierwszej cyfrze liczb A, trzecia .. jest równa drugiej .., czwarta jest równa trzeciej cyfrze liczby B. Jeśli trafisz na równość, to kończysz. Jeśli nie, to robisz to samo dla A-B, ewentualnie dla A*B.

0

Na maksa jest 10 zmiennych, z czego c0 jest 0 lub 1, reszta 0-9, wychodzi 10^9 * 2, bo jest 9 niezależnych wartości (w najgorszym przypadku). Skąd 6?

0

Napisałem (w Javie) program, który losuje dwie liczby n,k z zakresu [0;999], liczy ich sumę s=k+n, koduje te trzy liczby i otrzymane trzy ciągi wysyła do funkcji rozkodowującej. Funkcja rozkodowująca wpierw liczy ile różnych znaków (zmienna ile) zostało użytych w kodowaniu liczb n oraz k. A potem szuka metodą prób w pętli o długości 10ile właściwego rozkodowania.
Średnio zmienna ile ma wartość około 5, przeciętnie wymagane jest około 80 tysięcy prób. Łączny czas kodowania i rozkodowania to kilkadziesiąt milisekund.

1 użytkowników online, w tym zalogowanych: 0, gości: 1