Ich habe eine RNA-Sequenz, die so aussieht. Jedes Zeichen steht für eine Nukleotid (Programmierer dies ignorieren können, können Sie sie als Elemente behandeln):Herausfinden der RNA-Basenpaarung in gegebener Struktur
(((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))....
Ich werde diese Nomenklatur verwenden zum Zweck der Frage:
(= lhb
) = rhb
. = dot
so wesentlichen Elemente mit LHB sind mit Elementen verbunden, die rhb haben, und alle Punkte sind freie Regionen. Die Art, wie sie verbunden sind, ist kompliziert. Es ist schwer in Worte zu fassen, so der Einfachheit halber werde ich Zahlen setzen unter einige der Elemente, die miteinander verbunden sind:
(((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))....
1 2 2 3 3 45 5 4 1
ich denke, das Sie geben eine Vorstellung davon, wie sie verbunden sind. Ich bin daran interessiert, die Standorte von verbundenen Elementen und freien Regionen herauszufinden.
(z. B. Element 1 ist mit Element 72 verbunden und Elemente 8 bis 9 sind frei).
I wählte C, um zu codieren, aber ich bin nicht wo nahe an Logik.
Auch wird es schwieriger, in C zu programmieren. Ich fühle, dass man dies leicht in Python mit regulären Ausdrücken machen kann oder Perl sein kann, aber ich habe nicht viel Erfahrung mit diesen Sprachen. Also, wenn jemand eine einfachere Methode zur Verfügung stellen kann, wird das eine große Hilfe sein. Ideen zur Verbesserung des C-Codes sind ebenfalls willkommen. Hier ist meine C-Code: -
#include <stdio.h>
int main() {
char dot[500];
int i = 0, j = 0;
int count = 0, count1 = 0, count2 = 0;
int lhb[100];
int rhb[100];
int dots[100];
int pair_1[100];
int pair_2[100];
int pair_3[100];
FILE * fp;
fp = fopen("structure.txt", "r");
while (fscanf(fp, "%c", & dot[i]) != EOF) {
i++;
}
fclose(fp);
for (i = 0; dot[i] != '\0'; i++) {
if (dot[i] == '(') {
lhb[count] = dot[i];
pair_1[count] = i;
count++;
}
else if (dot[i] == '.') {
rhb[count1] = dot[i];
pair_2[count1] = i;
count1++;
}
else {
dots[count2] = dot[i];
pair_3[count2] = i;
count2++;
}
}
printf("Base-pair details :\n");
for (j = 0; j < count; j++)
printf("%d--%d\n", pair_1[j] + 1, pair_3[count - j - 1] + 1);
printf("Loop details :\n");
// for(j=0;j<=count;j++)
// printf("--%d-",pair_2[j]+1);
return 0;
}
Es ist eine klassische „Klammern balancing“ Problem, wenn wir um all die RNA Lärm loszuwerden ... –
„Ich fühle man dies mit leicht in Python zu tun reguläre Ausdrücke oder Perl, aber ich habe nicht viel Erfahrung mit diesen Sprachen. " Wenn Sie nicht wirklich Python und/oder Perl lernen möchten, sollten Sie sich wahrscheinlich an die Sprachen halten, mit denen Sie vertraut sind. – ThisSuitIsBlackNot
Das ist gar nicht so einfach, in keiner Sprache. In Perl kann es Module geben, die helfen können, aber Sie benötigen immer noch einen guten Befehl zu den Grundlagen der Sprache. – zdim