Форум программистов, компьютерный форум, киберфорум
Наши страницы
Free Pascal
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
I LOVE MATH
1 / 1 / 0
Регистрация: 27.10.2018
Сообщений: 24
1

Типа словарь на питоне

28.10.2018, 01:45. Просмотров 1117. Ответов 31

Добрый вечер всем! Тут возник такой вопрос, у меня есть набор букв которые имеют по несколько значений, надо проверить на совпадение строку которые мы вводим с этими символами. Например у нас в букве Q есть два значения CAA, GAC, буква М одно значение АВС (у некоторых букв есть по пять значений). Если мы вводим ABCCAA или ABCGAC и МQ тогда в обоих случаях верный ответ. Как быть? Как по короче сделать? Заранее благодарю!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2018, 01:45
Ответы с готовыми решениями:

Словарь
Как создать словарь(русско-английский) в паскале хелп плиззз...... Вообще с чего начать и есть ли...

Словарь в Паскаль
Помогите составить программу. Текстовый файл-словарь содержит 2 колонки слов (выражений),...

Как открыть файл на питоне, чтобы внутри содержимый код работал при открытии на питоне?
Хочу открыть файл, чтобы внутри код работал на питоне: >>> a = open(r'F:\python\py\Madi...

Есть ли в Java встроенная структура данных типа словарь - список пар {ключ : значение} ?
Здравствуйте! Есть ли в Java встроенная структура данных типа словарь - список пар {ключ :...

Обработать словарь типа Dictionary<string, string> и на выходе получить ступенчатый массив
Всем здравствуйте! Я только начинаю познавать программирование (около месяца).Поэтому прошу...

31
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
28.10.2018, 02:07 2
Насколько длинный словарь? Все сочетания в 3 буквы?
0
I LOVE MATH
1 / 1 / 0
Регистрация: 27.10.2018
Сообщений: 24
28.10.2018, 02:12  [ТС] 3
Да, все комбинации из трех букв. Почти у всех букв английского алфавита по 3 комбинации(
0
Миниатюры
Типа словарь на питоне  
I LOVE MATH
1 / 1 / 0
Регистрация: 27.10.2018
Сообщений: 24
28.10.2018, 02:26  [ТС] 4
bormant, да. Что можно сделать? Есть ли в паскале что-то подобное на dict в питоне?
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
28.10.2018, 02:38 5
Тут проще парой строк обойтись.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
const
  Code: String = 'GCU GCC GCA GCG AAU AAC';
  Acid: String = '?AAAANN';
var
  s, t: String;
  i: Integer;
begin
  ReadLn(s);
  for i:=0 to Length(s) div 3-1 do
   t:=t+Acid[(7+Pos(Copy(s,1+i*3,3))) div 4];
  WriteLn(t);
end.
Только строки целиком заполнить и для START STOP односимводьные обозначения выбрать. Например, [ ]. Или { }.
0
I LOVE MATH
1 / 1 / 0
Регистрация: 27.10.2018
Сообщений: 24
28.10.2018, 02:44  [ТС] 6
bormant, да, именно так можно. Но в моем случае не подходит. В string можно хранить до 255 символов, а у меня ограничение 10000 символов. Можете помочь? Я уже целых 2 дня не могу написать это. Я еле написал ввод с полным контролем ошибок.
0
Миниатюры
Типа словарь на питоне  
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
28.10.2018, 09:23 7
Лучший ответ Сообщение было отмечено I LOVE MATH как решение

Решение

Или, чтоб меньше путаницы, совместить в одной строке:
Pascal
1
2
3
4
5
6
7
8
9
10
11
const
  Acid: String = #32#32#32'? GCU N GCC N GCA N GCG N AAU A AAC A';
var
  s, t: String;
  j: Integer;
begin
  ReadLn(s);
  for j:=0 to Length(s) do
    t:=t+Acid[4+Pos(Copy(s,1+i*3,3))];
  WriteLn(t);
end.
Добавлено через 8 минут
В FPC есть длинные строки (huge strings). Но табличка легко поместится и в 255.
Требования о вводе в одну строку тоже нет, более того, просят строку и позицию выводить.
Так что словарь в строку, а использование его обернуть в функцию, и будет отлично.

Добавлено через 19 минут
Хм, 65x4=260.
Поэтому вопрос: ценен процесс или результат?
То есть стоит биться с втискиванием этого словаря в исходник, либо можно прсто прилинковать бинарник или прочитать словарь из файла?

Для уменьшения размера можно кодировать аминокислоты малыми буквами, кодоны — большими, учитывать особенность при использовании. Они же равнозначны, малые и большие?

Добавлено через 5 часов 31 минуту
И еще момент: глянул чуть внимательнее, в табличке не 100%-ное отношение один-ко-многим, у START и M есть AUG, надо бы и остальные проверить на дублирование. Да и с этим уточнить, точно не опечатка?

Добавлено через 8 минут
Не опечатка: https://ru.m.wikipedia.org/wiki/Кодон

Добавлено через 19 минут
Т.е. триплеты — это 3-значные числа в 4-ичной системе счисления («цифры» A, U, G, C), 64 значения всего, по байту на триплет более чем достаточно. Осталось обеспечить непересечение с диапазоном A..Z и по возможности исключить #0. Код буквы A - 65, хотя формально и хватает 1-64, есть смысл не трогать начальные 64 символа (первые 32 из них управляющие), а уйти во вторую половину, от 128 и далее. Получим 128 символов в словаре, или 130 с знаком ? для ошибочных вариантов.

Добавлено через 5 минут
Но если нужен скользящий поиск по данным, из
AUGCAUGCA нужно анализировать не только
AUG CAU GCA, а все возможные
AUG UGC GCA CAU AUG UGC GCA,
такое представление может быть не очень удобным

В биологии первый вариант, а у вас?
Рамка считывания

Поскольку каждый кодон содержит три нуклеотида, один и тот же генетический текст можно прочитать тремя разными способами (начиная с первого, второго и третьего нуклеотидов), то есть в трех разных рамках считывания. За некоторыми интересными исключениями, значимой является информация, закодированная только в одной рамке считывания. По этой причине крайне важным для синтеза белка рибосомой является её правильное позиционирование на стартовом AUG-кодоне — инициация трансляции.
1
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
28.10.2018, 11:25 8
Сворачивать/разворачивать можно, например, так:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
type
  TCodon = String[3];
const
  RNADigits: array [0..3] of Char = 'AUGC';
 
function DC(c: Char): TCodon;
var j, t: Integer;
begin
  Result:='???';
  if (c<Chr(128)) or (c>Chr(128+64-1)) then Exit;
  t:=Ord(c)-128;
  for j:=3 downto 1 do begin
    Result[j]:=RNADigits[t and 3]; t:=t shr 2;
  end;
end;
 
function EC(s: TCodon): Char;
var j, r: Integer;
begin
  Result:='?'; r:=0;
  for j:=1 to Length(s) do
    case UpCase(s[j]) of
    'A': r:=r*4;
    'U': r:=r*4+1;
    'G': r:=r*4+2;
    'C': r:=r*4+3;
    else Exit;
    end;
  Result:=Chr(128+r);
end;
Добавлено через 34 минуты
Можно раскрыть цикл, будет чуть быстрее:
Pascal
1
2
3
4
5
6
7
8
9
10
function DC(c: Char): TCodon;
var t: Integer;
begin
  Result:='???';
  if (c<Chr(128)) or (c>Chr(128+64-1)) then Exit;
  t:=Ord(c)-128;
  Result[3]:=RNADigits[t and 3]; t:=t shr 2;
  Result[2]:=RNADigits[t and 3]; t:=t shr 2;
  Result[1]:=RNADigits[t and 3];
end;
Добавлено через 32 минуты
Эти «приседания» были сделаны ради использования Pos().
Но можно и свой словарь в том или ином виде реализовать. Но нужно ли?
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
28.10.2018, 13:41 9
Если хочется ручками, можно "в лоб" вот так:
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{$mode ObjFPC}
type
  TRec = record
    Codons: String[23];
    AmAcid: Char;
  end;
  TCodon = String[3];
 
const
  Codons: array [0..20] of TRec = (
    (Codons:'GCU GCC GCA GCG'        ; AmAcid:'A'),
    (Codons:'CGU CGC CGA CGG AGA AGG'; AmAcid:'R'),
    (Codons:'AAU AAC'                ; AmAcid:'N'),
    (Codons:'GAU GAC'                ; AmAcid:'D'),
    (Codons:'UGU UGC'                ; AmAcid:'C'),
    (Codons:'CAA CAG'                ; AmAcid:'Q'),
    (Codons:'GAA GAG'                ; AmAcid:'E'),
    (Codons:'GGU GGC GGA GGG'        ; AmAcid:'G'),
    (Codons:'CAU CAC'                ; AmAcid:'H'),
    (Codons:'AUU AUC AUA'            ; AmAcid:'I'),
    (Codons:'UUA UUG CUU CUC CUA CUG'; AmAcid:'L'),
    (Codons:'AAA AAG'                ; AmAcid:'K'),
    (Codons:'AUG'                    ; AmAcid:'M'),
    (Codons:'UUU UUC'                ; AmAcid:'F'),
    (Codons:'CCU CCC CCA CCG'        ; AmAcid:'P'),
    (Codons:'UCU UCC UCA UCG AGU AGC'; AmAcid:'S'),
    (Codons:'ACU ACC ACA ACG'        ; AmAcid:'T'),
    (Codons:'UGG'                    ; AmAcid:'W'),
    (Codons:'UAU UAC'                ; AmAcid:'Y'),
    (Codons:'GUU GUC GUA GUG'        ; AmAcid:'V'),
    (Codons:'UAA UGA UAG'            ; AmAcid:'}'));
 
function CodonToAmAcid(c: TCodon): Char;
var i: Integer;
begin
  Result:='?';
  for i:=Low(Codons) to High(Codons) do with Codons[i] do
    if Pos(c,Codons)<>0 then begin
      Result:=AmAcid; Exit;
    end;
end;

А можно отсортировать по кодонам, предварительно разделив строки, где первый символ отличается:
Pascal
1
2
3
4
5
6
    (Codons:'CGU CGC CGA CGG AGA AGG'; AmAcid:'R'),
// на
    (Codons:'AGA AGG'; AmAcid:'R'),
// ...
    (Codons:'CGU CGC CGA CGG'; AmAcid:'R'),
// ... и остальные
и исключить из перебора примерно три четверти строк.

Примерно так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{$mode ObjFPC}
type
  TRec = record
    Codons: String[15];
    AmAcid: Char;
  end;
  TCodon = String[3];
 
const
  Codons: array [0..24] of TRec = (
    (Codons:'AUG'             ; AmAcid:'M'), {  0 }
    (Codons:'ACU ACC ACA ACG' ; AmAcid:'T'),
    (Codons:'AUU AUC AUA'     ; AmAcid:'I'),
    (Codons:'AAA AAG'         ; AmAcid:'K'),
    (Codons:'AAU AAC'         ; AmAcid:'N'),
    (Codons:'AGA AGG'         ; AmAcid:'R'),
    (Codons:'AGU AGC'         ; AmAcid:'S'),
    (Codons:'CAA CAG'         ; AmAcid:'Q'), {  7 }
    (Codons:'CAU CAC'         ; AmAcid:'H'),
    (Codons:'CCU CCC CCA CCG' ; AmAcid:'P'),
    (Codons:'CGU CGC CGA CGG' ; AmAcid:'R'),
    (Codons:'CUU CUC CUA CUG' ; AmAcid:'L'),
    (Codons:'GCU GCC GCA GCG' ; AmAcid:'A'), { 12 }
    (Codons:'GGU GGC GGA GGG' ; AmAcid:'G'),
    (Codons:'GUU GUC GUA GUG' ; AmAcid:'V'),
    (Codons:'GAU GAC'         ; AmAcid:'D'),
    (Codons:'GAA GAG'         ; AmAcid:'E'),
    (Codons:'UCU UCC UCA UCG' ; AmAcid:'S'), { 17 }
    (Codons:'UGU UGC'         ; AmAcid:'C'),
    (Codons:'UUA UUG'         ; AmAcid:'L'),
    (Codons:'UUU UUC'         ; AmAcid:'F'),
    (Codons:'UAU UAC'         ; AmAcid:'Y'),
    (Codons:'UGG'             ; AmAcid:'W'),
    (Codons:'UAA UGA UAG'     ; AmAcid:'}'),
    (Codons:#0                ; AmAcid:'?')); { барьер }
 
function CodonToAmAcid(c: TCodon): Char;
var p: ^TRec;
begin
  Result:='?';
  if Length(c)<>3 then Exit;
  case c[1] of
    'A': p:=@Codons[0];
    'U': p:=@Codons[17];
    'G': p:=@Codons[12];
    'C': p:=@Codons[7];
    else Exit;
  end;
  while (c[1]=p^.Codons[1]) and (Pos(c,p^.Codons)<>0) do Inc(p);
  if c[1]=p^.Codons[1] then Result:=p^.AmAcid;
end;
1
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
28.10.2018, 14:09 10
... и тишина была ему ответом.

Понятно/непонятно? Получилось/не получилось?
0
I LOVE MATH
1 / 1 / 0
Регистрация: 27.10.2018
Сообщений: 24
07.11.2018, 23:08  [ТС] 11
Да, получилось. Спасибо большое! Прощу извинить, был несколько занят)
0
I LOVE MATH
1 / 1 / 0
Регистрация: 27.10.2018
Сообщений: 24
07.11.2018, 23:17  [ТС] 12
Я использовал функцию pos.
0
Вложения
Тип файла: rar zadacha.rar (1.3 Кб, 3 просмотров)
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
08.11.2018, 17:27 13
Сообщение об ошибочном символе РНК стоит поправить ;-)

Кое-что можно упростить, а кое-что -- и переписать.
Pascal
1
2
if (Pos(x,' AUGC-.')=0) and (ord(x)<>13) and (ord(x)<>10) then
if Pos(x,' AUGC-.'#10#13)=0 then
или даже
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const
  cRNK=['AUGC']; cProt=['A'..'I','K'..'N','P'..'T','V','W','Y']-['B']; cEmpty=[#10,#13,' ','-','.'];
  msgEnter='Введите последовательность ';
  msgTooLong='Слишком длинная последовательность ';
  msgInvalid='Недопустимый символ в описании ';
 
if x in cRNK+cEmpty then begin
  // ...
end else begin
  WriteLn(msgInvalid,'РНК'); Exit;
end;
 
if y in cProt+cEmpty then begin
  // ...
end else begin
  WriteLn(msgInvalid,'белка'); Exit;
end;
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const
  rnaMax=10000;
  cRNK=['AUGC']; cProt=['A','C'..'I','K'..'N','P'..'T','V','W','Y']; cEmpty=[#10,#13,' ','-'];
  msgEnter='Введите последовательность ';
  msgTooLong='Слишком длинная последовательность ';
  msgInvalid='Недопустимый символ в описании ';
var
  rna: array [0..rnaMax-1] of Char;
  line: array [0..rnaMax-1] of Integer;
  prot: array [0..499] of Char;
  rnaCnt, lineCnt, protCnt: Integer;
  t: Char;
begin
  WriteLn(msgEnter,'РНК:');
  line[0]:=1; lineCnt:=1; {rnaCnt:=0;}
  Read(t);
  while t<>'.' do begin
    t:=UpCase(t);
    if not (t in cRNK+cEmpty) then begin
      WriteLn(msgInvalid,'РНК'); Exit;
    end;
    if t in cRNK then begin
      if rnaCnt>High(rna) then begin
        WriteLn(msgTooLong,'РНК'); Exit;
      end;
      rna[rnaCnt]:=t; Inc(rnaCnt);
    end else if t=#10 then begin
      line[lineCnt]:=rnaCnt; Inc(lineCnt);
    end;
    Read(t);
  end;
  line[lineCnt]:=rnaCnt; Inc(lineCnt);
 
  WriteLn(msgEnter,'белка:');
  {protCnt:=0;}
  Read(t);
  while t<>'.' do begin
    t:=UpCase(t);
    if not (t in cProt+cEmpty) then begin
      WriteLn(msgInvalid,'белка'); Exit;
    end;
    if t in cProt then begin
      if protCnt>High(prot) then begin
        WriteLn(msgTooLong,'белка'); Exit;
      end;
      prot[protCnt]:=t; Inc(protCnt);
    end;
    Read(t);
  end;
Если посмотреть внимательно на эти два фрагмента, станет видно, что их достаточно легко объединить в единую процедуру чтения длинной последовательности.

Добавлено через 12 минут
Далее имело смысл
1) свернуть RNA по кодонам в аминокислоты, CodonToAmAcid выше уже приводил,
2) поискать одно в другом одним вызовом Pos.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
08.11.2018, 18:02 14
Чтение при помощи общей процедуры:
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
type
  PInteger = ^Integer;
  TChars = set of Char;
 
function ReadChars(
  var p: array of Char; var pCnt: Integer;
  c: TChars; line, lCnt: PInteger; const msg: String): Boolean;
const cEmpty=[#10,#13,' ','-'];
var t: Char;
begin
  ReadChars:=False;
  WriteLn('Введите последовательность ',msg,':');
  if line<>nil then begin
    line[0]:=1; lCnt^:=1;
  end;
  pCnt:=0; Read(t);
  while t<>'.' do begin
    t:=UpCase(t);
    if not (t in c+cEmpty) then begin
      WriteLn('Недопустимый символ в описании ',msg); Exit;
    end;
    if t in c then begin
      if pCnt>High(p) then begin
        WriteLn('Слишком длинная последовательность ',msg); Exit;
      end;
      p[pCnt]:=t; Inc(pCnt);
    end else if (t=#10) and (line<>nil) then begin
      line[lCnt]:=pCnt; Inc(lCnt^);
    end;
    Read(t);
  end;
  if line<>nil then begin
    line[lCnt]:=pCnt; Inc(lCnt^);
  end;
  ReadChars:=True;
end;
const
  rnaMax=10000;
  cRNK=['AUGC']; cProt=['A','C'..'I','K'..'N','P'..'T','V','W','Y'];
var
  rna: array [0..rnaMax-1] of Char;
  line: array [0..rnaMax-1] of Integer;
  prot: array [0..499] of Char;
  rnaCnt, lineCnt, protCnt: Integer;
begin
  if not ReadChars(rna,rnaCnt,cRNK,@line[0],@lineCnt,'РНК')
  or not ReadChars(prot,protCnt,cProt,nil,nil,'белка')
  then Exit;
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
09.11.2018, 12:06 15
С длинными строками плоский ввод мог выглядеть так:
Кликните здесь для просмотра всего текста

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{$H+}
type
  TChars = set of 'A'..'Z';
 
function CleanUp(var s: String; c: TChars): Boolean;
const cEmpty=[' ','-'];
var j: Integer; t: Char;
begin
  CleanUp:=False; j:=0;
  for i:=1 to Length(s) do begin
    t:=UpCase(s[i]);
    if (t in c) or (t='.') then begin
      Inc(j); s[j]:=t;
    end else if not (t in cEmpty) then Exit;
  end;
  SetLength(s,j);
  CleanUp:=True;
end;
 
var
  rna, t: String;
  line: array [0..999] of Integer;
  i, lineCnt: Integer;
begin
  WriteLn(msgEnter,'РНК',':');
  line[0]:=1; lineCnt:=1;
  repeat
    ReadLn(t);
    if not CleanUp(t,cRNA) then begin
      WriteLn(msgInvalid,'РНК'); Exit;
    end;
    i:=Pos('.',t); if i>0 then SetLength(t,i-1);
    if t<>'' then begin
      rna:=rna+t;
      line[lineCnt]:=line[lineCnt-1]+Length(t); Inc(lineCnt);
    end;
  until i>0;
 
  WriteLn(msgEnter,'белка',':');
  repeat
    ReadLn(t);
    if not CleanUp(t,cProt) then begin
      WriteLn(msgInvalid,'белка'); Exit;
    end;
    i:=Pos('.',t); if i>0 then SetLength(t,i-1);
    prot:=prot+t;
  until i>0;
И его, если необходимо, легко свернуть в одну процедуру ровно также, как выше.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
09.11.2018, 12:30 16
Теперь возможные начала можно перебрать при помощи такого кода:
Pascal
1
2
3
4
5
6
7
8
9
uses StrUtils;
//...
  i:=0;
  repeat
    i:=PosEx('AUG',rna,i+1);
    if i>0 then begin
      { нашли очередного кандидата на начало цепочки в позиции i }
    end else Break;
  until False;
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
09.11.2018, 13:03 17
Если строка белка содержит маркеры начала и конца, то достаточно взять из rna Length(prot)*3 символов, декодировать в аминокислоты и сравнить со строкой белка:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function IsEqual(const prot: String; rna: PChar): Boolean;
var i: Integer;
begin
  IsEqual:=False;
  for i:=0 to Length(prot)-1 do
    if CodonToAmAcid(@rna[i*3])<>prot[i+1] then Exit;
  IsEqual:=True;
end;
 
// ...
  i:=0; last:=Length(rna)-Length(prot)*3+1;
  repeat
    i:=PosEx('AUG',rna,i+1);
    if (i=0) or (i>last) then Break;
    if IsEqual(prot,@rna[i]) then { нашли }
  until False;
И CodonToAmAcid немного изменить -- вместо TCodone (String[3]) получать на вход PChar.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
09.11.2018, 14:23 18
Другой способ: декодировать rna начиная с 1, 2 и 3 символов в строку аминокислот и поискать в полученном белок при помощи PosEx как было показано выше. Собственно именно это и предлагалось сделать с самого начала темы.
Pascal
1
2
3
4
5
6
7
8
9
for st:=1 to 3 do begin
  t:=DecodeRNA(rna,st);
  i:=0;
  repeat
    i:=PosEx(prot,t,i+1);
    if i=0 then Break;
    { нашли в исходной позиции (i-1)*3+st }
  until False;
end;
Добавлено через 51 минуту
Функция DecodeRNA
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
{$mode ObjFPC}{$H+}
 
function DecodeRNA(const rna: String; start: Integer): String;
type
  TRec = record
    Codons: String[15];
    AmAcid: Char;
  end;
  TCodon = String[3];
const
  Codons: array [0..24] of TRec = (
    (Codons:'AUG'             ; AmAcid:'M'), {  0 }
    (Codons:'ACU ACC ACA ACG' ; AmAcid:'T'),
    (Codons:'AUU AUC AUA'     ; AmAcid:'I'),
    (Codons:'AAA AAG'         ; AmAcid:'K'),
    (Codons:'AAU AAC'         ; AmAcid:'N'),
    (Codons:'AGA AGG'         ; AmAcid:'R'),
    (Codons:'AGU AGC'         ; AmAcid:'S'),
    (Codons:'CAA CAG'         ; AmAcid:'Q'), {  7 }
    (Codons:'CAU CAC'         ; AmAcid:'H'),
    (Codons:'CCU CCC CCA CCG' ; AmAcid:'P'),
    (Codons:'CGU CGC CGA CGG' ; AmAcid:'R'),
    (Codons:'CUU CUC CUA CUG' ; AmAcid:'L'),
    (Codons:'GCU GCC GCA GCG' ; AmAcid:'A'), { 12 }
    (Codons:'GGU GGC GGA GGG' ; AmAcid:'G'),
    (Codons:'GUU GUC GUA GUG' ; AmAcid:'V'),
    (Codons:'GAU GAC'         ; AmAcid:'D'),
    (Codons:'GAA GAG'         ; AmAcid:'E'),
    (Codons:'UCU UCC UCA UCG' ; AmAcid:'S'), { 17 }
    (Codons:'UGU UGC'         ; AmAcid:'C'),
    (Codons:'UUA UUG'         ; AmAcid:'L'),
    (Codons:'UUU UUC'         ; AmAcid:'F'),
    (Codons:'UAU UAC'         ; AmAcid:'Y'),
    (Codons:'UGG'             ; AmAcid:'W'),
    (Codons:'UAA UGA UAG'     ; AmAcid:'B'),
    (Codons:#0                ; AmAcid:'?')); { барьер }
 
var
  i: Integer;
  c: TCodon;
  p: ^TRec;
  r: String;
  t: Char;
begin
  Result:='';
  SetLength(r,(Length(rna)-Start+1) div 3);
  for i:=0 to Length(r)-1 do begin
    c:=Copy(rna,Start+i*3,3); t:=c[1];
    case t of
      'A': p:=@Codons[0];
      'U': p:=@Codons[17];
      'G': p:=@Codons[12];
      'C': p:=@Codons[7];
      else Exit;
    end;
    while (t=p^.Codons[1]) and (Pos(c,p^.Codons)=0) do Inc(p);
    r[i+1]:=p^.AmAcid;
  end;
  Result:=r;
end;

'B' кодирует STOP, как и в сообщении #12.
0
I LOVE MATH
1 / 1 / 0
Регистрация: 27.10.2018
Сообщений: 24
10.11.2018, 19:55  [ТС] 19
bormant, Спасибо большое, вы очень мне помогли... Действительно, вы правы. Это очень круто! И да, по поводу сообщений при неправильном вводе РНК, я немного нервничал когда начал писать программу, т.к. не было никаких идей, прощу прощение
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4138 / 2733 / 2171
Регистрация: 22.11.2013
Сообщений: 7,633
11.11.2018, 14:07 20
Что касается вывода строки столбца, тут можно поступить примерно таким образом:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  { сортирован по неубыванию: по построению }
  line: array [0..999] of Integer;
  lineCnt: Integer;
 
procedure GetRowCol(n: Integer; var Row, Col: Integer);
var lt, rt, md: Integer;
begin
  lt:=0; rt:=lineCnt;
  while lt<rt do begin
    md:=lt+(rt-lt) div 2;
    if line[md]<=n then lt:=md+1 else rt:=md;
  end;
  Row:=lt; Col:=n-line[lt-1]+1;
end;
0
11.11.2018, 14:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2018, 14:07

Не получается вложить словарь в словарь
Друзья, доброго времени суток! Не могу понять, почему у меня не получается вложить словарь в...

Элемент модели, переданный в словарь, имеет тип "Int32", но для этого словаря требуется элемент модели типа "Calc"
Текст ошибки: System.InvalidOperationException: Элемент модели, переданный в словарь, имеет тип...

Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа
Доброго времени суток, пишу класс содержащий несколько std::set от разных типов, нужно сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru