Задать вопрос
Big_Alex
@Big_Alex
молод и перспективен

Философский вопрос про скидочные купоны?

Задача:
надо написать генератор промо-купонов примерно такого вида ХХХХ-ХХХХ-ХХХХ-ХХХХ (плюс\минус\примерно). Нагенерировать их надо овер дофига (100k +)..
Вопросы:
1. на какие библиотеки python'а обратить внимание ???..
2. и как правильно подобрать нужную библиотеку ??..
3. где можно глянуть пример подобного проекта ??...
  • Вопрос задан
  • 464 просмотра
Подписаться 1 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 8
@Nwton
Что за разработчики пошли, чтобы решить задачу в 2 строки, им нужны какие-то библиотеки: https://jsfiddle.net/rLr7kc4z/1/
Ответ написан
x67
@x67
Просто рандомно генерируете купоны. Конечно в идеале нужна проверка на схожесть, но 100к перебирать не очень то удобно. Для оптимизации этой задачи при генерации одного купона нужно ввести какой нибудь показатель, например сумму всех ord() от каждого знака. Тогда проверять нужно будет уже не каждый купон, а только те, которые имеют одинаковую сумму. Это и позволит ускорить проверку. Ну а для самой генерации нужен просто равномерный рандом. Умеете писать код - проблем ни с генерацией, ни с проверкой не будет. Не умеете - учитесь или заказывайте. Причем можно заказать реализацию даже на низкоуровневых языках)
Ответ написан
Комментировать
BuriK666
@BuriK666
Компьютерный псих
используйте UUID
Ответ написан
Комментировать
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
где можно глянуть пример подобного проекта ??...

Проекта? Тут решение в одну строку

import random, string
random.seed()
'-'.join((''.join([random.choice(string.uppercase + string.digits) \
    for x in range(4)]) for y in range(4)))

>> '58F4-U8R4-4DTV-5JMP'
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
на какие библиотеки python'а обратить внимание ???.
ОМГ! Это пишется без всяких либ руками в несколько строк!
Ответ написан
Комментировать
Я бы первые 6 цифр генерил последовательно (10^6 комибнаций), а остальные 10 — чистый рандом. Тогда гарантированно ничего не совпадёт.

Если нужна проверяемость без БД, тогда последниче 10 цифр - какой-нибудь хеш от первых шести с солью.

total = 10

print("RANDOM:")
import random

for n in range(total):
    rest = random.randint(0,10**10-1)
    code = "{n:06}{rest:010}".format(n=n, rest=rest)
    formatted = code[0:4] + "-" + code[4:8] + "-" + code[8:12] + "-" + code[12:]
    print(formatted)


print("TESTABLE:")

import hashlib

SALT = "some_salt"

def generate(n):
    _bytes = (str(n) + SALT).encode("ascii")
    _hash = hashlib.md5(_bytes).hexdigest()
    rest = int(_hash, base=16) % (10**10)
    code = "{n:06}{rest:010}".format(n=n, rest=rest)
    formatted = code[0:4] + "-" + code[4:8] + "-" + code[8:12] + "-" + code[12:]
    return formatted

def test(code):
    raw_code = code.replace("-","")
    n = int(raw_code[0:6])
    return code == generate(n)
        
for n in range(total):
    code = generate(n)
    print(code, test(code))

Вот тут можно запустить: ideone.com/2I704P
Ответ написан
Комментировать
Big_Alex
@Big_Alex Автор вопроса
молод и перспективен
СПС всем, кто отозвался за рекомендации..
вот.. уже нацарапал пару строк.. ))

import random
import string

length = 16  # кол-во символов в купоне
quantity = 100000  # кол-во купонов
chars = string.ascii_uppercase + string.ascii_lowercase + string.digits  # набор символов для купонов


def mask(c, length): # маски для купонов
    if length == 16:
        c = c[0:4] + '-' + c[4:8] + '-' + c[8:12] + '-' + c[12:16]  # маска на 16 символов
    elif length == 12:
        pass
    elif length == 9:
        pass
    return c


def coupon(length):  # ф-я генерации одного купона заданной длинны.
    l = []
    c = str
    for i in range(0, length):
        l.append(random.choice(chars))
        c = ''.join(l)
    c = mask(c, length)
    return c


def generator(quantity):  # а теперь генерим их сколько надо
    a_file = open('data.txt', 'w')

    for i in range(0, quantity):
        a = coupon(length)
        line = (a + '\n')
        a_file.write(line)
        # print(a)

    a_file.close()


generator(quantity)


это не финальный вариант.. буду ещё допиливать..
Ответ написан
Комментировать
seoresait
@seoresait
web developer
Если задача именно получить 100к промиков, почему не воспользоваться онлайн генератором?
к примеру этим pswrd.getcode.xyz
Другое дело если хочется именно на python... ну это Вам уже подсказали))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы