Rozwiązanie kryptarytmu

0

Witam. Nie jestem pewien czy to właściwy dział. Mam do napisania program, właściwie w dowolnym języku programowania. Pierwszą próbę podjąłem w Turbo Pascalu, ale równie dobrze może to być np. w C++ (bo ten język też trochę ogarniam). Ogólnie nie programowałem od 2 lat, zatem proszę o wyrozumiałość:)
Zatem tak: muszę napisać program, który policzy mi rozwiązanie takiej zagadki literowo-cyfrowej:

    ABCD
x     CEF
--------
GBBHBIJ

Gdzie pod każdą literę należy podstawić inną cyfrę tak, aby obliczenia się zgadzały. Plus jest taki, że mój program musi policzyć tylko tę zagadkę, a nie taki typ zagadek w ogólności. To, co napisałem do tej pory wygląda tak:

uses crt;
var a:array[1..10] of integer;
begin
clrscr;

writeln('a[1]=A, a[2]=B, a[3]=C, a[4]=D, a[5]=E, a[6]=F, a[7]=G, a[8]=H, a[9]=I, a[10]=J');
while (a[1]<>a[2]) and (a[2]<>a[3]) and (a[3]<>a[4]) and (a[4]<>a[5]) and
(a[5]<>a[6]) and (a[6]<>a[7]) and (a[7]<>a[8]) and (a[8]<>a[9]) and (a[9]<>a[10]) do
for a[1]:=1 to 9 do
    for a[2]:=0 to 9 do
        for a[3]:=1 to 9  do
            for a[4]:=0 to 9 do
                for a[5]:=0 to 9 do
                    for a[6]:=0 to 9 do
                        for a[7]:=1 to 9 do
                            for a[8]:=0 to 9 do
                                for a[9]:=0 to 9 do
                                    for a[10]:=0 to 9 do

                                    begin
                                    if 100000*a[3]*a[1]+10000*(a[5]*a[1]+a[2]*a[3])+1000*(a[1]*a[6]+
                                    a[2]*a[5]+a[3]*a[3])+100*(a[2]*a[6]+a[5]*a[3]+a[3]*a[4])+10*(a[6]*a[3]+
                                    a[4]*a[5])+a[4]*a[6]=1000000*a[7]+100000*a[2]+10000*a[2]+1000*a[8]+
                                    100*a[2]+10*a[9]+a[10]
                                    then writeln('sukces');

                                    end;

readln;
end.

I po tym sukces planowałem wypisać policzone wartości a[1] do a[10]. Jak na razie program nie liczy nic.
Będę wdzięczny za wszelkie rady.
Pozdrawiam.

0

były ostatnio tematy o tym. szukaj pod hasłem constraint programming

0

Akurat ten konkretny problem można jeszcze rozwiązać bruteforcem (jak spróbowałeś zrobić), chociaż eleganckie to nie jest. Jeśli chcesz, mogę Ci podesłać rozwiązanie.

0
      ABCD
x      CEF
----------
   GBBHBIJ

Wykonujemy mnożenie:

                               A          B          C          D
 x                                        C          E          F
------------------------------------------------------------------
                               FA         FB         FC         FD
                    EA         EB         EC         ED
 +       CA         CB         CC         CD
------------------------------------------------------------------
         CA       EA+CB     FA+EB+CC   FB+EC+CD    FC+ED        FD
------------------------------------------------------------------
  G      B          B          H          B          I          J
 rs[6]  rs[5]      rs[4]      rs[3]      rs[2]      rs[1]      rs[0]

Liczymy kolejne cyfry i sprawdzamy warunki. Aby je policzyć musimy pamiętać o przeniesieniu wyżej tego co się nie mieści w jednej 'cyfrze'.

Gotowe rozwiązanie w C:

#include <stdio.h>

#define FOR(var) for (var = 0; var < 10; var++)

int main(void) {
    int a,b,c,d,e,f;
    FOR(a) FOR(b) FOR(c) FOR(d) FOR(e) FOR(f) {
        int rs[7] = { f*d, f*c+e*d, f*b+e*c+c*d, f*a+e*b+c*c, e*a+c*b, c*a, 0 };
        int i;
        for (i = 1; i < 7; i++) {
            rs[i] += rs[i-1]/10;  // przenosimy wartości niemieszczące się w poprzedniej kolumnie.
        }
        for (i = 0; i < 7; i++) {
            rs[i] %= 10;          // wynikiem jest ostatnia cyfra każdej kolumny.
        }
        if ((rs[6] != 0) && (rs[5] == b) && (rs[4] == b) && (rs[2] == b)) {
            printf("%d%d%d%d x %d%d%d = %d%d%d%d%d%d%d\n", a,b,c,d, c,e,f,
                   rs[6],rs[5],rs[4],rs[3],rs[2],rs[1],rs[0]);
        }
    }
    return 0;
}
2
using System;
using Microsoft.SolverFoundation.Services;

class Program
{
    static void Main(string[] args)
    {
        var ctx = SolverContext.GetContext();
        var model = ctx.CreateModel();
        var decisions = new Decision[10];
        string[] names = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
        for (int i=0; i<10; i++)
            decisions[i] = new Decision(Domain.IntegerRange(0, 9), names[i]);
        model.AddDecisions(decisions);
        model.AddConstraint(null, "(A*1000+B*100+C*10+D) * (C*100+E*10+F) == (G*1000000+B*100000+B*10000+H*1000+B*100+I*10+J)");
        model.AddConstraint(null, "A!=0");
        model.AddConstraint(null, "C!=0");
        model.AddConstraint(null, "G!=0");
        model.AddConstraint(null, "A!=B!=C!=D!=E!=F!=G!=H!=I!=J");
        ctx.Solve();
        for (int i = 0; i < 10; i++)
            Console.WriteLine("{0} = {1}", names[i], (int)decisions[i].ToDouble());
        Console.ReadKey();
    }
}

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