Найти - Пользователи
Полная версия: Не могу понять как разработать функцию count_holes(n)
Начало » Центр помощи » Не могу понять как разработать функцию count_holes(n)
1 2 3
Xryst
Принимает 1 аргумент – целое число или строка, которая содержит целое число, и возвращает целое число – количество “отверстий” в десятичной записи этого числа печатными цифрами (считать, что в “4” и в “0” по одному отверстию), или строка ERROR, если переданный аргумент не удовлетворяет требованиям: является действительным или вообще не числом.

Незначущими нулями на початку запису числа, якщо такі є, нехтувати.
Пример:
Вызов функциии: count_holes('123') Возвращает: 0
Вызов функциии: count_holes(906) Возвращает: 3
Вызов функциии: count_holes('ъ001ъ') Возвращает: 0
Вызов функциии: count_holes(-8) Возвращает: 2
Вызов функциии: count_holes(-8.0) Возвращает: ERROR
Xryst
Вот что у меня получилось:
def count_holes(n):
    if type(n) != int and type(n) != str:
        return "ERROR"
    try:
        int(n)
    except ValueError:
        return "ERROR"
 
    counter = 0
    # числа которые мают отвори
    list_number =['0', '4', '6', '9']
    # перебор входимых данных из списком 
    for i in str(abs(int(n))):
        if i in list_number:
            counter += 1
        elif i == "8":
            counter += 2
    return counter

P.S. Ну есть ошибки подскажите как исправить?:

TroSer
почитайте про long integer
JOHN_16
Так как количество вариантов цифр достаточно ограничено можно просто перебирать известные варианты:
def count_holes(value):
    # словарь символов имеющих 1 и более отверстий в цифре
    dictionary={'0':1,
'4':1,
'6':1,
'8':2,
'9':1}
    # проверяем аргумент на принадлежность целочисленному типу
    try:
        int(value)
    except ValueError:
        return 'ERROR'
    # собственно сам подсчет
    result=0
    for item in str(int(value)): # конструкция str(int()) здесь используется что бы убрать лидирующие нули
        result+=dictionary.get(item, 0)
    return result
Также подсчет можно упростить используя генераторные выражения:
return sum([dictionary.get(item, 0) for item in str(int(value))])
terabayt
JOHN_16
Xryst
Вызов функциии: count_holes(-8.0) Возвращает: ERROR

JOHN_16
конструкция str(int()) здесь используется что бы убрать лидирующие нули
str(value).lstrip('0')
Xryst
JOHN_16
Так как количество вариантов цифр достаточно ограничено можно просто перебирать известные варианты:
А как испаравить ошибки, выше:
terabayt
Xryst
А как испаравить ошибки, выше
def count_holes(n):
    try:
        int(n)
    except ValueError:
        return "ERROR"
    counter = 0
    list_number =['0', '4', '6', '9']
    for i in str(abs(int(n))):
        if i in list_number:
            counter += 1
        elif i == "8":
            counter += 2
    return counter
Xryst
terabayt
Когда я запускаю свой код:
def count_holes(n):
    if type(n) != int and type(n) != str:
        return "ERROR"
    try:
        int(n)
    except ValueError:
        return "ERROR"
 
    counter = 0
    # числа которые мают отвори
    list_number =['0', '4', '6', '9']
    # перебор входимых данных из списком 
    for i in str(abs(int(n))):
        if i in list_number:
            counter += 1
        elif i == "8":
            counter += 2
    return counter
Возникают ошибки, как их исправить???:
py.user.next
Xryst
Вот что у меня получилось:
[guest@localhost nholes]$ python3 -mdoctest nholes.doct
**********************************************************************
File "nholes.doct", line 108, in nholes.doct
Failed example:
f('1\n')
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 110, in nholes.doct
Failed example:
f('\n1')
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 112, in nholes.doct
Failed example:
f('1 ')
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 114, in nholes.doct
Failed example:
f(' 1')
Expected:
'ERROR'
Got:
0
**********************************************************************
1 items had failures:
4 of 54 in nholes.doct
***Test Failed*** 4 failures.
[guest@localhost nholes]$

