## 2020年4月6日月曜日

### Python - Designing Algorithms - 小さい二つの数、リスト、タプル、インデックス、テスト

Practical Programming: An Introduction to Computer Science Using Python 3.6 (Paul Gries(著)、Jennifer Campbell(著)、Jason Montojo(著)、Pragmatic Bookshelf)のChapter 12(Designing Algorithms)、Exercise 4、5の解答を求めてみる。

コード

```#!/usr/bin/env python3
from unittest import TestCase, main
from typing import List, Tuple, Union

print('4, 5.')

class TestFindTwoSmallest(TestCase):
def test_empty(self):
self.assertEqual(find_two_smallest([]), ())

def test_one(self):
self.assertEqual(find_two_smallest([10]), (0,))

def test_two(self):
self.assertEqual(find_two_smallest([1, 1]), (0, 1))

def test_two1(self):
self.assertEqual(find_two_smallest([1, 2]), (0, 1))

def test_five(self):
self.assertEqual(find_two_smallest([5, 1, 4, 2, 3]), (1, 3))

def test_five1(self):
self.assertEqual(find_two_smallest([3, 2, 4, 1, 5]), (3, 1))

def test_other(self):
self.assertEqual(find_two_smallest([5, 1, 4, 1, 2, 3, 1]), (1, 3))

def find_two_smallest(nums: List[float]) -> Union[Tuple[int, int],
Tuple[int],
Tuple[()]]:
if not nums:
return ()
if len(nums) == 1:
return (0,)
min1, min2 = nums[:2]
min1_index = 0
min2_index = 1
if min1 > min2:
min1, min2 = min2, min1
min1_index, min2_index = min2_index, min1_index
for i, num in enumerate(nums[2:], 2):
if num < min1:
min1, min2 = num, min1
min1_index, min2_index = i, min1_index
elif num < min2:
min2 = num
min2_index = i
return min1_index, min2_index

if __name__ == "__main__":
main()
```

```% ./sample4.py -v
4, 5.
test_empty (__main__.TestFindTwoSmallest) ... ok
test_five (__main__.TestFindTwoSmallest) ... ok
test_five1 (__main__.TestFindTwoSmallest) ... ok
test_one (__main__.TestFindTwoSmallest) ... ok
test_other (__main__.TestFindTwoSmallest) ... ok
test_two (__main__.TestFindTwoSmallest) ... ok
test_two1 (__main__.TestFindTwoSmallest) ... ok

----------------------------------------------------------------------
Ran 7 tests in 0.000s

OK
%
```