0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 5
1

Secret room

08.08.2019, 10:00. Показов 1414. Ответов 7

Author24 — интернет-сервис помощи студентам
Всем привет!

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

Задание:
На входе ваша функция получит число - общее количество дверей в текущем помещении. Вам нужно будет отсортировать номера дверей в том порядке, в котором эти числа, выраженные словами, идут в алфавитном порядке. А затем вернуть номер позиции, на которой находится последняя дверь (дверь с самым большим номером). Отсчет ведется с 1-й позиции (а не с 0-й). Максимальное количество дверей - 1000. Числа после 100 записываются в формате - 'one hundred twenty nine'. Тысяча - one thousand.

Входные данные: номер двери.

Выходные данные: "правильный" номер двери.

Предусловия:
2 <= количество дверей <= 1000

То что я накодил:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
FIRST_TEN = ["one", "two", "three", "four", "five", "six", "seven",
             "eight", "nine"]
SECOND_TEN = ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
              "sixteen", "seventeen", "eighteen", "nineteen"]
OTHER_TENS = ["twenty", "thirty", "forty", "fifty", "sixty", "seventy",
              "eighty", "ninety"]
HUNDRED = "hundred"
 
 
def checkio(number):
    if number<10:
        return FIRST_TEN[number - 1]
    elif number<20:
        return SECOND_TEN[number - 10]
    elif 20 < number < 1000:
        chislo = list(str(number))
        if number<100:
            if chislo[1] == '0':
                return OTHER_TENS[int(chislo[0])-2]
            else:
                return OTHER_TENS[int(chislo[0])-2] + ' ' + FIRST_TEN[int(chislo[1])-1]
        else:
            if chislo[1] == '0':
                if chislo[2] == '0':
                    return FIRST_TEN[int(chislo[0])-1] + ' '+ HUNDRED
                else:
                    return FIRST_TEN[int(chislo[0])-1] + ' '+ HUNDRED + ' ' + FIRST_TEN[int(chislo[2])-1]
            elif chislo[1] == '1':
                return FIRST_TEN[int(chislo[0])-1] + ' ' + HUNDRED + ' ' + SECOND_TEN[int(chislo[2])]
            else:
                if chislo[2] == '0':
                    return FIRST_TEN[int(chislo[0])-1] + ' ' + HUNDRED + ' ' + OTHER_TENS[int(chislo[1])-2]
                else:
                    return FIRST_TEN[int(chislo[0])-1] + ' ' + HUNDRED + ' ' + OTHER_TENS[int(chislo[1])-2] + ' ' + FIRST_TEN[int(chislo[2])-1]
    else:
        return "one thousand"
 
def secret_room(number):
    doors = []
    #replace this for solution
    for i in range(1, (number + 1)):
        doors.append(checkio(i))
    door = doors[-1]
    doors = sorted(doors)
    return doors.index(door) + 1
 
if __name__ == '__main__':
    print("Example:")
    print(secret_room(5))
 
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert secret_room(5) == 1 #five, four, one, three, two
    assert secret_room(3) == 2 #one, three, two
    assert secret_room(1000) == 551
    print("Coding complete? Click 'Check' to earn cool rewards!")
Тут все отрабатывает правильно. Но на скрытой проверке программа с входным параметром 666 возвращает 404, а ресурс утверждает, что должно быть 403. Помогите разобраться, плиз.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2019, 10:00
Ответы с готовыми решениями:

Secret net
Всем здорово. Столкнулся с такой проблемой: после установки secret net 7.6 при подключении флешки в...

Информация по Secret net
Заранее извеняюсь если не там написал тему! Необходимо поставить Secret net для защиты инф! Но я...

Servlet secret internal name
Вопросы: 1. В компаниях за разработку и деплоймент отвечают разные люди? 2. Зачем сервлету secret...

Enable secret 5 cisco
Я немного тупонул, и задал enable secret 5 cisco.Как мне теперь войти на этот роутер, т.к. пароль...

Установка SECRET NET 6
Помогите разобраться с установкой Secret net 6/ какие либо инструкции???

