Проверьте, находятся ли цифры в числе в возрастающей последовательности в python

Я работал над проблемой, которая определяет, находятся ли цифры в числах в возрастающей последовательности. Теперь подход, который я использовал для решения этой проблемы, был, например, рассмотрим число 5678.

Чтобы проверить, является ли 5678 возрастающей последовательностью, я взял первую цифру, следующую цифру и последнюю цифру 5,6,8 и подставил в диапазон функции range(first,last,(diff of first digit and the next to first digit)) т.е. range(5,8+1,abs(5-6)). Результатом является список цифр в порядке возрастания

Для этой проблемы есть ограничение, говорящее

For incrementing sequences, 0 should come after 9, and not before 1, as in 7890. Теперь моя программа прерывается на входе 7890. Я не знаю, как кодировать эту логику. Может кто-то помочь мне, пожалуйста?.

Код для увеличения последовательности был

  len(set(['5','6','7','8']) - set(map(str,range(5,8+1,abs(5-6))))) == 0 

Ответы

Ответ 1

Вы можете просто проверить, является ли число при преобразовании в строку подстрокой '1234567890':

str(num) in '1234567890'

Ответ 2

Вы можете сжать строковое представление числа со сдвинутым "я" и перебирать последовательные цифры вместе. Используйте all чтобы проверить, что цифры следуют, используя модуль 10 для обработки 0.

num = 7890

result = all((int(y)-int(x))%10 == 1 for x,y in zip(str(num),str(num)[1:]))

Ответ 3

Поскольку у вас уже есть zip-версия, вот альтернативное решение:

import sys


order = dict(enumerate(range(10)))
order[0] = 10

def increasing(n):
    n = abs(n)
    o = order[n % 10] + 1
    while n:
        n, r = divmod(n, 10)
        if o - order[r] != 1:
            return False
        o = order[r]
    return True


for n in sys.argv[1:]:
    print n, increasing(int(n))

Ответ 4

Я хотел бы создать велосипедный генератор и нарезать, что:

from itertools import cycle, islice

num = 5678901234

num = tuple(str(num))
print(num == tuple(islice(cycle(map(str, range(10))), int(num[0]), int(num[0]) + len(num))))

Это быстрее, чем решения, которые проверяют различия между отдельными цифрами. Конечно, вы можете пожертвовать длиной, чтобы сделать ее быстрее:

def digits(num):
    while num:
        yield num % 10
        num //= 10

def check(num):
    num = list(digits(num))
    num.reverse()
    for i, j in zip(islice(cycle(range(10)), num[0], num[0] + len(num)), num):
        if i != j:
          return False
    return True

Ответ 5

Вот мой дубль, который просто смотрит на цифры и выходит, как только возникает расхождение:

def f(n):
  while (n):
    last = n % 10
    n = n / 10
    if n == 0:
      return True
    prev = n % 10
    print last, prev
    if prev == 0 or prev != (last - 1) % 10:
      return False

print f(1234)
print f(7890)
print f(78901)
print f(1345)

Ответ 6

Каким-то образом этот вопрос заставил меня задуматься о Палиндромах, и это заставило меня задуматься об этом по-другому.

5   6   7   8
8   7   6   5
-------------
13  13  13  13

9   0   1
1   0   9
---------
10  0   10


9   0   1   2
2   1   0   9
-------------
11  1   1   11

И это приводит к этому решению и испытаниям.

pos_test_data = [5678, 901, 9012, 9012345678901]
neg_test_data = [5876, 910, 9021]

def monotonic_by_one(n):
    fwd = str(n)
    tgt = ord(fwd[0]) + ord(fwd[-1])
    return all([ord(f) + ord(r) in (tgt, tgt - 10) for f, r in zip(fwd, reversed(fwd))])


print("Positive: ", all([monotonic_by_one(n) for n in pos_test_data]))
print("Negative: ", all([not monotonic_by_one(n) for n in neg_test_data]))

Результаты:

Positive:  True
Negative:  True

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

Ответ 7

Я бы попробовал это, немного многословно для удобства чтения:

seq = list(input())
seq1 = seq[1:]
seq2 = seq[:-1]

diff = [x-y for x,y in zip([int(x) if int(x)>0 else 10 for x in seq1],[int(x) if int(x)>0 else 10 for x in seq2])]

if any (t != 1 for t in diff) :
    print('not <<<<<')
else :
    print('<<<<<<')