点突变(point mutation)是突变的一种类型,在遗传材料DNA或RNA中,会使单一个碱基核苷酸替换成另一种核苷酸。
在信息论中,两个等长字符串之间的汉明距离(Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。
给定两个等长的字符串 s 和 t,s 和 t 之间的汉明距离记为dH(s,t),表示 s 和 t 不同的对应符号数。
Given: 两个长度相等的DNA链 s 和 t (不超过1kbp)
Return: The Hamming distance dH(s,t)
GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
7
# Counting Point Mutations
def hamming_distance(s, t):
return sum(ch1 != ch2 for ch1, ch2 in zip(s, t))
string1 = "GAGCCTACTAACGGGAT"
string2 = "CATCGTAATGACGGCCT"
print(hamming_distance(string1, string2))
with open("rosalind_hamm.txt", "r") as f:
lines = f.readlines()
string1 = lines[0]
string2 = lines[1]
print(hamming_distance(string1, string2))
7
470
孟德尔定律是一系列描述了生物特性的遗传规律并催生了遗传学诞生的定律,包括两项基本定律和一项原则即:显性原则、分离定律(孟德尔第一定律),以及自由组合定律和独立分配律(孟德尔第二定律)。
Given: k,m,n为正整数,k+m+n代表一个有机体的种群,其中有k个纯和显性个体,m个杂合显性个体,n个纯和隐形个体。
Return: 随机的两个个体产生一个具有显性等位基因个体的概率。假设任何两个个体都可以交配。
2 2 2
0.78333
假设基因型为AA,Aa,aa的个体各有2个,其中A为显性基因,求子代中具有显性等位基因的概率。
子代中含有显性基因的亲代组合有{AA×AA,AA×Aa,AA×aa,Aa×AA,Aa×Aa,Aa×aa,aa×AA,aa×Aa},子代中不包含显性基因的亲代组合有{Aa×Aa,Aa×aa,aa×aa,aa×Aa}。
因此用总概率减去不包含A的概率更加方便,即1-P(Aa×Aa)-P(Aa×aa)-P(aa×aa)-P(aa×Aa)
# Mendel's First Law
def probability(k, m, n):
s = k + m + n
prob_Aa_Aa = m / s * (m - 1) / (s - 1) * 0.25
prob_Aa_aa = m / s * n / (s - 1) * 0.5
prob_aa_Aa = n / s * m / (s - 1) * 0.5
prob_aa_aa = n / s * (n - 1) / (s - 1)
return round(1 - prob_Aa_Aa - prob_Aa_aa - prob_aa_Aa - prob_aa_aa, 5)
print(probability(2, 2, 2))
with open("rosalind_iprb.txt", "r") as f:
text = f.read().split()
k = int(text[0])
m = int(text[1])
n = int(text[2])
print(probability(k, m, n))
0.78333
0.67995
翻译(Translation),是蛋白质生物合成(基因表达中的一部分,基因表达还包括转录)过程中的第一步。翻译是根据遗传密码的中心法则,将成熟的mRNA分子(由DNA通过转录而生成)中“碱基的排列顺序”(核苷酸序列)解码,并生成对应的特定氨基酸序列的过程。
遗传密码(Genetic code)又称遗传编码,是遗传信息的传递规则,将DNA或mRNA序列以三个核苷酸为一组的“密码子(codon)”翻译为蛋白质的氨基酸序列,以用于蛋白质合成。几乎所有的生物都使用同样的遗传密码,称为“标准遗传密码”;即使是非细胞结构的病毒,它们也是使用标准遗传密码。
20种常见的氨基酸由20个英文字母缩写而成(除了B、J、O、U、X和Z以外的所有字母)。
DNA密码子表与RNA密码子表基本相同,除了使用T来替代U。
Given: 一个RNA链 s 对应的mRNA(长度最多为10 kbp)。
Return: s编码的蛋白质。
AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA
MAMAPRTEINSTRING
# Translating RNA into Protein
def translate(sequence):
rna_codon_table = {
'UUU': 'F', 'CUU': 'L', 'AUU': 'I', 'GUU': 'V',
'UUC': 'F', 'CUC': 'L', 'AUC': 'I', 'GUC': 'V',
'UUA': 'L', 'CUA': 'L', 'AUA': 'I', 'GUA': 'V',
'UUG': 'L', 'CUG': 'L', 'AUG': 'M', 'GUG': 'V',
'UCU': 'S', 'CCU': 'P', 'ACU': 'T', 'GCU': 'A',
'UCC': 'S', 'CCC': 'P', 'ACC': 'T', 'GCC': 'A',
'UCA': 'S', 'CCA': 'P', 'ACA': 'T', 'GCA': 'A',
'UCG': 'S', 'CCG': 'P', 'ACG': 'T', 'GCG': 'A',
'UAU': 'Y', 'CAU': 'H', 'AAU': 'N', 'GAU': 'D',
'UAC': 'Y', 'CAC': 'H', 'AAC': 'N', 'GAC': 'D',
'UAA': 'Stop', 'CAA': 'Q', 'AAA': 'K', 'GAA': 'E',
'UAG': 'Stop', 'CAG': 'Q', 'AAG': 'K', 'GAG': 'E',
'UGU': 'C', 'CGU': 'R', 'AGU': 'S', 'GGU': 'G',
'UGC': 'C', 'CGC': 'R', 'AGC': 'S', 'GGC': 'G',
'UGA': 'Stop', 'CGA': 'R', 'AGA': 'R', 'GGA': 'G',
'UGG': 'W', 'CGG': 'R', 'AGG': 'R', 'GGG': 'G'
}
protein = ""
for i in range(0, len(sequence), 3):
conda = sequence[i:i + 3]
if conda == "UAA" or conda == "UAG" or conda == "UGA":
break
else:
protein += rna_codon_table[conda]
return protein
s = "AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA"
print(translate(s))
with open("rosalind_prot.txt", "r") as f:
string = f.read()
# print(len(string))
print(translate(string))
MAMAPRTEINSTRING
MQFRAVSIRSRGTPRGGKFLGFKGLKGICQYWLNNSFNGVWVGSIAEKFSSHITSAKRASILEAPNFRLIRNDRPLPDKPATVDVKRALRSGTRTGPTPMFLVTEASKHVLHNILETPFDELSFRIALSRCVSLINYVNHLAGYHKHHTNPWRFQHALSSIILMKCPFIHSISGWTQRHNTHELSEKSAVSAAVGQIPARCSPPKLRSERLPALAHVSKYRRLGLLADRISLSMEQLIINLRCSLRKESHAKVSFAVCLGTSKVRTDVGSAICILGSVEAYVDCKSVSIVNGLSILLIIPPLFKWARSSRMCKQRRASTAALKLSGTKGRIPRPTTRVPLCCRCRALSDGSNCQWLAPRGLRAIYDASRFANCGSRLLAADVPYHPAALRISSSRGFQVATDLPMYITGISLHDSISGCHWPPGRRLDCTPSGSREQCTLQLKRSLLYALTAAIDTLGIPMGGTCSAGYRDSIRVCNLEGFHWKGVCVRPVSFNEVGRLRIWGDCRASLLSVNALYAHFPFLLKTISLDIDERQTAHRSLCFYFGSSCSESTVYNIKQGRFRAQNFDFSGFCRESRRGRVGSERLRVGNQLSTGKNRYRRKRRTLVQLTMNQPPQLKFYLLKRAAFFNPEQQCIVPPIAERIEMVVLARDQIIMQLPVEQRTHRSVRCPSVKRATNYETHYLMHTLRPCYISEVHFQIARRLRGPSHQEIRSIPDNCPAICPALVRIRDVRRNRRLLTLRTVQRRDYPIKCPLPFSASALTIHPHPGQKRKCTLTHKNCALCMSLLDRVDARELPHKSATLLRSSQKSRPRDTGNVIKWCEPAQPQDSFAALAATRSPNIYVDSAATSSPSTGDGVPDPEWPSHTTYRYRRTYMPTVDNSPVERNSRAGLLGVSTPTPKEIRRGELAQLAARTLKRTKFTKPDTCLRGFLNVPRPFAPAGLSLTIHNKVCISALTHLSRHIEQYISTVPTRVVTPTRVNISAMPRIALVIHPSHVNVCSVGLDPTHRPKLYSALGGRLFMRFVVNLEVSIRPLLTTPMTAQQMRSRVVYSCLHLSTLRPRTVSNPFSLSTPAATHCDTPPVVVRGFGSVYYTSLKILLALIALPCISTGSMSVREGRTKTAGAPSRQKLATKQVTLNDLVPIMLHLRSPLLLSPVCHIDSATRLWDFHLSSVRILKLVSTCFCPHLLRFNSGSIPTAAWLPAPVRCLRSAALRYVSKLPRRHSVHINRMVLWPFSLGNCIDPSVSRVLTIHRRLRGLMCGMLKPTGLRSNGFILIGALLEVLGALNNSELKDTSPTTARVLLVVRHRFGQPSLTEGGVRAASRETVVSSLVHVREIIGLTVQLKPILWSSAMRLILGKQRRFELPRGVDLVAELPISSRETGSFSRPIDRLHPCNLIVLRAYRLGHGLITIYANQSIHCHISPDRIFVFSGPYEVSMNAQTQRGGFPASFQRDSKTLDCQRLWRHDLFSIFCVQASTPLYIEVELTWGSILLQGNPLSMRCGCSCTVDGPNTEIWSYITSVGYTPSANVDRLVGSVAIHVIQFSRGTFVVTRSVLPDCHSETMRDETTRGLLIVSLMTAALMCRVRGMVPYRPTTYAGASWSHPTHMQFEHTVQLLGLCLINCSMPAWVQLTGIHLVMSSGPHGARTRSAFAGRGVVCCLHTGTKSQFPGLAECFNDNPSVYYNMVILFYPVQTETSMRQKPVDGGPSSLNDSMVLLDQWQPIHLRCDEWLGCLGTDGLKLRSAAKKPVNATNDTFGAWTKNAIPCFWVFSDLRRNLIASSDFLGSVTTTCCEEGIIYYAPVLVRAPTQIIYVYRVFSPPAKERAHLGPKFQWNVALHCPTLVRGKRKSPMKRSMSRSAPGGVPLVLIRSSWSWLLECPGEAIEPVECLMLHFPSDRARDRGSSQCDSVLASLGIRGRFSDEALPEQSSYTVLVRALIKYRQAAALGAAANKVGPRTGPHPLDVYEPQAPETLFGFRIGILINIGRVKHVLVTTRGEALGLRLPRYKNQIHMTVIVTSRLTRRLSGAGAVFVLRAHAPASRTAQIPIALQLYDKELPPCAVKSCYNVVVVITDTSYRRSFSRSGLVVQGVQLSIILIRGGFATPLFRSPRGLIAEVAKGGFTCFRASIHSVSEKSTSWSRIVLRYMQYGILSICHDTLRLIFLHVLLTIFNCVEHGVYLSKRTGRSSLLVSGKVDALETRRMHPTCHHLTSVFAVWGVLLLTTTLILYLWARPLLAPIAIMPVRTVRVQAIVQLSRGVSLRHKSNVIVGPPSVIGELKVPSPPKVRVYHDVSGCGAVKTLTHLVRTESQQNRFPSISQLVDFPGILSKPKSACVESSVEILRHLYLTVQTSSYYPLVYINGLINSLYATSYNLRRSGLFGWDPDLKRGCSGSIPLSLPNYIGCTGWQKRRIASSPTARVNTFSRALVHMARDMTWTQRTREEYRARLEGLRREIHQTLGEITVKVSYRRRRATSFQHTDNRSRITLEVSRSCGLQDMDTDAVHGFSATYGRAGHQHKWQRKELELQRGVRKKVIYEHIPYRQLAWASLQKLHRRPRTGVTPPLPGELLLRVSRLSGSAHRSVQKFSSETPYTSASVGLQGFDSGGVSNISQENLLPMVYNIKTWCNTVRVPCMAKCVRKRNAKVVNRKEKSILTETRPSVKLRIDLQGPRRLALPTFQFYTGNDACPPLLALWKDSLRAGARMSSNRYITVGPTRAQPRINSVRGCFPPCRSHSELPSGNKCHNGTFSWRTSRGKAFVQPLHSSSTWPQKQRQANSYLVEDAPRVQHRRSHQVCKTDYEAGLIIRLTMRSSFLQQRAPMSPCTNPWDPDLANISNCSLCILIRDLLDSSPHGTRATSSDMHNGGLQKLATDIRTTPDVLKQELSCCMFGGSPEGTLISGSSEYGSLASTSLDARVRVCAVGRISSVPRNVIAALVERFVTQFDTYLQSLT
Motif往往是DNA上的反复出现的序列片段,经常是一些具有序列特异性的蛋白的结合位点(如,转录因子)或者是涉及到重要生物过程的(如,RNA 起始,RNA 终止, RNA 剪切等等)。
给定两个字符串 s 和 t,t 是 s 的子字符串(t的长度小于 s)。
在“AUGCUUCAGAAAGGUCUUACG”中所有出现的“U”的位置为2、5、6、15、17和18。
在“AUGCUUCAGAAAGGUCUUACG”中所有出现的“UGCU”的位置为2。
注意,如果 t 作为 s 的子字符串出现不止一次,那么它在 s 中会有多个位置(参见下面的示例)。
再注意,python的索引是从0开始的!
Given: 两个DNA链 s 和 t (每个长度不超过1 kbp)。
Return: t 出现在 s 中的所有位置。
GATATATGCATATACTT
ATAT
2 4 10
# Finding a Motif in DNA
def find_motif(s, t):
location = ""
for i in range(len(s) - len(t) + 1):
if s[i:i + len(t)] == t:
location += str(i + 1) + " "
return location
s = "GATATATGCATATACTT"
t = "ATAT"
print(find_motif(s, t))
with open("rosalind_subs.txt", "r") as f:
lines = f.readlines()
s = lines[0].strip()
t = lines[1].strip()
print(find_motif(s, t))
2 4 10
14 29 156 178 194 201 225 332 339 429 436 443 450 591 696 713 720 780 854 902 937
在1、Counting Point Mutations中,我们计算了两个长度相同的字符串之间的最小符号不匹配数,以模拟寻找两个同源DNA链之间的进化路径上发生的最小点突变数的问题。如果我们有几条我们希望同时分析的同源链,那么自然的问题是找到一个平均情况下的链来代表给定链的最可能的共同祖先。
Example
DNA Strings
A T C C A G C T
G G G C A A C T
A T G G A T C T
A A G C A A C C
T T G G A A C T
A T G C C A T T
A T G G C A C T
Profile
A 5 1 0 0 5 5 0 0
C 0 0 1 4 2 0 6 1
G 1 1 6 3 0 1 0 0
T 1 5 0 0 0 1 1 6
Consensus
A T G C A A C T
Given: 一个FASTA格式的文件。最多包含10个等长(最多1 kbp)DNA字符串。
Return: A consensus string and profile matrix for the collection(如果存在多个可能的Consensus,则可以返回其中任何一个。)
>Rosalind_1
ATCCAGCT
>Rosalind_2
GGGCAACT
>Rosalind_3
ATGGATCT
>Rosalind_4
AAGCAACC
>Rosalind_5
TTGGAACT
>Rosalind_6
ATGCCATT
>Rosalind_7
ATGGCACT
ATGCAACT
A: 5 1 0 0 5 5 0 0
C: 0 0 1 4 2 0 6 1
G: 1 1 6 3 0 1 0 0
T: 1 5 0 0 0 1 1 6
# Consensus and Profile
def read_fasta(file):
sequences = {}
with open(file, "r") as f:
for line in f:
line = line.strip()
if line[0] == ">":
name = line[1:]
sequences[name] = ""
else:
sequences[name] += line
return sequences
def get_consensus_and_profile(sequences):
n = len(sequences[0])
profile = {"A": [0] * n, "C": [0] * n, "G": [0] * n, "T": [0] * n}
for seq in sequences:
for i, base in enumerate(seq):
profile[base][i] += 1
consensus = ""
for i in range(n):
max_count = 0
max_base = ""
for base, counts in profile.items():
if counts[i] > max_count:
max_count = counts[i]
max_base = base
consensus += max_base
result = [consensus]
for base in ['A', 'C', 'G', 'T']:
counts = " ".join(str(x) for x in profile[base])
result.append(f"{base}: {counts}")
return '\n'.join(result)
sequences = read_fasta("code5_example.txt").values()
sequences = list(sequences)
print(get_consensus_and_profile(sequences))
sequences = read_fasta("rosalind_cons.txt").values()
sequences = list(sequences)
print(get_consensus_and_profile(sequences))
ATGCAACT
A: 5 1 0 0 5 5 0 0
C: 0 0 1 4 2 0 6 1
G: 1 1 6 3 0 1 0 0
T: 1 5 0 0 0 1 1 6
GGTAACCGACCAAACAAATCCACAACCCCAGCCGATAATCCAGTAACAACTATCGCGGAGGCGATAAACAGCAAACGAAACCTAAGCGGACAGCTACAATATCAAGAAACAATAGGTTTTGAATCAGCGGACTTCCAAAAGACCTGTGCTACAAACAGTACCCAACAAAAATAGTCTATCCCGAACCACATCAGACTGATGTGGCATTAACATAACATGAACCAACGCTGGGAGAACGGTTAGAACAGTAACGCTGCCTCGCTCAGGTAGCGAACAGATTACACCAGACGCACTAAACACACACGGGACCGCTATCCACAACTTAGGGCTCCGTGCTAATCACTTCCATACCGGGAAAAATGGCAATCTAAGTTGAGCCCAACACCGAAATCCCTCGGAGCCCCACAGCGGAGGTGATTGAGGACAGGGGAAATTTGCGAAGGCGGCTCGGTACCGACAGGTAGGAAAAACGAGAAGCATATCAAACGCAAATAAGGTAATACCACAGACGCACATACAACCAAGAAGCTAACCATCACAGCCTTCAACGAGAAACCAAAAAGGACACAAATATTGCAAAGGCTATCGTAAACGATACAAATTACCATCCGAGCGCAATCGAACACTGGAGACCCACAAACTAACACTCAATAATACCTGTATATCAAATCATCAGTCGACCCCGCATAAGAGTCCAGGGGCCAAGCAGCTAGCGCACACATCGAGATTTCCAGAAAACCACGCCATTAACTGGTACTCTCTGAGGCTCCCCCGTTCTACCATACCCATCACACGCCGATAAACCTTGGTCGAGGGTAATGATTTTCGAACACCCCAATGCATTAGACTCAATAAGTGAAACCAGCGGTGGGTTTAACATAGAACTCCACCGGCCACCTGCGCAGCCCACACAAATCATGACAGTAAATACACCAAATCATAGCCCTGAGAGTGCTCCGACTCCTATCCACCAAAGAAGCCAATCATCGTGCAA
A: 2 1 3 3 5 1 2 3 4 1 1 6 3 3 2 5 3 3 3 0 1 5 1 4 3 2 2 4 1 5 1 1 3 1 4 1 3 3 2 3 1 3 2 3 4 4 2 3 5 1 2 5 1 2 0 2 1 2 3 2 2 1 2 3 1 3 4 3 1 4 2 1 4 3 4 3 2 5 3 5 2 2 2 4 3 3 1 3 2 3 3 4 2 2 3 4 3 4 5 3 6 2 1 5 4 1 6 5 4 3 4 3 2 5 1 0 3 1 3 0 0 6 4 2 2 4 2 2 2 2 4 1 3 2 1 0 4 4 5 4 3 3 0 0 2 2 0 2 1 2 4 0 3 4 3 0 3 2 2 5 0 2 1 3 3 2 4 3 5 3 4 1 3 1 1 2 2 4 1 2 3 2 0 6 4 2 1 4 2 4 1 2 3 3 4 2 2 2 5 2 1 2 2 2 2 5 2 3 4 4 1 3 2 4 3 1 3 2 2 4 5 2 3 6 3 1 1 2 1 4 3 1 3 2 5 3 2 3 1 0 2 3 1 7 4 2 4 1 2 3 5 1 2 1 3 2 0 0 3 0 3 2 2 2 4 2 3 2 3 1 1 2 4 4 2 5 3 3 1 1 3 3 5 1 1 5 1 4 1 3 2 3 2 2 3 4 3 3 3 1 3 1 3 2 2 3 2 3 1 0 1 1 0 4 2 0 1 6 1 3 3 2 2 1 5 1 2 2 3 3 3 3 2 3 0 3 3 5 4 2 2 4 2 3 3 2 2 6 3 5 3 1 2 1 2 4 4 5 3 4 1 2 2 4 3 4 3 2 3 3 4 3 1 2 1 3 3 2 2 2 3 4 2 5 2 1 3 5 4 5 2 2 2 0 2 2 2 2 4 2 1 1 1 2 3 1 6 4 0 2 1 3 1 2 1 2 6 3 3 2 4 1 2 3 0 5 2 3 2 2 4 5 3 3 1 1 1 2 0 4 3 3 1 2 2 1 3 3 1 2 1 3 4 1 1 3 4 2 3 2 2 2 4 2 4 5 3 4 5 6 2 3 3 1 3 4 2 1 4 1 5 3 2 4 4 5 1 2 1 3 4 5 0 3 4 2 3 2 3 3 3 4 3 3 3 3 3 3 4 2 1 1 4 3 3 2 4 1 3 5 2 1 3 5 2 4 5 1 3 3 4 4 3 2 4 3 1 3 2 4 2 3 3 2 3 2 4 6 2 2 3 2 3 3 4 2 1 4 3 4 4 5 3 2 3 2 4 2 3 3 4 2 6 1 2 3 0 5 4 6 3 2 2 1 5 1 2 1 2 3 4 5 2 1 4 1 3 3 3 4 4 2 1 3 1 0 5 2 3 1 1 3 1 2 2 2 4 3 2 1 2 5 3 1 3 1 2 3 2 3 2 4 2 0 2 4 0 5 5 6 2 2 4 3 1 4 2 2 2 3 5 2 3 5 2 4 1 3 3 1 3 6 2 5 3 2 5 5 5 1 2 4 1 3 3 1 2 2 2 4 3 2 1 1 3 2 3 3 4 4 2 4 3 1 1 1 4 1 2 1 2 0 2 4 4 2 2 5 1 0 3 4 2 0 2 2 3 3 3 4 3 1 2 1 4 2 4 1 2 1 2 1 4 3 6 4 5 3 2 2 5 0 3 3 2 3 3 3 3 3 4 1 1 3 3 3 2 1 3 1 0 2 1 4 2 3 2 2 2 2 3 2 3 3 1 2 2 1 4 2 3 4 1 4 2 2 0 4 2 2 5 3 3 1 2 2 1 1 4 1 5 3 3 1 2 2 1 2 2 0 1 1 4 3 3 2 1 4 3 1 2 4 1 2 3 3 0 2 3 3 1 4 1 1 3 0 3 3 1 1 2 4 3 2 3 2 5 1 3 2 5 4 0 4 5 1 1 2 4 3 3 2 1 4 2 1 2 2 1 2 1 2 1 2 2 4 4 3 5 3 3 3 3 4 2 2 0 1 7 1 2 1 2 2 1 7 1 4 3 2 2 3 1 5 1 0 3 1 6 2 4 2 3 4 3 2 2 4 2 3 3 1 3 1 2 3 6 4 0 3 2 3 2 2 3 3 5 2 1 4 3 4 1 0 2 3 2 2 5 2 3 1 1 2 0 3 1 0 2 3 2 3 2 0 2 3 3 3 2 4 1 2 4 4 4 1 3 4 2 2 1 3 4 2 1 3 2 1 1 1 1 2 6 3
C: 3 1 2 2 2 3 4 1 2 5 6 1 3 2 4 2 2 3 1 5 4 1 4 3 1 8 4 5 4 0 3 4 4 2 1 3 3 3 1 5 4 3 2 2 1 2 6 2 2 4 1 2 2 3 4 4 0 1 3 3 3 6 2 3 2 3 2 2 5 2 2 4 4 3 2 4 2 2 3 2 5 4 1 2 3 2 5 1 2 2 4 3 3 3 2 1 4 4 3 2 0 2 6 1 2 2 1 2 3 4 0 1 1 2 1 3 1 1 0 1 3 1 3 0 4 1 0 3 2 1 2 4 2 3 4 6 1 2 3 3 2 2 5 4 2 2 1 2 3 0 3 4 1 2 1 4 2 1 3 1 5 5 5 1 3 4 2 3 2 1 2 3 3 4 2 4 3 0 3 3 5 3 3 3 2 5 4 3 3 3 3 6 3 0 0 3 1 2 1 1 3 1 2 0 3 0 1 2 1 4 4 3 1 3 2 4 3 2 1 3 0 3 5 4 3 4 1 3 3 1 3 1 2 2 1 3 4 2 2 3 1 3 1 0 2 4 2 1 1 1 0 3 2 6 1 0 5 4 2 6 1 3 1 3 1 2 1 2 3 2 3 2 1 0 5 2 1 3 1 2 3 5 1 4 3 2 3 2 5 0 3 3 3 2 1 3 3 4 3 3 3 5 3 3 2 1 2 3 3 4 2 4 2 3 1 4 5 3 4 1 2 5 2 1 1 2 2 2 4 1 4 5 0 1 3 5 1 4 3 2 3 0 4 1 1 4 3 3 2 2 5 5 2 3 3 2 0 2 3 3 2 2 2 5 2 2 0 4 2 3 2 2 3 2 0 2 1 5 5 3 2 1 3 1 3 4 1 2 2 2 2 4 3 4 0 4 0 2 3 2 4 4 4 3 3 4 1 0 4 1 2 3 3 2 2 2 2 1 2 2 1 1 2 2 4 4 2 0 3 3 1 3 2 1 3 3 3 3 2 3 3 1 1 3 1 2 5 0 4 3 2 1 4 4 5 3 3 5 2 2 3 3 1 3 0 1 1 3 0 1 3 1 2 3 3 2 2 3 3 1 1 1 4 3 4 2 4 3 3 1 1 1 1 1 2 2 2 1 2 2 1 0 5 4 3 4 2 0 1 4 2 6 2 4 2 1 3 4 3 1 3 5 3 1 1 2 3 3 4 1 4 2 4 4 4 2 4 2 6 2 3 4 5 2 1 3 1 2 3 2 3 1 1 3 1 4 4 1 2 2 2 2 2 3 1 5 2 4 1 1 3 2 2 2 2 2 5 3 2 2 2 3 4 2 1 3 4 3 3 2 2 1 5 0 2 2 3 5 2 1 3 1 2 3 3 4 1 2 4 6 3 2 1 4 1 5 2 1 2 4 1 2 2 4 2 4 2 2 2 3 1 3 3 4 4 2 4 3 3 2 3 2 2 2 4 3 3 0 4 3 1 3 1 2 2 1 5 6 1 2 0 1 0 3 2 4 2 3 2 2 4 3 2 4 1 0 2 4 2 2 4 7 3 6 1 3 2 2 2 2 0 4 3 3 4 7 2 2 2 3 3 4 5 3 4 3 4 2 1 4 2 3 1 4 2 6 2 4 1 5 3 3 4 1 2 0 0 2 2 4 3 3 4 1 0 4 0 3 4 3 1 5 1 5 5 3 1 0 1 3 5 1 1 1 1 3 3 3 4 3 5 1 3 2 2 1 3 2 3 5 4 4 4 2 2 2 3 3 2 4 5 3 2 0 4 4 5 2 2 4 2 5 3 3 2 3 4 3 1 2 0 3 3 4 3 3 3 2 1 2 4 2 0 2 0 1 3 4 3 2 1 1 3 1 0 2 4 1 2 2 4 3 5 4 4 4 2 3 3 1 5 3 1 1 3 1 1 3 0 3 2 2 0 3 0 4 2 1 1 2 2 3 4 3 2 3 2 2 3 2 3 3 3 3 3 3 2 4 1 3 3 1 1 2 7 3 4 3 1 5 4 1 1 3 5 0 5 5 1 0 5 3 5 1 2 4 5 3 3 5 1 4 3 1 3 2 5 1 2 1 2 5 3 2 2 1 2 3 1 1 3 2 4 3 2 2 1 2 6 4 1 3 1 4 3 5 2 2 3 2 3 2 2 2 5 0 5 5 1 2 3 2 5 5 1 2 1 4 7 1 5 4 4 1 1 2 2 2 3 4 5 1 1 1 4 3 3 4 0 3 3 5 0 3
G: 4 6 1 3 1 3 4 4 2 2 1 0 3 2 0 1 2 3 2 1 3 3 2 2 3 0 0 0 3 2 4 4 1 6 2 2 1 3 3 1 3 2 3 1 4 2 2 2 2 4 2 2 3 3 6 1 6 4 2 5 4 2 3 2 3 2 1 2 3 2 4 3 1 1 3 2 4 2 1 0 1 3 0 2 2 4 2 4 3 2 2 2 4 2 0 3 0 1 0 1 2 2 2 0 0 4 2 2 2 2 2 3 2 2 6 4 1 3 3 4 6 1 0 3 1 2 7 3 3 6 2 3 1 1 1 4 1 3 1 2 5 2 2 2 0 3 2 4 3 2 1 4 3 3 3 3 3 5 1 0 4 1 2 3 3 2 2 2 0 3 1 1 3 5 2 1 1 3 2 3 1 3 5 0 1 0 1 2 3 1 2 1 2 4 3 2 3 4 2 2 5 2 5 5 3 3 3 1 1 1 4 3 3 0 2 1 1 2 5 2 4 3 1 0 2 1 4 3 2 5 4 5 2 3 3 2 2 4 5 3 2 2 4 0 3 1 1 4 3 3 3 3 3 3 2 4 3 3 1 1 4 3 2 2 3 4 5 2 3 4 3 4 2 2 1 2 4 3 3 2 2 1 2 2 3 2 4 3 0 5 2 2 2 1 3 3 1 0 1 3 1 2 2 3 3 5 4 2 3 2 5 3 3 2 2 2 0 1 2 3 3 2 2 2 1 5 3 4 2 2 0 0 4 2 4 0 0 0 2 2 2 2 2 1 2 1 3 0 1 0 1 1 3 5 4 2 4 0 2 1 3 3 4 0 2 1 3 2 0 1 1 4 2 2 5 3 5 0 2 3 2 4 2 3 2 3 5 2 1 1 1 2 2 3 3 4 5 3 2 3 2 2 1 3 3 4 0 5 3 4 5 1 4 4 3 4 1 2 1 4 2 4 3 2 2 1 3 4 4 4 3 1 2 2 1 1 4 3 4 2 3 4 5 2 5 6 1 3 3 5 4 2 2 1 4 4 1 1 3 4 4 1 3 4 6 2 3 2 2 3 3 5 2 4 3 1 5 3 1 3 1 2 0 2 1 2 4 4 3 3 2 0 4 3 0 3 4 3 2 2 2 3 1 2 3 1 3 5 2 3 6 3 1 3 3 3 2 3 1 3 2 1 1 1 4 1 0 5 3 1 0 3 1 1 1 1 4 3 1 1 4 1 2 2 2 2 2 2 2 5 1 4 3 2 3 2 3 1 2 1 1 0 4 4 3 1 0 2 3 3 1 2 1 2 2 5 4 1 1 1 4 4 2 3 4 2 2 4 1 2 2 2 1 5 1 3 2 1 3 3 3 3 2 2 3 3 3 1 0 1 6 3 4 2 4 0 2 3 2 3 5 3 2 2 3 3 2 4 3 2 6 1 2 3 1 2 2 0 2 1 2 2 3 3 1 2 2 3 4 3 2 1 3 1 1 4 2 1 2 5 2 3 1 0 1 1 1 1 1 3 4 1 2 2 3 6 2 1 3 1 2 0 3 2 4 2 2 1 1 2 4 1 4 2 2 0 2 4 3 5 4 4 3 2 1 4 2 2 6 2 1 1 4 3 3 2 2 2 3 1 1 2 4 5 3 5 4 3 2 0 3 3 0 4 2 0 3 3 3 2 3 2 4 2 2 1 1 3 3 3 0 2 5 4 1 1 3 2 1 1 1 3 4 2 4 4 2 0 3 0 1 3 0 5 3 1 3 1 2 3 0 1 2 2 3 1 4 2 2 3 2 1 3 3 3 3 3 4 4 2 2 1 3 3 2 0 2 4 5 3 3 4 2 5 7 4 2 2 1 3 4 2 2 3 2 1 3 6 3 2 4 2 1 1 1 3 2 3 1 4 2 1 1 2 2 6 4 3 3 2 3 2 1 0 3 5 3 6 3 2 2 3 1 2 3 3 3 6 2 3 4 4 1 1 1 2 3 2 0 0 2 4 3 2 1 1 2 3 1 1 2 4 5 3 4 1 2 1 2 6 1 4 3 2 4 4 1 3 1 3 3 2 1 2 2 1 1 3 2 5 2 1 1 4 0 3 2 1 2 3 3 3 0 2 3 3 3 2 2 2 1 0 5 2 3 1 0 3 2 4 3 6 3 3 2 3 0 1 6 2 2 1 2 3 2 3 2 0 1 3 4 1 0 4 3 4 3 3 4 1 1 3 3 3 4 3 1 4 5 1 4 0 1 2
T: 1 2 4 2 2 3 0 2 2 2 2 3 1 3 4 2 3 1 4 4 2 1 3 1 3 0 4 1 2 3 2 1 2 1 3 4 3 1 4 1 2 2 3 4 1 2 0 3 1 1 5 1 4 2 0 3 3 3 2 0 1 1 3 2 4 2 3 3 1 2 2 2 1 3 1 1 2 1 3 3 2 1 7 2 2 1 2 2 3 3 1 1 1 3 5 2 3 1 2 4 2 4 1 4 4 3 1 1 1 1 4 3 5 1 2 3 5 5 4 5 1 2 3 5 3 3 1 2 3 1 2 2 4 4 4 0 4 1 1 1 0 3 3 4 6 3 7 2 3 6 2 2 3 1 3 3 2 2 4 4 1 2 2 3 1 2 2 2 3 3 3 5 1 0 5 3 4 3 4 2 1 2 2 1 3 3 4 1 2 2 4 1 2 3 3 3 4 2 2 5 1 5 1 3 2 2 4 4 4 1 1 1 4 3 3 4 3 4 2 1 1 2 1 0 2 4 4 2 4 0 0 3 3 3 1 2 2 1 2 4 5 2 4 3 1 3 3 4 4 3 2 3 3 0 4 4 2 3 4 3 2 2 5 3 2 2 1 4 1 3 3 2 3 4 2 1 2 1 5 5 2 1 2 3 3 1 2 1 4 2 3 2 3 5 3 0 3 3 3 3 3 2 2 2 3 1 2 2 3 4 2 2 5 1 5 4 4 0 3 3 2 1 4 6 3 2 3 2 1 4 3 2 4 4 3 2 6 1 1 4 3 4 2 5 4 3 2 1 4 3 1 3 3 1 1 2 2 3 2 2 4 3 2 1 3 3 4 2 5 3 3 1 4 4 4 2 1 3 1 2 3 1 3 1 3 2 1 1 3 2 5 2 3 3 5 0 3 3 1 3 3 3 4 2 1 1 3 1 3 3 2 3 2 2 4 2 1 4 4 2 3 4 3 3 4 0 3 3 1 1 2 1 3 4 5 5 2 2 4 1 1 2 3 3 2 1 1 4 2 0 3 4 0 4 0 0 2 2 2 2 1 4 2 1 0 2 3 1 3 0 2 1 3 2 1 3 1 3 2 5 3 4 4 1 1 1 1 1 3 3 3 4 5 3 4 3 1 4 3 3 4 3 1 1 1 2 2 2 3 1 1 0 3 0 2 4 1 2 3 1 3 3 3 3 3 3 2 1 0 5 2 1 2 3 1 4 1 2 1 3 1 2 0 4 4 3 3 0 3 1 3 3 3 2 2 2 2 4 3 3 3 3 1 1 3 2 4 2 3 3 2 4 1 5 4 0 1 1 3 1 1 1 2 4 0 4 2 2 4 3 2 2 2 4 3 4 2 1 2 2 0 4 5 2 3 3 1 5 3 2 0 2 4 2 3 3 2 3 4 2 2 0 3 3 2 2 4 1 3 2 1 2 3 3 3 2 4 2 0 1 3 4 1 2 4 1 3 5 0 1 2 4 3 2 5 1 2 0 4 2 5 0 7 2 4 3 2 1 2 4 0 2 5 1 3 3 4 3 3 3 1 1 3 1 2 3 3 4 3 2 4 1 0 4 3 2 2 3 3 1 1 2 0 1 1 1 2 1 2 4 4 2 3 3 3 0 3 1 3 0 3 4 0 3 1 3 2 4 4 5 2 3 2 2 2 2 2 1 1 3 1 3 2 0 1 3 5 4 3 1 1 6 3 2 5 3 2 4 2 5 4 4 2 2 2 2 3 6 2 3 2 1 3 0 4 5 2 5 2 1 2 2 5 4 1 3 1 2 4 1 1 1 1 3 3 2 2 2 1 5 3 3 1 2 3 5 4 2 2 5 2 3 4 0 0 3 4 0 3 4 3 3 4 4 5 4 3 1 2 3 1 1 3 4 2 3 3 1 5 4 1 2 5 5 2 1 0 3 4 3 0 2 9 3 2 0 4 1 2 3 3 2 4 1 3 3 3 0 4 3 2 1 5 4 4 1 1 1 4 4 2 2 3 2 0 4 4 3 1 3 2 4 2 2 0 2 2 0 4 2 2 0 1 2 3 2 1 3 0 0 2 2 3 3 2 5 2 2 4 1 3 3 3 3 6 3 0 2 7 3 2 2 4 3 2 2 1 4 1 0 5 3 3 4 2 1 6 3 0 2 1 1 4 3 3 4 4 4 1 3 3 4 1 2 5 2 4 3 0 2 0 3 2 1 2 3 2 1 1 3 3 3 2 4 1 1 4 1 4 5 2 3 3 2