JOHN_16
Так как количество вариантов цифр достаточно ограничено можно просто перебирать известные варианты:
[guest@localhost nholes]$ python3 -mdoctest nholes.doct
**********************************************************************
File "nholes.doct", line 69, in nholes.doct
Failed example:
f(1.5)
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 71, in nholes.doct
Failed example:
f(1.0)
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 73, in nholes.doct
Failed example:
f(-1.5)
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 75, in nholes.doct
Failed example:
f(-1.0)
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 108, in nholes.doct
Failed example:
f('1\n')
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 110, in nholes.doct
Failed example:
f('\n1')
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 112, in nholes.doct
Failed example:
f('1 ')
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 114, in nholes.doct
Failed example:
f(' 1')
Expected:
'ERROR'
Got:
0
**********************************************************************
1 items had failures:
8 of 54 in nholes.doct
***Test Failed*** 8 failures.
[guest@localhost nholes]$

terabayt
Xryst
А как испаравить ошибки, выше
def count_holes(n):

[guest@localhost nholes]$ python3 -mdoctest nholes.doct
**********************************************************************
File "nholes.doct", line 69, in nholes.doct
Failed example:
f(1.5)
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 71, in nholes.doct
Failed example:
f(1.0)
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 73, in nholes.doct
Failed example:
f(-1.5)
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 75, in nholes.doct
Failed example:
f(-1.0)
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 108, in nholes.doct
Failed example:
f('1\n')
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 110, in nholes.doct
Failed example:
f('\n1')
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 112, in nholes.doct
Failed example:
f('1 ')
Expected:
'ERROR'
Got:
0
**********************************************************************
File "nholes.doct", line 114, in nholes.doct
Failed example:
f(' 1')
Expected:
'ERROR'
Got:
0
**********************************************************************
1 items had failures:
8 of 54 in nholes.doct
***Test Failed*** 8 failures.
[guest@localhost nholes]$


Свой вариант:
def nholes(num):
    if not isinstance(num, int):
        if not isinstance(num, str):
            return 'ERROR'
        else:
            if num and num[0] == '-':
                num = num[1:]
            if not num.isdigit():
                return 'ERROR'
    num = abs(int(num))
    t = (1, 0, 0, 0, 1, 0, 1, 0, 2, 1)
    sm = int(num == 0)
    while num > 0:
        sm += t[num % 10]
        num = int(num / 10)
    return sm

Тесты nholes.doct:
>>> from nholes import nholes as f
>>>
>>> f(0)
1
>>> isinstance(f(0), bool)
False
>>> f(1)
0
>>> isinstance(f(1), bool)
False
>>> f(2)
0
>>> f(3)
0
>>> f(4)
1
>>> f(5)
0
>>> f(6)
1
>>> f(7)
0
>>> f(8)
2
>>> f(9)
1
>>>
>>> f(123)
0
>>> f(345)
1
>>> f(678)
3
>>> f(40689)
6
>>> f(12357)
0
>>> f(1000)
3
>>> f(1888)
6
>>> f(1448866992)
10
>>>
>>> f(-1)
0
>>> f(-4)
1
>>> f(-2)
0
>>> f(-8)
2
>>>
>>> f(1L)
0
>>> f(8L)
2
>>> f(-1L)
0
>>> f(-8L)
2
>>>
>>> f('123')
0
>>> f('468')
4
>>> f('-123')
0
>>> f('-468')
4
>>> f('0')
1
>>> f('00')
1
>>> f('000')
1
>>>
>>> f(1.5)
'ERROR'
>>> f(1.0)
'ERROR'
>>> f(-1.5)
'ERROR'
>>> f(-1.0)
'ERROR'
>>>
>>> f('1.5')
'ERROR'
>>> f('1.0')
'ERROR'
>>> f('-1.5')
'ERROR'
>>> f('-1.0')
'ERROR'
>>>
>>> f('')
'ERROR'
>>> f('a')
'ERROR'
>>> f('ab')
'ERROR'
>>> f('0a')
'ERROR'
>>> f('a0')
'ERROR'
>>> f('aa0')
'ERROR'
>>> f('0aa')
'ERROR'
>>> f('a0a')
'ERROR'
>>> f('00a')
'ERROR'
>>> f('a00')
'ERROR'
>>>
>>> f('1\n')
'ERROR'
>>> f('\n1')
'ERROR'
>>> f('1 ')
'ERROR'
>>> f(' 1')
'ERROR'
>>>

Add
Добавил значения с L в тесты.
Xryst
TroSer
long integer
Я и так не чего и не понял(
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB