2019年7月2日火曜日

開発環境

Python計算機科学新教本 ―新定番問題を解決する探索アルゴリズム、k平均法、ニューラルネットワーク (David Kopec(著)、黒川 利明(翻訳)、オライリージャパン)の1章(簡単な問題)、1.7(練習問題)2の解答を求めてみる。

コード

Python 3

#!/usr/bin/env python3
from unittest import TestCase, main


class CompressedGeneTest(TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_comparess_and_decompress(self):
        gene = 'ACGT'
        gene_compressed = CompressedGene(gene)
        self.assertEqual(gene_compressed.decompress(), gene)


class BitSequence:
    def __init__(self) -> None:
        self.seq = []

    def __getitem__(self, i: int):
        return self.seq[i]


class CompressedGene:
    def __init__(self, gene: str) -> None:
        self.bits = BitSequence()
        for nucleotide in gene.upper():
            if nucleotide == 'A':
                self.bits.seq += [0b0, 0b0]
            elif nucleotide == 'C':
                self.bits.seq += [0b0, 0b1]
            elif nucleotide == 'G':
                self.bits.seq += [0b1, 0b0]
            elif nucleotide == 'T':
                self.bits.seq += [0b1, 0b1]
            else:
                raise ValueError(f'Invalid Nucleotide: {nucleotide}')

    def decompress(self) -> str:
        gene: str = ''
        for i, b in enumerate(self.bits):
            if i % 2 == 0:
                if b == 0b0 and self.bits[i + 1] == 0b0:
                    gene += 'A'
                elif b == 0b0 and self.bits[i + 1] == 0b1:
                    gene += 'C'
                elif b == 0b1 and self.bits[i + 1] == 0b0:
                    gene += 'G'
                elif b == 0b1 and self.bits[i + 1] == 0b1:
                    gene += 'T'
                else:
                    raise ValueError('Invalid bits: {bits}')
        return gene


if __name__ == '__main__':
    main()

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))

C:\Users\...>py sample2.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

C:\Users\...>

イテレーション可能なビットのシーケンスには出来たものの、int型の使いやすいラッパーにはなってないような。問題の意図を理解できてないかも。

0 コメント:

コメントを投稿