Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 20.10.2020
Сообщений: 7

Универсальная программа для решения арифметических ребусов

20.10.2020, 20:22. Показов 1146. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нашёл тут код программы, которая должна решать арифметические ребусы, кажется, со сложением (в духе SEND + MORE = MONEY) считывая их из файла. Но написана она на Паскале, а я пишу на другом языке, не похожем на него от слова "совсем". Можете хотя бы кратко объяснить, как происходит перебор решений?

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
{.$define DEBUG}
{$M 64000,0,0}
 
program Solution;
 
{$ifndef DEBUG}
{$A-,B-,D+,E-,F-,G+,I+,L+,N+,O-,P-,Q-,R-,S-,T-,V-,X+,Y+}
const
  inFile                        = 'input.txt';
  outFile                       = 'output.txt';
{$else}
{$A-,B-,D+,E-,F-,G+,I+,L+,N+,O-,P-,Q+,R+,S+,T-,V-,X+,Y+}
const
  inFile                        = 'input1.txt';
  outFile                       = 'con';
  dbgFile                       = 'con';
var
  dbg                           : Text;
{$endif}
 
const
  maxA                          = 2000;
  maxL                          = 31;
  alpha                         = [#0..#255] - [#10,#13,'+','=','*'];
 
type
  TStr                          = string[maxL];
  TInt                          = array[1..maxL] of shortint;
  TSet                          = set of 0..9;
 
var
  expr                          : TStr;
  l                             : integer;
  a,b,c                         : TStr;
  ia,ib,ic                      : TInt;
  d                             : array[char] of shortint;
  s                             : TSet;
  nAnswers                      : integer;
  answer                        : array[1..maxA] of TStr;
 
function FormatInt( var k : TInt ) : string;
var
  s                             : string;
  i                             : integer;
 
begin
  i := maxL;
  while k[i] = 0 do dec( i );
  s := '';
  while i > 0 do begin
    s := s + chr( k[i] + ord( '0' ) );
    dec( i );
  end;
  FormatInt := s;
end;
 
function GetToken( var s : string ) : string;
var
  r                             : string;
 
begin
  r := '';
  repeat
    if not (s[1] in alpha) then break;
    r := r + s[1];
    delete( s, 1, 1 );
  until false;
  delete( s, 1, 1 );
  GetToken := r;
end;
 
procedure Update( ch : char; v : shortint );
var
  i                             : integer;
 
begin
  for i := 1 to length( a ) do
    if a[i] = ch then ia[i] := v;
  for i := 1 to length( b ) do
    if b[i] = ch then ib[i] := v;
  for i := 1 to length( c ) do
    if c[i] = ch then ic[i] := v;
end;
 
procedure Rec( k : integer; delta : integer );
var
  u,v                           : integer;
  x                             : integer;
  fa,fb,fc                      : boolean;
 
begin
  if k > maxL then begin
    if (ia[length(a)] <> 0) and
       (ib[length(b)] <> 0) and
       (ic[length(c)] <> 0) then begin
      inc( nAnswers );
      answer[nAnswers] := FormatInt( ia ) + '+' +
                          FormatInt( ib ) + '=' +
                          FormatInt( ic );
    end;
    exit;
  end;
 
  for u := 0 to 9 do
    if (not (u in s) and (ia[k] = -1)) or (ia[k] = u) then begin
 
      fa := false;
      if ia[k] = -1 then begin
        include( s, u );
        Update( a[k], u );
        fa := true;
      end;
 
      for v := 0 to 9 do
        if (not (v in s) and (ib[k] = -1)) or (ib[k] = v) then begin
 
          fb := false;
          if ib[k] = -1 then begin
            include( s, v );
            Update( b[k], v );
            fb := true;
          end;
 
          x := u + v + delta;
          if ((ic[k] = -1) and not ((x mod 10) in s)) or
             (ic[k] = x mod 10) then begin
 
            fc := false;
 
            if ic[k] = -1 then begin
              include( s, x mod 10 );
              Update( c[k], x mod 10 );
              fc := true;
            end;
 
            Rec( k + 1, x div 10 );
 
            if fc then begin
              exclude( s, x mod 10 );
              Update( c[k], -1 );
            end;
 
          end;
 
          if fb then begin
            exclude( s, v );
            Update( b[k], -1 );
          end;
 
        end;
 
      if fa then begin
        exclude( s, u );
        Update( a[k], -1 );
      end;
 
    end;
 
end;
 
procedure StrRev( var s : string );
var
  i                             : integer;
  ch                            : char;
 
begin
  for i := 1 to length( s ) div 2 do begin
    ch := s[i];
    s[i] := s[length(s)-i+1];
    s[length(s)-i+1] := ch;
  end;
end;
 
procedure HeapSort;
var
  i,j,l,r                       : integer;
  xx                            : TStr;
 
  procedure Sift;
  begin
    i := l;
    j := l * 2;
    xx := answer[i];
    if (j < r) and (answer[j] < answer[j+1]) then inc( j );
    while (j <= r) and (answer[j] > xx) do begin
      answer[i] := answer[j];
      i := j;
      j := j * 2;
      if (j < r) and (answer[j] < answer[j+1]) then inc( j );
    end;
    answer[i] := xx;
  end;
 
begin
  r := nAnswers;
  for l := nAnswers div 2 downto 1 do Sift;
  while r > 1 do begin
    xx := answer[1];
    answer[1] := answer[r];
    answer[r] := xx;
    dec( r );
    Sift;
  end;
end;
 
procedure Solve;
begin
  expr := expr + '*';
  a := GetToken( expr );
  b := GetToken( expr );
  c := GetToken( expr );
  StrRev( a );
  StrRev( b );
  StrRev( c );
  fillchar( d, sizeof(d), $ff );
  fillchar( ia, sizeof(ia), 0 );
  fillchar( ib, sizeof(ib), 0 );
  fillchar( ic, sizeof(ic), 0 );
  fillchar( ia, length(a), $ff );
  fillchar( ib, length(b), $ff );
  fillchar( ic, length(c), $ff );
  s := [];
  nAnswers := 0;
  Rec( 1, 0 );
  HeapSort;
end;
 
procedure ReadData;
begin
  readln( expr );
end;
 
procedure WriteData;
var
  i                             : integer;
 
begin
  writeln( nAnswers );
  for i := 1 to nAnswers do
    writeln( answer[i] );
end;
 
procedure Initialize;
begin
 
  assign( input, inFile );
  reset( input );
 
  assign( output, outFile );
  rewrite( output );
 
  {$ifdef DEBUG}
  assign( dbg, dbgFile );
  rewrite( dbg );
  {$endif}
 
end;
 
procedure Finalize;
begin
 
  close( input );
  close( output );
 
  {$ifdef DEBUG}
  close( dbg );
  {$endif}
 
  halt( 0 );
 
end;
 
begin
  Initialize;
  ReadData;
  Solve;
  WriteData;
  Finalize;
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.10.2020, 20:22
Ответы с готовыми решениями:

Составить программы для решения ребусов
Напишите программу решения ребусов с использованием ТРИ+ДВА=ПЯТЬ

Решение арифметических ребусов
EVE ---- = 0, TALKTALKTALK... (здесь 0 - ноль ); DID

Универсальная программа для решения уравнений методом половинного деления
Для одного уравнения я знаю как это сделать,но от меня требуют сделать эту программу универсальной,т.е. уравнение должно передаваться в...

4
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
20.10.2020, 20:24
Цитата Сообщение от selenphenol Посмотреть сообщение
пишу на другом языке
На каком, если не секрет?
0
0 / 0 / 0
Регистрация: 20.10.2020
Сообщений: 7
20.10.2020, 20:35  [ТС]
На плюсах
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
20.10.2020, 20:53
И Паскаль, и C++ -- языки в основе своей императивные процедурные, в данном конкретном случае переводятся друг в друга практически один-в-один. Поэтому утверждение
Цитата Сообщение от selenphenol Посмотреть сообщение
на другом языке, не похожем на него от слова "совсем"
довольно далеко от истины ;-)

