создайте свою собственную систему счисления, используя python - PullRequest
1 голос
/ 20 июня 2020

Я делаю небольшую программу, которая угадывает пароль.

Я делаю эту программу только для обучения, я хочу улучшить свои python навыки, создав программу, которая имеет реальный смысл .

например:

using_characts = "abcdefghijklmnopqrstuvwxyz" # I have other characters in my alphabetic system

Я хочу сделать что-то вроде этого:

for char in myCharacters:
    print(char)
    for char_1 in myCharacters:
        print(char + char_1)
        for char_2 in myCharacters:
            print(char + char_1 + char_2)
            ...etc

, что делает этот метод не динамическим c и жестким в то же время. вывод должен быть примерно таким:

a

b

c

d

e

f

..etc

aa

ab

ac

..etc

ba

bb

bc

..etc

Ответы [ 4 ]

1 голос
/ 20 июня 2020

Итак, другие ответы дали вам код, который, вероятно, будет работать, но я хотел объяснить общий подход. Этот алгоритм использует стек для отслеживания следующих вещей, которые необходимо сгенерировать, и продолжает генерировать, пока не достигнет максимальной длины, указанной вами.

from collections import deque
from typing import Deque, Iterator, Optional


def generate_next_strings(chars: str, base: str = "") -> Iterator[str]:
    # This function appends each letter of a given alphabet to the given base.
    # At its first run, it will generate all the single-length letters of the
    # alphabet, since the default base is the empty string.
    for c in chars:
        yield f"{base}{c}"


def generate_all_strings(chars: str, maxlen: Optional[int] = None) -> Iterator[str]:
    # We "seed" the stack with a generator. This generator will produce all the
    # single-length letters of the alphabet, as noted above.
    stack: Deque[Iterator[str]] = deque([generate_next_strings(chars)])

    # While there are still items (generators) in the stack...
    while stack:
        # ...pop the next one off for processing.
        next_strings: Iterator[str] = stack.popleft()

        # Take each item from the generator that we popped off,
        for string in next_strings:
            # and send it back to the caller. This is a single "result."
            yield string

            # If we're still generating strings -- that is, we haven't reached
            # our maximum length -- we add more generators to the stack for the
            # next length of strings.
            if maxlen is None or len(string) < maxlen:
                stack.append(generate_next_strings(chars, string))

Вы можете попробовать его, используя print("\n".join(generate_all_strings("abc", maxlen=5))) .

1 голос
/ 20 июня 2020

Вы можете использовать itertools.product, но вам действительно стоит ограничиться небольшим числом. Создание декартова произведения для более высоких чисел может занять очень много времени:

from itertools import chain, product
chars = "abcdefghijklmnopqrstuvwxyz"
limit = 2
for perm in chain.from_iterable(product(chars, repeat=i) for i in range(1, limit+1)):
    print("".join(perm))
a
b
c
.
.
.
aa
ab
ac
.
.
.
zy
zz
1 голос
/ 20 июня 2020

Вот go, это сработает. Дайте мне знать, если вы хотите, чтобы я объяснил какую-либо часть.

import itertools

using_characts = "abc"

for str_length in range(1,len(using_characts)+1):
    for q in itertools.product(using_characts,repeat=str_length):
        print("".join(q))
0 голосов
/ 20 июня 2020

Следующий код предоставит вам все комбинации длиной от 1 до max_length - 1:

import itertools

combs = []

for i in range(1, max_length):
    c = [list(x) for x in itertools.combinations(using_characts, i)]
    combs.extend(c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...