#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
Это общая идея псевдокода.
Вот ссылка, которая может помочь вам преобразовать это в реальный код: Обработка строк