#!/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 в питоне - это число в восьмеричной записи, так что при вычислении получаются всякие чудеса.
Удалить