генетический код и зомби!

#matlab

#matlab

Вопрос:

В чужом мире генетические коды существ находятся в системе base-4 (квартальный). Пары «13» и «22» рассматриваются как генетические нарушения. При генетическом коде длиной n, если имеется хотя бы n / 4 нарушений, существо становится зомби!! Например, при n = 5 существо с генетическим кодом 01321 имеет расстройство, но не зомби, в то время как существо с генетическим кодом 22132 является зомби (потому что у него два расстройства, что составляет > n / 4).

Теперь мне нужно написать программу MATLAB и получить значение n от пользователя, что несложно, и отобразить количество существ и сколько из них зомби

Вот что я написал до сих пор, я не могу понять, как определить существ с генетическими кодами зомби. Я был бы действительно признателен за ваши идеи и помощь.Спасибо

 n=input('Enter the length of the genetic sequence: ');
while (n<4) || (mod(n,1))~=0
disp('Invalid input!')
n=input('Enter the length of the genetic sequence: ');
end
nOfCreatures=4^n;
count=0;
for i=0:nOfCreatures
k=dec2base(i,4);
end
fprintf('There are %g creatures and %g of them are zombies.n',nOfCreatures,count);
  

Комментарии:

1. За сколько нарушений считается «222»?

2. Это считается за 2 нарушения

Ответ №1:

В своем комментарии я рекомендовал вам попробовать функцию REGEXP. Но на самом деле STRFIND подходил бы намного лучше, если вы хотите подсчитывать перекрытия, например, считать ‘222’ как 2 нарушения.

Итак, вам нужно что-то вроде этого:

 k=dec2base(i,4,n); %# use n to include trailing 0s, just for other possible types of disorders
m = [strfind(k,'13') strfind(k,'22')];
if numel(m) > n/4
    count = count 1;
end
  

Кроме того, вы можете сделать n=0 в качестве первой строки вместо дублирования строки ввода.
И исправьте цикл for, чтобы он заканчивался на nOfCreatures-1 .

Редактировать

В качестве бонуса векторизованное решение:

 nOfCreatures=4^n;
k=cellstr(dec2base(0:nOfCreatures-1,4,n));
m = cellfun(@numel,strfind(k,'13'))   cellfun(@numel,strfind(k,'22'));
count = sum(m > n/4);
fprintf('There are %g creatures and %g of them are zombies.n',nOfCreatures,count);
  

Комментарии:

1. Это гораздо более элегантное решение, чем мое

Ответ №2:

 error = 0
    for i<n.len:
        if n[i] == 1:
           if n[i 1] == 3:
              error = error   1
        if n[i] == 2:
           if n[i 1] == 2:
              error = error   1
if error >= n/4
     zombie = true
  

Это общая идея псевдокода.

Вот ссылка, которая может помочь вам преобразовать это в реальный код: Обработка строк