Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 29.08.2020
Сообщений: 57

Страшный калькулятор

31.05.2021, 23:14. Показов 5280. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Напишите программу, которая принимает на вход список длин в разных единицах измерения (миллиметры, сантиметры, метры, километры) и выводит сумму его элементов, представленную в наиболее подходящих единицах измерения: так, чтобы длина получившейся строки была минимальна.
Помогите пожалуйста решить! Буду очень благодарен!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2021, 23:14
Ответы с готовыми решениями:

Страшный запрос
Здравствуйте. Подскажите или сделайте) Как эти 2 запроса сделать в один $sb = $GLOBALS->GetAll('SELECT...

Страшный экран
Строил сайт и сам не заметил, как получил вот такое, при переходе с второстепенной страницы на главную (был в пункте правого меню и потом...

Страшный и ужасный decimal
Многоуважаемый Ол (All). Подскажите пожалуйста что это за чо? > var d1 = decimal.Parse("1,000"); > var d2 =...

30
1 / 1 / 0
Регистрация: 29.08.2020
Сообщений: 57
01.06.2021, 11:51  [ТС]
написал вот такой код:
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
a = input().split(' ')
b = []
n = ''
m = 0
for e in range(len(a)):
    for i in range(len(a[e])):
        if a[i].isalpha:
            n = n + a[e][i]
            a[e].replace(a[e][i], '')
    b.append(n)
for k in range(len(a)):
    if b[k] == 'мм':
        a.replace(a[k], int(a[k]) / 10)
        m += a[k]
        b.replace(b[k], 'см')
    elif b[k] == 'см':
        a.replace(a[k], int(a[k]) / 100)
        m += a[k]
        b.replace(b[k], 'м')
    elif b[k] == 'м':
        a.replace(a[k], int(a[k]) / 1000)
        m += a[k]
        b.replace(b[k], 'км')
print(m)
вряд ли он учитывает всё
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
01.06.2021, 13:08
Цитата Сообщение от ArtAndreev21 Посмотреть сообщение
написал вот такой код:
...
вряд ли он учитывает всё
Например, на входе:

На выходе у тебя в километрах:
0.001
А короче было бы в метрах:
0
1 / 1 / 0
Регистрация: 29.08.2020
Сообщений: 57
01.06.2021, 20:31  [ТС]
И как исправить?
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
01.06.2021, 20:46
Цитата Сообщение от ArtAndreev21 Посмотреть сообщение
И как исправить?
Не переводить метры в километры без необходимости.
0
1 / 1 / 0
Регистрация: 29.08.2020
Сообщений: 57
01.06.2021, 20:49  [ТС]
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
a = input().split(' ')
b = []
n = ''
m = 0
for e in range(len(a)):
    for i in range(len(a[e])):
        if a[i].isalpha:
            n = n + a[e][i]
            a[e].replace(a[e][i], '')
    b.append(n)
for k in range(len(a)):
    if b[k] == 'мм' and b[k] >= 10:
        a.replace(a[k], int(a[k]) / 10)
        m += a[k]
        b.replace(b[k], 'см')
    elif b[k] == 'см' and b[k] >= 10:
        a.replace(a[k], int(a[k]) / 100)
        m += a[k]
        b.replace(b[k], 'м')
    elif b[k] == 'м' and b[k] >= 100:
        a.replace(a[k], int(a[k]) / 1000)
        m += a[k]
        b.replace(b[k], 'км')
print(m)
вот так?
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
02.06.2021, 10:02
Нет, не так.
Набросал тебе пару тестов, может, поможет разобраться с ошибками.
Python
1
(lambda un, re, di, calc:(lambda mze:(lambda mk:(lambda CalcTests:(lambda suite:(lambda _:(lambda runner:runner.run(suite))(un.TextTestRunner()))([suite.addTest(CalcTests('_{:02}'.format(i))) for i in range(63)]))(un.TestSuite()))(type('CalcTests', (un.TestCase, ), dict(_00 = mk('1мм', '1мм'), _01 = mk('10мм', '1см'), _02 = mk('100мм', '0.1м'), _03 = mk('1000мм', '1м'), _04 = mk('10000мм', '10м'), _05 = mk('100000мм', '100м'), _06 = mk('1000000мм', '1км'), _07 = mk('11мм', '11мм'), _08 = mk('101мм', '101мм'), _09 = mk('110мм', '11см'), _10 = mk('1001мм', '1.001м'), _11 = mk('1010мм', '1.01м'), _12 = mk('1100мм', '1.1м'), _13 = mk('10001мм', '10.001м'), _14 = mk('10010мм', '10.01м'), _15 = mk('10100мм', '10.1м'), _16 = mk('11000мм', '11м'), _17 = mk('100001мм', '100.001м'), _18 = mk('100010мм', '100.01м'), _19 = mk('100100мм', '100.1м'), _20 = mk('101000мм', '101м'), _21 = mk('110000мм', '110м'), _22 = mk('1000001мм', '1км 1мм'), _23 = mk('1000010мм', '1км 1см'), _24 = mk('1000100мм', '1000.1м'), _25 = mk('1001000мм', '1001м'), _26 = mk('1010000мм', '1010м'), _27 = mk('1100000мм', '1.1км'), _28 = mk('111мм', '111мм'), _29 = mk('1011мм', '1.011м'), _30 = mk('1101мм', '1.101м'), _31 = mk('1110мм', '1.11м'), _32 = mk('10011мм', '10.011м'), _33 = mk('10101мм', '10.101м'), _34 = mk('10110мм', '10.11м'), _35 = mk('11001мм', '11.001м'), _36 = mk('11010мм', '11.01м'), _37 = mk('11100мм', '11.1м'), _38 = mk('100011мм', '100.011м'), _39 = mk('100101мм', '100.101м'), _40 = mk('100110мм', '100.11м'), _41 = mk('101001мм', '101.001м'), _42 = mk('101010мм', '101.01м'), _43 = mk('101100мм', '101.1м'), _44 = mk('110001мм', '110.001м'), _45 = mk('110010мм', '110.01м'), _46 = mk('110100мм', '110.1м'), _47 = mk('111000мм', '111м'), _48 = mk('1000011мм', '1км 11мм'), _49 = mk('1000101мм', '1000.101м'), _50 = mk('1000110мм', '1000.11м'), _51 = mk('1001001мм', '1001.001м'), _52 = mk('1001010мм', '1001.01м'), _53 = mk('1001100мм', '1001.1м'), _54 = mk('1010001мм', '1010.001м'), _55 = mk('1010010мм', '1010.01м'), _56 = mk('1010100мм', '1010.1м'), _57 = mk('1011000мм', '1011м'), _58 = mk('1100001мм', '1100.001м'), _59 = mk('1100010мм', '1100.01м'), _60 = mk('1100100мм', '1100.1м'), _61 = mk('1101000мм', '1101м'), _62 = mk('1110000мм', '1110м')))))(lambda data, expected:(lambda result:lambda self:(self.assertRegex(result, r'(?:[1-9]\d*(?:\.\d+)?(?:км|м|мм|см))(?:\s+[1-9]\d*(?:\.\d+)?(?:км|м|мм|см))*'), self.assertEqual(mze(result), data), self.assertLessEqual(len(result), len(expected))))(calc.convert(data))))((lambda v:lambda s:(lambda r:r.rstrip('0').rstrip('.') if '.' in r else r)(str(sum(di.Decimal(x) * v[u] for x, u in (re.match(r'([0-9.]+)(км|мм|см|м)', t).groups() for t in re.findall(r'[0-9.]+(?:км|мм|см|м)', s))))) + 'мм')({'км':di.Decimal(1000000), 'м':di.Decimal(1000), 'мм':di.Decimal(1), 'см':di.Decimal(10)})))(__import__('unittest'), __import__('re'), __import__('decimal'), __import__('calc'))
Добавлено через 7 минут
Чтобы юнит тесты работали, твоя программа должна быть в модуле calc.py рядом с модулем, где находятся тесты. Внутри модуля calc.py пишешь функцию def convert(dimensions: str) -> str и внутри этой функции пишешь свой код.
0
1 / 1 / 0
Регистрация: 29.08.2020
Сообщений: 57
02.06.2021, 18:09  [ТС]
спасибо но я че-то ничего не понял)
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
02.06.2021, 18:52
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
text='5км 1м 4.6см 8мм'
txt_list=text.split()
units=('мм','см', 'км', 'м')
power=(1.0e-3, 1.0e-2, 1.0e3, 1.0)
distance=0
for word in txt_list:
    for idx, unit in enumerate(units):
        if unit==word[-len(unit):]:
            distance+=(power[idx]*float(word[:-len(unit)])) # convert to meters
            break
distance_txt=[]
for i in range(len(units)):
    distance_txt.append(f'{distance*power[i]}{units[i]}')
print(min(distance_txt, key=len))
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
02.06.2021, 19:09
Таблица лидеров по решению данной задачи:
УчастникТестов пройденоТестов проваленоМесто
u2353330Первое
Кто ещё хочет попытаться?
0
02.06.2021, 19:19

Не по теме:

КулХацкеръ, что это за тесты? откуда это?=-O

0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
02.06.2021, 19:23
u235, пролистай тему чуть выше, я давал ТСу тесты, чтобы помочь ему в отладке его программы.

Добавлено через 1 минуту
У тебя хорошая программа, но не на 100%.
1
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
02.06.2021, 19:55
Лучший ответ Сообщение было отмечено ArtAndreev21 как решение

Решение

КулХацкеръ, да, понял.
Вылезают ошибки связаные с работой с float представлением чисел.

Добавлено через 15 минут
Немного поправленный вариант:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from fractions import Fraction
text='110100мм 5м'
txt_list=text.split()
units=('мм','см', 'км', 'м')
power=list(map(Fraction, ['1/1000', '1/100', '1000', '1']))
distance=Fraction(0)
for word in txt_list:
    for idx, unit in enumerate(units):
        if unit==word[-len(unit):]:
            distance+=(power[idx]*Fraction(word[:-len(unit)])) # convert to meters
            break
distance_txt=[]
for i in range(len(units)):
    distance_txt.append(f'{float(distance*power[i])}{units[i]}')
print(min(distance_txt, key=len))
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
02.06.2021, 20:53
Цитата Сообщение от u235 Посмотреть сообщение
Немного поправленный вариант:
Все ещё конвертирует "1мм" в "1.0км", как и предыдущий вариант .

А так да, проходит уже 40 тестов.
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
02.06.2021, 21:59
Мне кажется, что питон целочисленную-то арифметику считает с любой точностью:
Code
1
2
3
4
5
6
>>> a=1234567890000000000000000000000000000000000000000000000000000000000000
>>> a
1234567890000000000000000000000000000000000000000000000000000000000000
>>> a+1
1234567890000000000000000000000000000000000000000000000000000000000001
>>>
Поэтому можно смело переводить всё в милиметры и считать в них, а потом определяться
по количеству нулей в хвосте .
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
02.06.2021, 22:17

Не по теме:

Цитата Сообщение от КулХацкеръ Посмотреть сообщение
__import__('unittest'), __import__('re'), __import__('decimal'), __import__('calc')
*map(__import__, ("unittest", "re", "decimal", "calc"))


1
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
02.06.2021, 23:18
КулХацкеръ, странно, что столько тестов проходило..
В предпоследней строке делить надо, а не умножать.
Python
1
    distance_txt.append(f'{float(distance/power[i])}{units[i]}')
3
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
02.06.2021, 23:37
u235, теперь с корректностью перевода все хорошо, спасибо .

Не проходит только 22 теста, все - из-за того, что ответы не минимальные по длине.

Думаю, ТС должен сказать тебе большое спасибо (если появится, конечно).
0
Эксперт Python
8850 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
02.06.2021, 23:54
КулХацкеръ, "убрать лишнее" по условию float(5.0) == int(5.0)
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
03.06.2021, 00:05
Gdez, можно, пожалуйста, подробнее? Не очень понял мысль.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2021, 00:05
Помогаю со студенческими работами здесь

Страшный размер DB.mdb
Всем привет, проблема в следующем, некоторое время работал с базой через приложение (C++ Builder 6) . Как вскоре появилась ошибка...

Самый страшный вирь
Здравствуйте. Подхватил вирь под названием Trojan.Win32.Agent.aec. Перестали запускаться .ехе файлы. При попытке запуска выскакивает...

Страшный звук при включении.
вчера поставил новый проц(e8400 был e7200) разогнал до 415х9 на 1.4в(e7200 работал так-же, но на 1.45в) переставил комп в корпус(до этого...

Самый страшный фильм ужасов!
Может кто-то знает нормальный фильм ужасов?

Импликация - страшный суд, ад и погибель
Читаю Шилтда. Глава Операторы. Помогите разобрать как и в какой последовательности работает следующий код : using System; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru