1. Perl / Говнокод #100

    −1006.6

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    @lib_001=('A','G','C','T','A');
    @lib_002=('C','T','A','A','G');		 
    @lib_003=('T','G','C','A','T');
    
    $string=<FILE>;
    @sequence=split("",$string);
    @code=@sequence[-7..-3];
    		
    if((join('',@lib_001) eq join('',@code)) or
        (join('',@lib_001[0..3]) eq join('',@code[0..3])) or
        (join('',@lib_001[1..4]) eq join('',@code[1..4])) or
        (join('',@lib_001[0,1,2,4]) eq join('',@code[0,1,2,4])) or
        (join('',@lib_001[0,2,3,4]) eq join('',@code[0,2,3,4])) or
        (join('',@lib_001[0,1,3,4]) eq join('',@code[0,1,3,4]))) 
    	{$tag=join('',@code);
    	 $closest_tag=join('',@lib_001);}
    			
    elsif((join('',@lib_002) eq join('',@code)) or
         (join('',@lib_002[0..3]) eq join('',@code[0..3])) or
         (join('',@lib_002[1..4]) eq join('',@code[1..4])) or
         (join('',@lib_002[0,1,2,4]) eq join('',@code[0,1,2,4])) or
         (join('',@lib_002[0,2,3,4]) eq join('',@code[0,2,3,4])) or
         (join('',@lib_002[0,1,3,4]) eq join('',@code[0,1,3,4]))) 
    	{$tag=join('',@code);
    	 $closest_tag=join('',@lib_002);}
    		
    elsif((join('',@lib_003) eq join('',@code)) or
         (join('',@lib_003[0..3]) eq join('',@code[0..3])) or
         (join('',@lib_003[1..4]) eq join('',@code[1..4])) or
         (join('',@lib_003[0,1,2,4]) eq join('',@code[0,1,2,4])) or
         (join('',@lib_003[0,2,3,4]) eq join('',@code[0,2,3,4])) or
         (join('',@lib_003[0,1,3,4]) eq join('',@code[0,1,3,4]))) 
    	{$tag=join('',@code);
    	 $closest_tag=join('',@lib_003);}
    
    else
    	{$tag=join('',@code);
    	  $closest_tag='NONE';}

    Запостил: guest, 10 Декабря 2008

    Комментарии (17) RSS

    • zerkms:
      Юбилейный сотый!
      Гратз :-)
      Ответить
    • страйко:
      спасибо! :)
      Ответить
    • phpdude:
      именно изза таких кусков кода я и ненавижу перл.
      Ответить
    • а тут особо ничего и не поделаешь, разве только сделать @lib = ((a,b,c,d,e),(a1,b1,c1,d1,e1),(a1,b2,c2, d2,e2))
      и в цикле проверять.

      или другой вариант, регуляркой заменить все joinы
      Ответить
    • $mismatches=0;for $i (0..$#a) {if ($lib[$i] ne $code[$i]) {$mismatches++;}
      if ($mismatches <=1) ....
      Ответить
    • Сергей Мартын:
      Биология какая-то? :)
      Ответить
    • Сергей Мартын:
      Вот тебе на - имя обрезает :( Что за говнокод?
      Ответить
    • Bobby:
      Не говонокод. Алгоритм не продуман просто.
      Ответить
    • надо представлять последовательность строкой, а не массивом символов и работать регулярками.

      ненавидеть Perl из-за таких кусков глупо, потому, что писал явно не пёрл-программист, скорее какой-нибудь джавер
      Ответить
    • Примерно так должен выглядеть этот код, чтобы не быть говном:

      # Является ли набор тэгов @$tag_ref ближайшим к последовательности символов @$chars_ref?
      sub is_closest {
      my ($tag_ref, $chars_ref) = @_;

      # возможные варианты комбинаций индексов
      my @index_variants = (
      [0 .. 5], [0 .. 3], [1 .. 4],
      [0, 1, 2, 4], [0, 2, 3, 4], [0, 1, 3, 4],
      );
      # поиск совпадений. при нахождении совпадения возвращаем 1
      for my $indexes ( @index_variants ) {
      if ( join(\'\', @$tag_ref[ @$indexes ]) eq join(\'\', @$chars_ref[ @$indexes ]) ) {
      return 1;
      }
      }
      }

      # Варианты наборов тэгов
      my @tags_variants = (
      [qw/ A G C T A /],
      [qw/ C N A A G /],
      [qw/ T G C A T /],
      )

      # Читаем строку из файла
      my $string = <FILE>;
      # Выбираем идущие подряд 5 символов за два до конца строки
      my @sequence = ( split(\"\",$string) )[-7 .. -3];

      # Сюда будет записан результат поиска
      my $closest_tag;

      FIND_CLOSEST:
      for my $tag_ref ( @tags_variants ) {
      if is_closest( $tag_ref, \\@test_chars ) {
      $closest_tag = join(\'\', @$tag_ref);
      last FIND_CLOSEST;
      }
      }

      $closest_tag ||= \'NONE\';
      Ответить
    • Вот это действительно старый боян...
      Ответить

    Добавить комментарий