Ответ 1
Вы можете просто проверить, является ли число при преобразовании в строку подстрокой '1234567890'
:
str(num) in '1234567890'
Я работал над проблемой, которая определяет, находятся ли цифры в числах в возрастающей последовательности. Теперь подход, который я использовал для решения этой проблемы, был, например, рассмотрим число 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
Вы можете просто проверить, является ли число при преобразовании в строку подстрокой '1234567890'
:
str(num) in '1234567890'
Вы можете сжать строковое представление числа со сдвинутым "я" и перебирать последовательные цифры вместе. Используйте all
чтобы проверить, что цифры следуют, используя модуль 10 для обработки 0.
num = 7890
result = all((int(y)-int(x))%10 == 1 for x,y in zip(str(num),str(num)[1:]))
Поскольку у вас уже есть 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))
Я хотел бы создать велосипедный генератор и нарезать, что:
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
Вот мой дубль, который просто смотрит на цифры и выходит, как только возникает расхождение:
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)
Каким-то образом этот вопрос заставил меня задуматься о Палиндромах, и это заставило меня задуматься об этом по-другому.
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 и выручить при первой неудаче. Я хотел бы посмотреть на размер проверяемых номеров и время, чтобы решить, что было быстрее.
Я бы попробовал это, немного многословно для удобства чтения:
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('<<<<<<')