Как проверить правильность записи целого числа в восьмеричной системе счисления

Программа должна вывести ответ 'YES', если строка представляет собой правильную запись целого числа в восьмеричной системе счисления, и 'NO', если запись ошибочна.

a = int(input())
if ' %s ' %  oct(a) == 'TRUE':
    print('YES')
else:
    print('NO')

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

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

Можно просто указать для int восьмеричную систему счисления. Если не упадёт - значит всё нормально.

x = input()
try:
    y = int(x, 8)
    print('YES')
except:
    print('NO')
→ Ссылка
Автор решения: Stanislav Volodarskiy

Если вы хотите проверить что на входе восьмеричное целое со знаком, можно проверить что функция int(x, 8) не приводит к ошибке:

x = input()

is_oct = True
try:
    int(x, 8)
except ValueError:
    is_oct = False

if is_oct:
    print('YES')
else:
    print('NO')
$ echo 67 | python is_oct.py
YES

$ echo 68 | python is_oct.py
NO

$ echo -67 | python is_oct.py
YES

$ echo -68 | python is_oct.py
NO

Помимо знака в начале числа этот способ разрешает подчёркивания и префикс '0o' (Integer literals):

$ echo 10_000 | python is_oct.py
YES

$ echo 0o67 | python is_oct.py
YES

Если вам не нравятся эти (довольно странные) дополнения к восьмеричным числам, надо проверять цифры вручную. Во-первых, надо убедиться что строка не пустая. Во-вторых, проверить что каждый символ - восьмеричная цифра:

octs = set('01234567')

x = input()

is_oct = len(x) > 0 and all(d in octs for d in x)

if is_oct:
    print('YES')
else:
    print('NO')

Те же идеи в другом изложении. Из символов строки x строим множество, проверяем что оно подмножество восьмеричных цифр:

octs = set('01234567')

x = input()

is_oct = len(x) > 0 and set(x) <= octs

if is_oct:
    print('YES')
else:
    print('NO')

Не боитесь регулярных выражений? Тогда так:

import re


x = input()

is_oct = re.match('^[0-7]+$', x) is not None

if is_oct:
    print('YES')
else:
    print('NO')
→ Ссылка