Ответы пользователя по тегу Алгоритмы
  • Как сгенерировать корректный номер налоговой записи налогоплательщика (ИНН)?

    atomheart
    @atomheart
    Пишу на Python за карму и за деньги
    Внесу свою лепту на Python + функция проверки на валидность ИНН:

    def inn_ctrl_summ(nums, type):
        """
        Подсчет контрольной суммы
        """
        inn_ctrl_type = {
            'n2_12': [7, 2, 4, 10, 3, 5, 9, 4, 6, 8],
            'n1_12': [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8],
            'n1_10': [2, 4, 10, 3, 5, 9, 4, 6, 8],
        }
        n = 0
        l = inn_ctrl_type[type]
        for i in range(0, len(l)):
            n += nums[i] * l[i]
        return n % 11 % 10
    
    
    def inn_gen(l=None):
        """
        Генерация ИНН (10 или 12 значный)
        На входе указывается длина номера - 10 или 12.
        Если ничего не указано, будет выбрана случайная длина.
        """
        if not l:
            l = list((10, 12))[rnd(0, 1)]
        if l not in (10, 12):
            return None
        nums = [
            rnd(1, 9) if x == 0
            else rnd(0, 9)
            for x in range(0, 9 if l == 10 else 10)
        ]
        if l == 12:
            n2 = inn_ctrl_summ(nums, 'n2_12')
            nums.append(n2)
            n1 = inn_ctrl_summ(nums, 'n1_12')
            nums.append(n1)
        elif l == 10:
            n1 = inn_ctrl_summ(nums, 'n1_10')
            nums.append(n1)
        return ''.join([str(x) for x in nums])
    
    
    def inn_check(inn):
        """
        Проверка ИНН на корректность
        В соответствии с алгоритмом, описанным по ссылке:
            https://ru.wikipedia.org/wiki/Контрольное_число
        """
        sinn = str(inn)
        nums = [int(x) for x in sinn]
        if len(sinn) == 10:
            n1 = inn_ctrl_summ(nums, 'n1_10')
            return n1 == nums[-1]
        elif len(sinn) == 12:
            n2 = inn_ctrl_summ(nums, 'n2_12')
            n1 = inn_ctrl_summ(nums, 'n1_12')
            return n2 == nums[-2] and n1 == nums[-1]
        else:
            return False
    Ответ написан
    Комментировать