Особенности:
Массивы в данном примере индексированы от 1 => необходима коррекция поведения для C++.
Символы строк String индексированы также с 1.
Операция взятия длины строки Length() практически ничего не стоит.
Встроенные множества могут быть заменены плюсовыми аналогами или же строками.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,921
Записей в блоге: 13
21.10.2020, 13:29
Как-то обсуждали
Ребус ТУЧА+ТУЧА=ДОЖДЬ(8 решений)
с примерами решений на C и C++ именно универсального решателя, хотя там и узкозаточенных примеров предостаточно.
А алгоритм прост и в самом общем виде
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Как понимаю
https://www.cyberforum.ru/post6392407.html
алгоритм следующий:
1. составляется строка T - алфавит ребуса - в которой все буквы ребуса перечислены по одному разу.
2. вызывается рекурсивная функция - эквивалент вложенных циклов for - в которой два этапа:
- заполняется строка s символами цифр. На мой взгляд применение строки - лишнее - можно было массив чисел.
- по сформированному распределению цифр по алфавиту ребуса, вычисляется выражение ребуса и при равенстве - вывод результата.
Как понимаю, set of byte - примерный аналог std::set - для проверки "занятости" цифры при очередном распределении по символам алфавита.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2020, 13:29
Помогаю со студенческими работами здесь

Составить программы для решения ребусов.
Ребусы: 1)ОДИН+ОДИН+ОДИН+ОДИН+ОДИН=ПЯТЬ; 2)КУБ=(К+У+Б)3; 3)ТРИ+ДВА=ПЯТЬ; 4)VOLVO+FIAT=MOTOR. При решении ребусов одинаковым...

Расшифровки арифметических ребусов
овладеть алгоритмами перебора на примере задачи расшифровки арифметических ребусов, методами организации циклических алгоритмов и...

Программа для решения ребусов
Всем доброго времени суток! Нуждаюсь в помощи! Нужна написать игру, которая позволяет решать ребусы при помощи замены букв-цифрами, ...

Поиск литературы для решения арифметических задач
Привет всем! Подскажите пожалуйста литературу или конкретные ссылки, которые необходимо изучить для успешного выполнения поставленных...

Универсальная программа для создания, редактирования и проведения тестов
Тема не новая в рассмотрении и вполне уже заезженная. В мире(то бишь в интернете, есть куча тестовых оболочек. Какие-то платные, какие-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru