Пользователь вводит алфавит, в котором не должны содержаться одинаковые буквы, также вводится номер, по этому номеру необходимо составить слово

Алгоритм составления слова выглядит следующим образом:

Пусть алфавит (абс), нумерация элементов алфавита начинается с единицы, то есть у а порядковый номер единица и тд

  • Номер обозначим N и положим N=321

  • n=количество элементов алфавита(3 в нашем случае)

  • k=количество элементов в слове

  • pos - i-индекс элемента алфавита

    N= n^(k-1)*pos1+n^(k-2)pos2+...+posk

Если k>n к1=к2*n+r;1<=r<=n

Говоря простыми словами, r- остаток от деления ki/n

Для нашего примера:

N=321=107*3=106*3+3=(35*3+1)*3+3=((11*3+2)*3+1)*3+3=(((3*3+2)*3+2)*3+1)*3+3=((3*3^2+2*3+2)*3+1)*3+3=((3*3^3+2*3^2+2*3+1)*3+3=3*3^4+2*3^3+2*3^2+3+3

Получим слово сббас

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

N=321

ost_list=[]
k1_list=[]
k1=int(N/countOfABC)
ost=int(N%countOfABC)

ost_list.append(ost)
k1_list.append(k1)


print(k1,"*",countOfABC,"+",ost)
dictK1=dict()

while k1>countOfABC:
    if ost==0:
        k1-=1
        ost=1*countOfABC
        ost_list.append(ost)
        k1_list.append(k1)
        print(k1, "*", countOfABC, "+", ost)
    ost = k1 % countOfABC
    ost_list.append(ost)
    k1 = int(k1 / countOfABC)
    k1_list.append(k1)
    print(k1, "*", countOfABC, "+", ost)

dictK1 = dict(zip(k1_list, ost_list))
listResverse=list(k1_list.__reversed__())

# for id in range(len(listResverse)):
#     for value in enumerate(listResverse):
#      print("(((",listResverse[id],"*",countOfABC,"+",dictK1[value],")*",countOfABC,"+",dictK1[value+1],")*",countOfABC
#           ,"+",dictK1[value+2],")*",countOfABC,"+",dictK1[value+3])

Ответы (2 шт):

Автор решения: MBo

Если я правильно понял, вам нужно что-то вроде Excel-овской нумерации колонок

def rep(N, al):
    res = ""
    N -= 1
    n = len(al)
    while N >= 0:
        res = alphabet[N % n] + res
        N  = N // n - 1
    return res

alphabet = "abc"
print(rep(321, alphabet))

>>> cbbac

Если нужна полученная формула:

def repp(N, al):
    res = ""
    s = ""
    N -= 1
    n = len(al)
    p3 = 0
    while N >= 0:
        res = alphabet[N % n] + res
        s = f'{N%n+1}*[{n}^{p3}] + ' + s
        N  = N // n - 1
        p3 += 1
    return res, s[:-3]

321 ('cbbac', '3*[3^4] + 2*[3^3] + 2*[3^2] + 1*[3^1] + 3*[3^0]')
→ Ссылка
Автор решения: ill_999
ABC=input("Введите алфавит:\n")

ABC_Work=(ABC.upper())

ABC_Result1=" "
for char in ABC_Work:
     if char not in ABC_Result1:
         ABC_Result1+=char

ABC_Result=ABC_Result1.replace(" ","")

if ABC_Result.isalpha()!=True:
    raise ValueError("В алфавите должны содержаться только буквы!")

dictionary = dict()

for i in range(len(ABC_Result)):
            dictionary[ABC_Result[i]] = i + 1

N =int(input("Введите номер:\n"))
        countOfABC = len(ABC_Result)
        ost_list = []
        k1_list = []
        k1 = N
        k1_list.append(k1)
        list_base = []
        list_base.append(f"{N}")
        if N==0:
         raise ValueError("Пустое слово!")
        while k1 > countOfABC:
            if (k1 % countOfABC) == 0:
                k1 = int((k1 - countOfABC) / countOfABC)
                ost = countOfABC
                ost_list.append(ost)
                k1_list.append(k1)
                list_base.append(f"{k1}*{countOfABC}+{ost}")
                continue
            ost = k1 % countOfABC
            ost_list.append(ost)
            k1 = k1 // countOfABC
            k1_list.append(k1)
            list_base.append(f"{k1}*{countOfABC}+{ost}")

        kk = k1_list[-1]
        s = f"((({kk}"

        for i in range(len(ost_list) - 1, -1, -1):
            s += f"*{countOfABC}+{ost_list[i]})"

        count = s.count("*")
        s1 = f""
        ost_list.append(k1)

        dictNumber = dict()
        for i in range(len(ABC_Result)):
            dictNumber[i + 1] = ABC_Result[i]

        string = ""
        for i in range(len(ost_list) - 1, -1, -1):
            string += f"{dictNumber[ost_list[i]]}"
            s1 += f"{ost_list[i]}*{countOfABC}^{count}+"
            count -= 1
        print("=".join(list_base), "=", s, "=", s1[:-1], "=", string)
    
→ Ссылка