Найти - Пользователи
Полная версия: циклы?
Начало » Python для новичков » циклы?
1 2
PEHDOM
old_monty
Всего будет 6! = 720
чтото мне подсказывает что к-во вариантов будет больше с учетом того что в английском алфавите 26 букв. Всего будет 26**6 вариантов, в данном конкретном случае.
Задача у ТС описана крайне расплывчато. Мы должны генерировать новое слово и если оно не совпало заново генерировать все слово? Или мы генерируем слово сравниваем какие символы совпали и больше их не генерируем?

В первом случае можно просто генерировать случайное сочетание букв пока не совпадет.
 import random
chars = 'abcdefghijklmnopqrstuvwxyz'
pattern = 'python'
sample = ''
while sample != pattern:
    gen = [random.choice(chars) for char in pattern]
    sample = ''.join(gen)
    print(sample)
print('word generated:', sample)
По времени как повезет,может и на второй итерации слово сложиться, а может и на последней.
Метод имеет существенный минус, нету гарантированого времени когда слово сгенерируеться.
Все зависит от рандома, в теории можно бесконечно долго ждать когда выпадет нужная комбинация букв и так и не дождаться.
Поэтому более подходящий метод эт брутфорс, тут нужна рекурсия.
 def gen(pattern, sample):
    chars = 'abcdefghijklmnopqrstuvwxyz'
    for char in chars:
        result = sample+char
        print(result)
        if len(pattern) > len(result):
            result = gen(pattern, result)
        if pattern == result:
            return result
        else:
            continue
pattern = 'python'
sample = ''
sample = gen(pattern, sample)
print('word generated:', sample)
Время работы зависит от длинны слова. И увеличиваеться в геометрической прогресии.
НО зато мы гарантировано знаем что при запасе времени достаточом для перебора всех вариантов мы гарантировано получим результат.

если мы ищем ‘abc’ то результат достаточно быстрый:
>>> 
a
aa
aaa
.........
aaz
ab
aba
abb
abc
word generated: abc
>>>
а вот ‘python’ я так и не дождался за 20 минут, прервал на abzxdf
Это если без всяикиз итертулзов.
на итертулзе этот же алгоритм:
 import itertools
patern = 'python'
chars = 'abcdefghijklmnopqrstuvwxyz'
for sample in itertools.combinations_with_replacement(chars, len(patern)):
    print(''.join(sample))
    if ''.join(sample) == patern:
        break
print('word generated:', ''.join(sample))
по ощущениям работает на порядок быстрее чем рекурсия. Скорее всего потому что в примере с рекурсией идет работат с строками, а итертулз выдает кортежи.Но для понимания алгоритма это неприципиально.

Во втором же случае(когда генерируем посимвольно пока символ не совпадет) скорость возрастает просто до мгновенной .
можно использовать рандом:
 import random
chars = 'abcdefghijklmnopqrstuvwxyz'
pattern = 'python'
gen = ['' for char in pattern]
sample = ''
while sample != pattern:
    for i, char in enumerate(pattern):
        if (gen[i] != char) :
            gen[i] = random.choice(chars)
    sample = ''.join(gen)
    print(sample)
print('word generated:', sample)

А можно просто перебор по порядку.
 chars = 'abcdefghijklmnopqrstuvwxyz'
pattern = 'python'
sample = ''
for pat in pattern:
    for char in chars:
        print(sample+char)
        if char == pat:
            sample = sample+char
print('word generated:', sample)

old_monty
1.
PEHDOM
old_monty
Всего будет 6! = 720
чтото мне подсказывает что к-во вариантов будет больше с учетом того что в английском алфавите 26 букв.
Цитируйте добросовестно, пожалуйста. У меня сказано о количестве “сочетаний c учетом перестановок” (или просто перестановок, как поправил меня py.user.next) для слова “python”:
old_monty
В слове “python” 6 букв. Всего будет 6! = 720 возможных сочетаний из 6 букв по 6 в каждом с учетом перестановок.
И дальше я предложил pythonmaks
old_monty
эту идею можете взять за основу, и перебирать весь алфавит (как у вас сказано в условии).
2.
PEHDOM
Задача у ТС описана крайне расплывчато.
с этим согласен, но для того и форум, чтобы уточнять условия задач (и заодно пробовать свои способности в телепатии )
old_monty
pythonmaks
через циклы , как например?
Подробные варианты см. в ответе PEHDOM.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB