IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Авторешение головоломки, Delphi
Nike0
сообщение 29.09.2010 12:32
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Доброго времени суток. Обращаюсь с таким вопросом: можете подкинуть какую-нибудь идею с авторешением головоломки Прикрепленное изображение. Смысл её заключается в том, чтобы расставить +,-,*,/ и = так чтобы получилось верное равенство, но при этом они могут использоваться 1 раз, также если будет такое выражение 18-6*3, то сначало будет выполняться 18-6, а только потом умножаем на 3.
У меня были свои идеи по поводу решения этой задачи, но к сожалению они не эргономичны и глупы, можно сказать лбом пробивал решение)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 29.09.2010 13:08
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Перебор, какие сложности? Расставить 5 знаков в 5 клетках, всего 5!=120 вариантов.
Тут интереснее, как заставить программу считывать значения из полей и самой заполнять пробелы.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Nike0
сообщение 29.09.2010 13:13
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата(TarasBer @ 29.09.2010 13:08) *

Перебор, какие сложности? Расставить 5 знаков в 5 клетках, всего 5!=120 вариантов.
Тут интереснее, как заставить программу считывать значения из полей и самой заполнять пробелы.

про перебор я тоже думал, мне тоже очень интересно, как посчитать, запомнить и заполнить ячейки
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.09.2010 13:21
Сообщение #4


Гость






Цитата
меня были свои идеи по поводу решения этой задачи
А ты озвучь их, возможно, они не настолько глупы, как тебе кажется...
 К началу страницы 
+ Ответить 
Nike0
сообщение 29.09.2010 13:34
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата(volvo @ 29.09.2010 13:21) *

А ты озвучь их, возможно, они не настолько глупы, как тебе кажется...

ну это очень долгая история вычисления была бы, но попробую: тот же перебор, но вручную и с огромным количеством проверок, т.е 120 возможных вариантов рассматривалось бы...
вот никак не могу придумать, как это счасть е в небольшую часть кода впихнуть. Если кому-то интересно, вот автоответ smile.gif (т.е. в кнопку уже забито правильное положение символов)
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.09.2010 13:45
Сообщение #6


Гость






Цитата
ну это очень долгая история вычисления была бы, но попробую: тот же перебор, но вручную и с огромным количеством проверок, т.е 120 возможных вариантов рассматривалось бы...
blink.gif Каких проверок? Это в 50 строк все делается:

type
oper = (plus, minus, mult, divv, eq);

const
arr: array[1 .. 6] of integer = (7, 12, 24, 6, 6, 4);
s_ops: array[oper] of char = ('+', '-', '*', '/', '=');
var
op: set of oper;
ops: array[1 .. 5] of oper;

procedure calc(level: integer);
var
i: oper;
j, left, curr: longint;
begin
if level = 6 then
begin
curr := arr[1];
for j := 1 to 5 do
case ops[j] of
plus: curr := curr + arr[j + 1];
minus: curr := curr - arr[j + 1];
mult: curr := curr * arr[j + 1];
divv: curr := curr div arr[j + 1];
eq:
begin
left := curr; curr := arr[j + 1];
end;
end;

if left = curr then
begin
for j := 1 to 5 do
write(arr[j], ' ', s_ops[ops[j]], ' ');
writeln(arr[6]);
end;
end
else
for i := plus to eq do
begin
if not (i in op) then
begin
include(op, i);
ops[level] := i;
calc(level + 1);
exclude(op, i);
end;
end;
end;

begin
calc(1);
end.
Вот результат:

Running "f:\programs\pascal\test.exe"
7 + 12 / 24 = 6 - 6 * 4
7 * 12 - 24 / 6 = 6 + 4


, Первый вариант - приблизительный, второй - точный. Отсечь приблизительный - еще одна строка. Какие проверки? smile.gif Вся твоя задача - в том, чтобы считать исходные данные (числа каждой строки) в массив arr. Хочешь, прогоню программу со второй строкой?
 К началу страницы 
+ Ответить 
Nike0
сообщение 29.09.2010 14:16
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата(volvo @ 29.09.2010 13:45) *

Первый вариант - приблизительный, второй - точный. Отсечь приблизительный - еще одна строка. Какие проверки? smile.gif Вся твоя задача - в том, чтобы считать исходные данные (числа каждой строки) в массив arr. Хочешь, прогоню программу со второй строкой?

мм, спасибо) счас посидел поэтапно посмотрел как перебирает решения, но так и не понял какую строку нужно добавить для отсечения приблизительного решения
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.09.2010 16:00
Сообщение #8


Гость






Ну, например
вот так (Показать/Скрыть)
, как видишь, даже строку добавлять не пришлось, достаточно было только производить все вычисления с вещественными, а не с целыми числами...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 14:55
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"