7
Автоматизируй это!
Эксперт Python
7166 / 4656 / 1217
Регистрация: 30.03.2015
Сообщений: 13,320
Записей в блоге: 29
08.08.2019, 10:58 2
Anny27, неслабый метод chekio и по содержанию и по названию (ни о чем не говорит). Я не в плане особой критики, но прочитать и понять все эти вложенные условия, согласись не простое дело, особенно если ты не автор кода. Ошибка где-то есть, но эо надо конкретно вчитаться во все это, я не готов.
Вот мой вариант, код подсократил, указанный тобой тест проходит (по остальным не знаю, может и есть косяки), готов ответить на вопросы
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
FIRST_TEN = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
OTHER_TENS = ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]
DEFAULT = {10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 100: 'one hundred', 1000: 'one thousand'}
 
 
def name_of_number(value: int) -> str:
    if value < 10:
        return FIRST_TEN[value - 1]
    if value in DEFAULT.keys():
        return DEFAULT[value]
    str_val = str(value)
    if value > 100:
        return FIRST_TEN[(value // 100) - 1] + " hundred " + name_of_number(int(str_val[1:]))
    if value < 20:
        return FIRST_TEN[value - 11] + "teen"
    return OTHER_TENS[(value // 10) - 2] + " " + name_of_number(int(str_val[1:]))
 
 
def secret_room(count_of_doors: int) -> int:
    int_doors = [i for i in range(1, count_of_doors + 1)]
    max_number = max(int_doors)
    str_doors = sorted(list(map(name_of_number, int_doors)))
    str_max_number = name_of_number(max_number)
    return str_doors.index(str_max_number) + 1
 
 
assert secret_room(5) == 1  # five, four, one, three, two
assert secret_room(3) == 2  # one, three, two
assert secret_room(1000) == 551
assert secret_room(666) == 403  # как система и говорит
 
assert name_of_number(1) == 'one'
assert name_of_number(3) == 'three'
assert name_of_number(9) == 'nine'
assert name_of_number(1000) == 'one thousand'
assert name_of_number(100) == 'one hundred'
assert name_of_number(10) == 'ten'
assert name_of_number(11) == 'eleven'
assert name_of_number(12) == 'twelve'
assert name_of_number(13) == 'thirteen'
assert name_of_number(101) == 'one hundred one'
assert name_of_number(110) == 'one hundred ten'
assert name_of_number(210) == 'two hundred ten'
assert name_of_number(14) == 'fourteen'
assert name_of_number(216) == 'two hundred sixteen'
assert name_of_number(519) == 'five hundred nineteen'
assert name_of_number(21) == 'twenty one'
assert name_of_number(55) == 'fifty five'
assert name_of_number(99) == 'ninety nine'
1
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 5
08.08.2019, 12:06  [ТС] 3
Спасибо большое за ответ!
Согласен, мой код далек от хорошего, я еще только учусь и во многом полагаюсь на данные и названия, которые предлагает сам ресурс, поэтому зачастую возникает такая неразбериха...

P.s. К сожалению, Ваш код тоже не прошел проверку. Теперь не проходит проверка с входным параметром 999, функция возвращает 382, а система говорит, что должно быть 383.
0
Автоматизируй это!
Эксперт Python
7166 / 4656 / 1217
Регистрация: 30.03.2015
Сообщений: 13,320
Записей в блоге: 29
08.08.2019, 12:27 4
Anny27, да, прошляпил вариант с 20,30 и т.п
вот
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def name_of_number(value: int) -> str:
    if value < 10:
        return FIRST_TEN[value - 1]
    if value in DEFAULT.keys():
        return DEFAULT[value]
    str_val = str(value)
    if value > 100:
        return FIRST_TEN[(value // 100) - 1] + " hundred " + name_of_number(int(str_val[1:]))
    if value < 20:
        return FIRST_TEN[value - 11] + "teen"
    if value % 10 == 0:
        return OTHER_TENS[value // 10 - 2]
    return OTHER_TENS[(value // 10) - 2] + " " + name_of_number(int(str_val[1:]))
 
 
def secret_room(count_of_doors: int) -> int:
    int_doors = [i for i in range(1, count_of_doors + 1)]
    str_doors = sorted(list(map(name_of_number, int_doors)))
    return str_doors.index(name_of_number(count_of_doors)) + 1
 
 
assert secret_room(999) == 383  # как система и говорит
assert secret_room(5) == 1  # five, four, one, three, two
assert secret_room(3) == 2  # one, three, two
assert secret_room(1000) == 551
assert secret_room(666) == 403  # как система и говорит
assert name_of_number(1) == 'one'
assert name_of_number(3) == 'three'
assert name_of_number(9) == 'nine'
assert name_of_number(1000) == 'one thousand'
assert name_of_number(100) == 'one hundred'
assert name_of_number(10) == 'ten'
assert name_of_number(11) == 'eleven'
assert name_of_number(12) == 'twelve'
assert name_of_number(13) == 'thirteen'
assert name_of_number(101) == 'one hundred one'
assert name_of_number(110) == 'one hundred ten'
assert name_of_number(210) == 'two hundred ten'
assert name_of_number(14) == 'fourteen'
assert name_of_number(216) == 'two hundred sixteen'
assert name_of_number(519) == 'five hundred nineteen'
assert name_of_number(21) == 'twenty one'
assert name_of_number(55) == 'fifty five'
assert name_of_number(99) == 'ninety nine'
assert name_of_number(990) == 'nine hundred ninety'
1
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 5
08.08.2019, 12:42  [ТС] 5
Чет я тоже пропустил этот момент, когда код разбирал, отвлекли по работе.

Но, к сожалению, опять не прошел проверку до конца, теперь упал на 753, возвращается 357, правильный результат 359.

P.s. А с виду задание казалось легким...
0
Автоматизируй это!
Эксперт Python
7166 / 4656 / 1217
Регистрация: 30.03.2015
Сообщений: 13,320
Записей в блоге: 29
08.08.2019, 13:07 6
Лучший ответ Сообщение было отмечено Anny27 как решение

Решение

Цитата Сообщение от Anny27 Посмотреть сообщение
теперь упал на 753, возвращается 357, правильный результат 359.
да, пишу в перерывах на работе, потому пропускаю порой важные моменты, я упустил верное обосзначение круглых сотен типа 200, 300 и еще неверное формировал eighteen и fifteen (лишнюю букву добавлял), поэтому неверно сортировалось.
Проверяй
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
FIRST_TEN = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
OTHER_TENS = ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]
DEFAULT = {10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 18: 'eighteen', 15: 'fifteen',
           100: 'one hundred', 1000: 'one thousand'}
 
 
def name_of_number(value: int) -> str:
    if not value:
        return ''
    if value < 10:
        return FIRST_TEN[value - 1]
    if value in DEFAULT.keys():
        return DEFAULT[value]
    str_val = str(value)
    if value > 100:
        if value % 100 == 0:
            return FIRST_TEN[(value // 100) - 1] + " hundred"
        return FIRST_TEN[(value // 100) - 1] + " hundred " + name_of_number(int(str_val[1:]))
    if value < 20:
        return FIRST_TEN[value - 11] + "teen"
    if value % 10 == 0:
        return OTHER_TENS[value // 10 - 2]
    return OTHER_TENS[(value // 10) - 2] + " " + name_of_number(int(str_val[1:]))
 
 
def secret_room(count_of_doors: int) -> int:
    int_doors = [i for i in range(1, count_of_doors + 1)]
    str_doors = sorted(list(map(name_of_number, int_doors)))
    return str_doors.index(name_of_number(count_of_doors)) + 1
 
 
assert secret_room(999) == 383  # как система и говорит
assert secret_room(753) == 359  # как система и говорит
assert secret_room(5) == 1  # five, four, one, three, two
assert secret_room(3) == 2  # one, three, two
assert secret_room(1000) == 551
assert secret_room(666) == 403  # как система и говорит
assert name_of_number(1) == 'one'
assert name_of_number(3) == 'three'
assert name_of_number(9) == 'nine'
assert name_of_number(1000) == 'one thousand'
assert name_of_number(100) == 'one hundred'
assert name_of_number(10) == 'ten'
assert name_of_number(11) == 'eleven'
assert name_of_number(12) == 'twelve'
assert name_of_number(13) == 'thirteen'
assert name_of_number(101) == 'one hundred one'
assert name_of_number(110) == 'one hundred ten'
assert name_of_number(210) == 'two hundred ten'
assert name_of_number(14) == 'fourteen'
assert name_of_number(216) == 'two hundred sixteen'
assert name_of_number(519) == 'five hundred nineteen'
assert name_of_number(21) == 'twenty one'
assert name_of_number(55) == 'fifty five'
assert name_of_number(99) == 'ninety nine'
assert name_of_number(990) == 'nine hundred ninety'
1
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 5
08.08.2019, 13:46  [ТС] 7
Спасибо огромное за помощь. Буду анализировать свои ошибки и в последующем постараюсь писать более понятный код.
0
Автоматизируй это!
Эксперт Python
7166 / 4656 / 1217
Регистрация: 30.03.2015
Сообщений: 13,320
Записей в блоге: 29
08.08.2019, 13:47 8
Anny27, если есть вопросы по коду - не стесняйся
0
08.08.2019, 13:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2019, 13:47
Помогаю со студенческими работами здесь

Secret Net LSP
Доброго времени суток, товарищи. В руки попал экземпляр Secret Net LSP версии 1.9. Вводные: есть...

Secret Net 6 - проблема
Здравствуйте! В нашей организации возникла проблема при использовании системы Secret Net 6 Сетевая...

session store secret
при генерации session store secret выдает ошибку не могу понять в чем дело, помоги разобраться с...

Secret Net - Соболь
Здравствуйте. Secret Net интегрирован с ПАК Соболь (сетевой режим). На каждом компьютере есть...

RxJava и Room
У меня есть программа, в которой данные хранятся в локальной базе данных с помощью Room, и я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru