Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.02 KB | None | 0 0
  1. # 1 лаба
  2. # 1 задание
  3. def CountNucleotides(dna):
  4.     a = 0
  5.     c = 0
  6.     g = 0
  7.     t = 0
  8.  
  9.     for symbol in dna:
  10.         if symbol == 'A':
  11.             a += 1
  12.         elif symbol == 'C':
  13.             c += 1
  14.         elif symbol == 'G':
  15.             g += 1
  16.         else:
  17.             t += 1
  18.  
  19.     return str.format("{} {} {} {}", a, c, g, t)
  20.  
  21.  
  22. print(CountNucleotides(input()))
  23.  
  24. # 2 задание
  25. def PatternCount(text, pattern):
  26.     match = 0
  27.     len_pattern = len(pattern)
  28.     len_text = len(text)
  29.  
  30.     if len_pattern > len_text:
  31.             return match
  32.  
  33.     for i in range(len_text-len_pattern+1):
  34.         if text[i:i+len_pattern] == pattern:
  35.             match += 1
  36.  
  37.     return match
  38.  
  39.  
  40. print(PatternCount(input(), input()))
  41.  
  42.  
  43. # 3 задание
  44. def count(text, pattern):
  45.     k = len(pattern)
  46.     matches = 0
  47.  
  48.     for i in range(len(text)-k+1):
  49.         if text[i:i+k] == pattern:
  50.             matches += 1
  51.  
  52.     return matches
  53.  
  54.  
  55. def frequent_words(text, k):
  56.     k = min(len(text), k)
  57.  
  58.     patterns = set()
  59.     matches = 0
  60.     for i in range(len(text)-k+1):
  61.         substr = text[i:i+k]
  62.         cur_matches = count(text, substr)
  63.         if matches < cur_matches:
  64.             patterns.clear()
  65.             matches = cur_matches
  66.  
  67.         if matches == cur_matches:
  68.             patterns.add(substr)
  69.  
  70.     patterns = list(patterns)
  71.     patterns.sort()
  72.     return patterns
  73.  
  74.  
  75. print(" ".join(word for word in frequent_words(input(), int(input()))))
  76.  
  77.  
  78. # 4 задание
  79. def reverse_complement(dna):
  80.     alphabet = {'A': 'T', 'T': 'A', 'C': 'G', 'G': 'C'}
  81.     chars = list(dna)
  82.     for i in range(len(chars)):
  83.         chars[i] = alphabet[chars[i]]
  84.  
  85.     chars.reverse()
  86.     return ''.join(chars)
  87.  
  88.  
  89. print(reverse_complement(input()))
  90.  
  91.  
  92. # 5 задание
  93. def pattern_matching(text, pattern):
  94.     k = len(pattern)
  95.     res = []
  96.  
  97.     for i in range(len(text)-k+1):
  98.         if text[i:i+k] == pattern:
  99.             res.append(i)
  100.  
  101.     return res
  102.  
  103.  
  104. pattern = input()
  105. text = input()
  106. print(' '.join(str(val) for val in pattern_matching(text, pattern)))
  107.  
  108.  
  109. # 2 лаба
  110. # 1 задание
  111. def pattern_to_number(dna):
  112.     res = ""
  113.     arr = {'A': '0', 'C': '1', 'G': '2', 'T': '3'}
  114.     for symbol in dna:
  115.         res += arr[symbol]
  116.  
  117.     return int(res, 4)
  118.  
  119. print(pattern_to_number(input()))
  120.  
  121.  
  122. # 2 задание
  123. def convert_base(num):
  124.     # now convert decimal to 'to_base' base
  125.     alphabet = "0123"
  126.     if num < 4:
  127.         return alphabet[num]
  128.     else:
  129.         return convert_base(num // 4) + alphabet[num % 4]
  130.  
  131.  
  132. def number_to_pattern(index, k):
  133.     str_val = convert_base(index)
  134.     offset = k-len(str_val)
  135.     if offset < 0:
  136.         return None
  137.     str_val = ('0' * offset) + str_val
  138.  
  139.     res = ""
  140.     arr = {'0': 'A', '1': 'C', '2': 'G', '3': 'T'}
  141.     for symbol in str_val:
  142.         res += arr[symbol]
  143.  
  144.     return res
  145.  
  146.  
  147. arg = input()
  148. args = arg.split(' ')
  149. print(number_to_pattern(int(args[0]), int(args[1])))
  150.  
  151.  
  152. # 3 задание
  153. def pattern_to_number(dna):
  154.     res = ""
  155.     arr = {'A': '0', 'C': '1', 'G': '2', 'T': '3'}
  156.     for symbol in dna:
  157.         res += arr[symbol]
  158.  
  159.     return int(res, 4)
  160.  
  161.  
  162. def computing_frequencies(text, k):
  163.     frequency_array = [0] * (4**k)  # а не 4**k-1?
  164.     for i in range(len(text)-k+1):
  165.         pattern = text[i:i+k]
  166.         j = pattern_to_number(pattern)
  167.         frequency_array[j] += 1
  168.  
  169.     return frequency_array
  170.  
  171.  
  172. print(' '.join(str(val) for val in computing_frequencies(input(), int(input()))))
  173.  
  174.  
  175. # 4 задание
  176. def pattern_to_number(dna):
  177.     res = ""
  178.     arr = {'A': '0', 'C': '1', 'G': '2', 'T': '3'}
  179.     for symbol in dna:
  180.         res += arr[symbol]
  181.  
  182.     return int(res, 4)
  183.  
  184.  
  185. def convert_base(num):
  186.     # now convert decimal to 'to_base' base
  187.     alphabet = "0123"
  188.     if num < 4:
  189.         return alphabet[num]
  190.     else:
  191.         return convert_base(num // 4) + alphabet[num % 4]
  192.  
  193.  
  194. def number_to_pattern(index, k):
  195.     str_val = convert_base(index)
  196.     offset = k-len(str_val)
  197.     if offset < 0:
  198.         return None
  199.     str_val = ('0' * offset) + str_val
  200.  
  201.     res = ""
  202.     arr = {'0': 'A', '1': 'C', '2': 'G', '3': 'T'}
  203.     for symbol in str_val:
  204.         res += arr[symbol]
  205.  
  206.     return res
  207.  
  208.  
  209. def computing_frequencies(text, k):
  210.     frequency_array = [0] * (4**k)
  211.     for i in range(len(text)-k+1):
  212.         pattern = text[i:i+k]
  213.         j = pattern_to_number(pattern)
  214.         frequency_array[j] += 1
  215.  
  216.     return frequency_array
  217.  
  218.  
  219. def faster_frequent_words(text, k):
  220.     f_patterns = []
  221.     f_arr = computing_frequencies(text, k)
  222.  
  223.     max_val = f_arr[0]
  224.     for i in range(1, len(f_arr)):
  225.         if max_val < f_arr[i]:
  226.             f_patterns.clear()
  227.             max_val = f_arr[i]
  228.  
  229.         if max_val == f_arr[i]:
  230.             f_patterns.append(number_to_pattern(i, k))
  231.  
  232.     return f_patterns
  233.  
  234.  
  235. print(' '.join(str(val) for val in faster_frequent_words(input(), int(input()))))
  236.  
  237.  
  238. # 5 задание
  239. def pattern_to_number(dna):
  240.     res = ""
  241.     arr = {'A': '0', 'C': '1', 'G': '2', 'T': '3'}
  242.     for symbol in dna:
  243.         res += arr[symbol]
  244.  
  245.     return int(res, 4)
  246.  
  247.  
  248. def convert_base(num):
  249.     # now convert decimal to 'to_base' base
  250.     alphabet = "0123"
  251.     if num < 4:
  252.         return alphabet[num]
  253.     else:
  254.         return convert_base(num // 4) + alphabet[num % 4]
  255.  
  256.  
  257. def number_to_pattern(index, k):
  258.     str_val = convert_base(index)
  259.     offset = k-len(str_val)
  260.     if offset < 0:
  261.         return None
  262.     str_val = ('0' * offset) + str_val
  263.  
  264.     res = ""
  265.     arr = {'0': 'A', '1': 'C', '2': 'G', '3': 'T'}
  266.     for symbol in str_val:
  267.         res += arr[symbol]
  268.  
  269.     return res
  270.  
  271.  
  272. def computing_frequencies(text, k):
  273.     frequency_array = [0] * (4**k)
  274.     for i in range(len(text)-k+1):
  275.         pattern = text[i:i+k]
  276.         j = pattern_to_number(pattern)
  277.         frequency_array[j] += 1
  278.  
  279.     return frequency_array
  280.  
  281.  
  282. def get_groups(text, k, l, t):
  283.     clumps = []
  284.     is_clump = [False] * (4**k)
  285.  
  286.     substr = text[0:l]
  287.     f_arr = computing_frequencies(substr, k)
  288.     for i in range(len(f_arr)):
  289.         if f_arr[i] >= t:
  290.             is_clump[i] = True
  291.  
  292.     for i in range(1, len(text)-l+1):
  293.         first_pattern = text[i-1:i+k-1]
  294.         f_arr[pattern_to_number(first_pattern)] -= 1
  295.  
  296.         last_pattern = text[i+l-k:i+l]
  297.         last_index = pattern_to_number(last_pattern)
  298.         f_arr[last_index] += 1
  299.         if f_arr[last_index] >= t:
  300.             is_clump[last_index] = True
  301.  
  302.     for i in range(len(is_clump)):
  303.         if is_clump[i]:
  304.             clumps.append(number_to_pattern(i, k))
  305.  
  306.     return clumps
  307.  
  308.  
  309. arg_text = input()
  310. args = input().split(' ')
  311. print(' '.join(e for e in get_groups(arg_text, int(args[0]), int(args[1]), int(args[2]))))
  312.  
  313.  
  314. # 3 лаба
  315. # 1 задание
  316. def min_skew(text):
  317.     results = []
  318.     _skew = 1 if (text[0] == 'G') else -1 if (text[0] == 'C') else 0
  319.     _min = _skew
  320.     results.append(1)
  321.  
  322.     for i in range(1, len(text)):
  323.         char = text[i]
  324.  
  325.         _skew += 1 if (char == 'G') else -1 if (char == 'C') else 0
  326.  
  327.         if _min > _skew:
  328.             results.clear()
  329.             _min = _skew
  330.  
  331.         if _min == _skew:
  332.             results.append(i+1)
  333.  
  334.     return results
  335.  
  336.  
  337. print(" ".join(str(i) for i in min_skew(input())))
  338.  
  339.  
  340. # 2 задание
  341. def hamming(text1, text2):
  342.     errors = 0
  343.     for char1, char2 in zip(text1, text2):
  344.         if char1 != char2:
  345.             errors += 1
  346.  
  347.     return errors
  348.  
  349. print(hamming(input(), input()))
  350.  
  351.  
  352. # 3 задание
  353. def hamming(text1, text2):
  354.     errors = 0
  355.     for char1, char2 in zip(text1, text2):
  356.         if char1 != char2:
  357.             errors += 1
  358.  
  359.     return errors
  360.  
  361.  
  362. def approximate_pattern_matching(pattern, text, d):
  363.     res = []
  364.     k = len(pattern)
  365.     for i in range(len(text)-k+1):
  366.         if hamming(text[i:i+k], pattern) <= d:
  367.             res.append(i)
  368.  
  369.     return res
  370.  
  371.  
  372. print(" ".join(str(val) for val in approximate_pattern_matching(input(), input(), int(input()))))
  373.  
  374.  
  375. # 4 задания у меня нет
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement