#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys
#equation = u'удар+удар==драка'
#equation = u'кошка+кошка+кошка==собака'
#equation = u'кто+умён+тот==силён'
#equation = u'где*где-всюду==везде'
equation = u'масло+ноль==омлет'
def replace_all(text, srch, repl):
    for i in range(0, len(srch)):
        text = text.replace(srch[i], repl[i])
    return text
letters = []
for l in equation:
    if l not in ('+', '=', '-', '*'):
        if l not in letters:
            letters.append(l)
tops, counters = [], []
for i in range(0, len(letters)):
    tops.append(10 - i)
    counters.append(0)
canExit = False
while(not(canExit)):
    numbers = ['0','1','2','3','4','5','6','7','8','9']
    substs = []
    for i in range(0, len(tops)):
        substs.append(numbers[counters[i]])
        del numbers[counters[i]]
    text = replace_all(equation, letters, substs)
    try:
        if eval( text ):
            print text
    except:
        None
    N = 0
    inc = 1
    while (N < len(counters) and inc > 0):
        counters[N] += inc
        inc = 0
        if (counters[N] == tops[N]):
            counters[N] = 0
            inc = 1
            N += 1
    canExit = True
    for i in range(0, len(tops)):
        canExit &= (counters[i] == tops[i]-1)
понедельник, 17 февраля 2014 г.
Python: Числовые ребусы
Программка для разгадывания числовых ребусов. Методом грубой силы (т.е. простым перебором).
Подписаться на:
Комментарии к сообщению (Atom)
 
А не замечали, что варианты и неправильные выдаются? Вот на эту же "масло+ноль==омлет":
ОтветитьУдалить35604+7408==43012
37604+5408==43012
36054+7458==43512
37054+6458==43512
02761+9163==10684 *
06231+7134==10359 *
28153+4356==32509
24153+8356==32509
06451+7159==10528 *
27143+5346==32489
25143+7346==32489
17692+4293==21985
14692+7293==21985
02761+9164==10685 *
Такое ощущение, что функцию 'eval' первый значащий ноль сбивает с толку. Не говоря уже о том, что такое решение математически верно, но не совсем подходит под условие (вместо него можно написать "асло+ноль==омлет")...
Кстати, видели ли Вы эту публикацию, а конкретнее эту ветку комментариев: https://habrahabr.ru/company/infopulse/blog/260809/#comment_8477501 ?
Да, спасибо за замечание и за ссылку. Я как-то упустил из виду, что 0123 в питоне - это число в восьмеричной записи, так что при вычислении получаются всякие чудеса.
Удалить