Практика 3
Задания в классе
Тест по структурам данных
Материалы для подготовки: Глава 12 “Структура данных” (стр. 79 по 90) из книги A Byte of Python.
Compressed Sequence
Написать программу которая сжимает массив чисел.
Например, "1 1 3 3 3 2 2 2 2 14 14 14 11 11 11 20"
сжимается в "2 1 3 3 4 2 3 14 3 11 1 20"
.
То есть это читается так - среди чисел две единицы, три тройки, четыре двойки.
Сохраняйте порядок в котором встречаются числа во входном наборе.
# encoding: utf-8
import unittest
def compressed_sequence(sentence):
return ""
class TestCompressedSequence(unittest.TestCase):
def test_empty(self):
self.assertEqual(compressed_sequence(""), "")
def test_small(self):
self.assertEqual(compressed_sequence("7"), "1 7")
def test_small2(self):
self.assertEqual(compressed_sequence("10 10 20"), "2 10 1 20")
def test1(self):
self.assertEqual(compressed_sequence(
"40 40 40 40 29 29 29 29 29 29 29 29 57 57 92 92 92 92 92 86 86 86 86 86 86 86 86 86 86"
), "4 40 8 29 2 57 5 92 10 86")
def test2(self):
self.assertEqual(compressed_sequence(
"1 1 3 3 3 2 2 2 2 14 14 14 11 11 11 20"
), "2 1 3 3 4 2 3 14 3 11 1 20")
def test3(self):
self.assertEqual(compressed_sequence(
"1 1 3 3 3 2 2 2 2 14 14 14 11 11 11 20"
), "2 1 3 3 4 2 3 14 3 11 1 20")
if __name__ == '__main__':
unittest.main()
Отделить строки от чисел
Дана строка с числами и словами, разделенными запятой.
Нужно отделить строки от чисел, но так чтобы остался порядок элементов такой, какой и был раньше.
Например 8,33,21,0,16,50,37,0,melon,7,apricot,peach,pineapple,17,21
=> melon,apricot,peach,pineapple|8,33,21,0,16,50,37,0,7,17,21
.
Если в наборе только числа или только слова, то разделитель |
не ставится.
# encoding: utf-8
import unittest
def mixed_content(sentence):
return ""
class TestMixedContent(unittest.TestCase):
def test_empty(self):
self.assertEqual(mixed_content(""), "")
def test_small(self):
self.assertEqual(mixed_content("1,apple,2"), "apple|1,2")
def test_only_numbers(self):
self.assertEqual(mixed_content("1,2"), "1,2")
def test_only_words(self):
self.assertEqual(mixed_content("bb,aa"), "bb,aa")
def test(self):
self.assertEqual(
mixed_content("8,33,21,0,16,50,37,0,melon,7,apricot,peach,pineapple,17,21"),
"melon,apricot,peach,pineapple|8,33,21,0,16,50,37,0,7,17,21"
)
if __name__ == '__main__':
unittest.main()
Домашнее задание
Программирование
Написать калькулятор для обратной польской нотации.
Например, это выражение 5 1 2 + 4 * + 3 -
означает 5 + ((1 + 2) * 4) - 3
, что равно 14
.
Hints
- На вход подается строка
- В качестве разделителя элементов выражения используется пробел
- Операции для реализации:
* - + /
# encoding: utf-8
import unittest
def calc(expr):
return 0
class TestCalc(unittest.TestCase):
def test_empty(self):
self.assertEqual(calc(""), 0.0)
def test_number(self):
self.assertEqual(calc("1 2 3"), 3.0)
self.assertEqual(calc("0 1 1 1 1 3.5"), 3.5)
def test_plus(self):
self.assertEqual(calc("1 3 +"), 4.0)
def test_mul(self):
self.assertEqual(calc("2 5 *"), 10.0)
def test_sub(self):
self.assertEqual(calc("3 13 -"), -10.0)
def test_div(self):
self.assertEqual(calc("3 2 /"), 1.5)
def test_hard(self):
self.assertEqual(calc("5 1 2 + 4 * + 3 -"), 14)
if __name__ == '__main__':
unittest.main()