Почему мой ответ неверный

Автомат обрабатывает натуральное число N > 1 по следующему алгоритму:

  1. Строится двоичная запись числа N.
  2. В конец записи (справа) дописывается вторая справа цифра двоичной записи.
  3. В конец записи (справа) дописывается вторая слева цифра двоичной записи.
  4. Результат переводится в десятичную систему. Для скольких значений N в результате работы алгоритма получится число, принадлежащее отрезку [150; 250]?

Мой код:

def perevod(n):
    return (int(n,base=2))
s=0
for i in range(10,1000):
    a=bin(i)
    if str(a)[3]==1:
        a=str(a)+'1'
    else:
        a=str(a)+'0'
    if str(a)[-3]==1:
        a=str(a)+'1'
    else:
        a=str(a)+'0'
    b = str(a)[2:]
    c = perevod(b)
    if c>=150 and c<=250:
        s+=1
print(s)

Но верный ответ - 24, а мне выдаёт 25, откуда берётся лишняя единица?


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

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

Условия str(a)[3]==1 и str(a)[-3]==1 ложные, из-за строгой типизации, что, например, при сравнении '1' и 1 вернет False, т.к. это разные типы.

Да и сами этим проверки излишние, т.к. можно взять сами значения из двоичного представления числа, т.к. bin вернет строку

Переписал код:

def perevod(n: str) -> int:
    return int(n, base=2)

s = 0
for i in range(10, 1000):
    a = bin(i)[2:]
    a += a[-2]
    a += a[1]

    c = perevod(a)
    if 150 <= c <= 250:
        s += 1
print(s)
# 24
→ Ссылка
Автор решения: Stanislav Volodarskiy

Ошибка в том что условие str(a)[3]==1 всегда ложно.

a - строка. То есть вызов str не нужен. Выражение a[3] имеет тип строка и состоит из одного символа. Никакой символ не может быть равен числу один. Условие всегда ложно.

Правим код:

if str(a)[3]=='1':
    a=str(a)+'1'
else:
    a=str(a)+'0'

Замечаем что его можно переписать:

if str(a)[3] == '1':
    a = str(a) + str(a)[3]
else:
    a = str(a) + str(a)[3]

Обе части if одинаковы. Убираем if:

a = str(a) + str(a)[3]

Упрощаем:

a = a + a[3]

Ещё упрощаем:

a += a[3]

Целиком код выглядит так:

def perevod(n):
    return int(n, base=2)


s = 0
for i in range(10, 1000):
    a = bin(i)
    a += a[3]
    a += a[-3]
    b = a[2:]
    c = perevod(b)
    if 150 <= c <= 250:
        s += 1
print(s)
→ Ссылка