開発環境
- macOS Mojave - Apple
- Emacs (Text Editor)
- Python 3.7 (プログラミング言語)
問題解決のPythonプログラミング ―数学パズルで鍛えるアルゴリズム的思考 (Srini Devadas (著)、黒川 利明 (翻訳)、オライリージャパン)の1章(帽子を全員で揃える)、練習問題、パズル問題4.を取り組んでみる。
コード(Emacs)
#!/usr/bin/env python3
import unittest
from run_length_encoding import encode, decode
class Test(unittest.TestCase):
s1 = ''
s2 = 'B'
s3 = 'BWWWWBWWWW'
s4 = 'WWWWBWWWWB'
s5 = 'WWWWWWWWWWWWWBBWWWWWWWWWWWWBBBBB'
def sefUp(self):
pass
def tearDown(self):
pass
def test_empty(self):
encoded = encode(Test.s1)
self.assertEqual(encoded, '')
def test_one(self):
encoded = encode(Test.s2)
self.assertEqual(encoded, '1B')
def test_s3(self):
encoded = encode(Test.s3)
self.assertEqual(encoded, '1B4W1B4W')
def test_s4(self):
encoded = encode(Test.s4)
self.assertEqual(encoded, '4W1B4W1B')
def test_s5(self):
encoded = encode(Test.s5)
self.assertEqual(encoded, '13W2B12W5B')
def test_decode_empty(self):
decoded = decode(encode(Test.s1))
self.assertEqual(decoded, Test.s1)
def test_decode_one(self):
decoded = decode(encode(Test.s2))
self.assertEqual(decoded, Test.s2)
def test_decode_s3(self):
decoded = decode(encode(Test.s3))
self.assertEqual(decoded, Test.s3)
def test_decode_s4(self):
decoded = decode(encode(Test.s4))
self.assertEqual(decoded, Test.s4)
def test_decode_s5(self):
decoded = decode(encode(Test.s5))
self.assertEqual(decoded, Test.s5)
if __name__ == '__main__':
unittest.main()
#!/usr/bin/env python3
s1 = ''
s2 = 'B'
s3 = 'BWWWWBWWWW'
s4 = 'WWWWBWWWWB'
s5 = 'WWWWWWWWWWWWWBBWWWWWWWWWWWWBBBBB'
str_list = [s1, s2, s3, s4, s5]
def encode(s: str) -> str:
encoded = ''
str_len = len(s)
if str_len == 0:
return encoded
start = 0
character = s[0]
for i in range(1, str_len):
if character != s[i]:
encoded += f'{i - start}{character}'
character = s[i]
start = i
encoded += f'{str_len - start}{character}'
return encoded
def decode(s: str) -> str:
decoded = ''
str_len = len(s)
if str_len == 0:
return decoded
start = 0
num_str = s[0]
for i in range(1, len(s)):
if s[i].isdigit():
num_str += s[i]
else:
decoded += s[i] * int(num_str)
num_str = '0'
return decoded
if __name__ == '__main__':
for s in str_list:
encoded = encode(s)
decoded = decode(encoded)
for a, b in zip(['文字列', '符号化', '復号化', '比較'],
[s, encoded, decoded, s == decoded]):
print(f'{a}: {b}')
print()
入出力結果(Terminal, Jupyter(IPython))
$ ./run_length_encoding_test.py .......... ---------------------------------------------------------------------- Ran 10 tests in 0.000s OK $ ./run_length_encoding.py 文字列: 符号化: 復号化: 比較: True 文字列: B 符号化: 1B 復号化: B 比較: True 文字列: BWWWWBWWWW 符号化: 1B4W1B4W 復号化: BWWWWBWWWW 比較: True 文字列: WWWWBWWWWB 符号化: 4W1B4W1B 復号化: WWWWBWWWWB 比較: True 文字列: WWWWWWWWWWWWWBBWWWWWWWWWWWWBBBBB 符号化: 13W2B12W5B 復号化: WWWWWWWWWWWWWBBWWWWWWWWWWWWBBBBB 比較: True $
0 コメント:
コメントを投稿