Comments: |
> непростой ребус для решения вручную
По-моему, как раз несложный: А, Ш, В находятся сразу; после этого для Р, И, О есть 8 вариантов; два из них сразу дают единственное решение, остальные невозможны.
Ну, "непростой" это относительное понятие :)
ОК :) Просто обычно в таких задачах я не вижу, откуда можно было бы начать, и прихожу в отчаяние... А тут сразу было понятно, где можно хотя бы попытаться зацепиться.
А сможет ли оно построить магический квадрат 3×3 из квадратов различных целых чисел? Вроде ограничения здесь сформулировать легко, а задачка до сих пор нерешённая.
Есть ли причина для вашего извращения, кроме извращенности ума (это я про решатель)?
Почему не так: constraint 10*(10*(10*m+o)+r)+e + 10*(10*(10*(10*s+t)+o)+r)+m = 10*(10*(10*(10*(10*a+v)+a)+r)+i)+y;
Мне кажется, такой подход будет практически эквивалентом полного перебора и практически не задействует бэктрекинг и всякие хитрые эвристики в решателях.
Какие такие эвристики. По моему этот миницинк тупее перебора и калькулятора. Не может решить вот это
var float: x; var int: y; constraint x = 555; constraint y > 0; constraint y < x; constraint abs(y - sqrt(x)) <= 0.5; solve satisfy;
Хотя на калькуляторе элементарно round(sqrt(555)) = 24.
Второе место в рейтинге никчемности программ, после издающего пукающие звуки приложения для телефона.
> Какие такие эвристики
Most constrained variable, least constraining value и пр. - вот это все.
Я так понимаю, что идея состоит в том, что для некоторых(*) задач удачно(*) подобранный набор констрейнтов может(*) привести к большому выигрышу в быстродействии (против обычного перебора с возвратом).
(*) - а может и к пукающим звукам.
edit: constraining
Edited at 2018-05-26 06:25 (UTC)
From: (Anonymous) 2018-05-25 09:26 am
| (Link)
|
А вы пробовали Sentient?
А почему вы выбрали путь подсчета отдельных сумм и "ловли" переноса, а не путь подсчета всего равенства (с умножением на соответствующую позиции степень 10)?
Т. е. почему не стали делать так: constraint (M*1000 + O*100 + R*10 + E) + (S*10000 + T*1000 + O*100 + R*10 + M) == A*100000 + V*10000 + A*1000 + R*100 + I*10 + Q; ?
> для решения следующего ребуса: МОРЕ+ШТОРМ=АВАРИЯ.
Почему не написать просто цикл на обычном языке программирования и перебрать все варианты (на компилируемом языке вычислит быстро) ?
А думать лучше над более сложными задачами...
From: (Anonymous) 2018-05-25 03:09 pm
| (Link)
|
Чтобы почувствовать разницу, напишите Судоку на императивном и декларативном (напр. Пролог) языках.
у аввы был пост когда-то, как двое (независимо) писали Судоку на императивном языкe - один нормальный, придумал идею и алгоритм и написал, а 2-й c agile фигнёй страдал
// Ворчливо
Честно говоря, Самба больше соответствует моим представлениям о домашнем уюте, чем такие вот языки. Все-таки какая ни на есть польза в хозяйстве.
>>> def evalword(*args):
... return int(''.join(map(str, args)))
...
>>> import itertools
>>> for М,О,Р,Е,Ш,Т,А,В,И,Я in itertools.permutations(range(10)):
... if М and Ш and А:
... if evalword(М,О,Р,Е) + evalword(Ш,Т,О,Р,М) == evalword(А,В,А,Р,И,Я):
... print(evalword(М,О,Р,Е), '+', evalword(Ш,Т,О,Р,М), '=', evalword(А,В,А,Р,И,Я))
...
3625 + 97623 = 101248
6372 + 95376 = 101748
А это Пролог такой своеобразный? | |