Nano Hash - криптовалюты, майнинг, программирование

perl выполняет циклы внутри подпрограмм для отображения самой длинной повторяющейся строки, выбранной для определенного подраздела строки

Мне было интересно, знает ли кто-нибудь, как упростить или обобщить этот код. Он дает правильный ответ, однако применим только к текущей ситуации. Мой код выглядит следующим образом:

sub longestRepeat{
                                # list of argument @_ is: (sequence, nucleotide)
  my $someSequence = shift(@_);  # shift off the first  argument from the list
  my $whatBP       = shift(@_);  # shift off the second argument from the list
  my $match = 0;



        if ($whatBP eq "AT"){
            if ($someSequence =~ m/(([A][T])\2\2\2\2\2)/g) {

            $match = $1
            }
            return $match;

        }
        if ($whatBP eq "TAGA"){
            if ($someSequence =~ m/(([T][A][G][A])\2\2)/g) {

            $match = $1
            }
            return $match;
        }

        if ($whatBP eq "C"){
            if ($someSequence =~ m/(([C])\2\2)/g) {

            $match = $1
            }
            return $match;
        }
}   

Мой вопрос заключается в том, что во втором операторе if я установил заданное количество повторений этого шаблона (применимо к строке, которую нам дали). Однако есть ли способ продолжать выполнять цикл while для поиска по \2 (повторение шаблона)? Я имею в виду, может ли это: if ($someSequence =~ m/(([A][T])\2\2\2\2\2)/g) быть упрощенным и обобщенным с помощью цикла while


  • У вас есть фиксированный набор последовательностей, для которых вы ищете самые длинные повторы, или вы просто ищете самые длинные повторяющиеся последовательности арности 1, 2 и 3? Кроме того, под самым длинным вы подразумеваете самый длинный в целом или наибольшее количество повторов? т.е. CCCC (4 повтора) длиннее, чем ATATAT (3 повтора) по вашим критериям? 14.11.2013
  • К чему я шел со своими вопросами: вы можете заменить каскад \2 простым +, указывающим один или несколько, а затем собрать ваши совпадения в гистограмме, используя такой шаблон, как $histogram{$1}++. После сканирования всей входной последовательности вы можете выполнить второй проход keys гистограммы или гистограмм, чтобы найти наилучшее совпадение по любым критериям, которые вы применяете. 14.11.2013
  • @Borys, зачем ты сделал репост этого вопроса, если уже задал его в другом посте? На этом сайте все не так. Вы задаете вопрос один раз только один раз. Если вы не получили ответ, который искали, вы можете отредактировать вопрос и добавить дополнительные сведения или пояснения. 14.11.2013
  • @Zaid Помечен как дубликат. Борис: Добро пожаловать в Stack Overflow! Сообщество здесь очень старается быть полезным. Во избежание расточительного дублирования этих усилий настоятельно рекомендуется, чтобы уникальный вопрос размещался на сайте только один раз. Модераторы применяют это предпочтение, закрывая дубликаты и направляя пользователей к исходному сообщению, содержащему вопрос. Дополнительные сведения см. в Справке по переполнению стека. 14.11.2013
  • @AaronMiller: проголосовал за закрытие. Хотя размещенный код различается между двумя вопросами, цель остается одинаковой для обоих вопросов: найти самую длинную повторяющуюся последовательность. Я оставлю Борису возможность отредактировать другой пост по своему усмотрению. 14.11.2013
  • @ Zaid Я на самом деле не уверен, что он смотрел на это с тех пор, как опубликовал, если судить по времени. (Получаете ли вы уведомление, когда кто-то отвечает на ваш вопрос; я не знаю; я когда-либо задавал только один вопрос на сайте SE, и никто не ответил на него.) 14.11.2013
  • @AaronMiller: Да, вы получаете уведомление 14.11.2013

Ответы:


1

Основываясь на названии вашей подпрограммы, я предполагаю, что вы хотите найти самую длинную повторяющуюся последовательность в своей последовательности.

Если да, то как насчет следующего:

sub longest_repeat {

    my ( $sequence, $what ) = @_;

    my @matches = $sequence =~ /((?:$what)+)/g ;  # Store all matches

    my $longest;
    foreach my $match ( @matches ) {  # Could also avoid temp variable :
                                      # for my $match ( $sequence =~ /((?:$what)+)/g )

        $longest //= $match ;         # Initialize
                                      #  (could also do `$longest = $match
                                      #                    unless defined $match`)

        $longest = $match if length( $longest ) < length( $match );
    }

    return $longest;  # Note this also handles the case of no matches
}

Если вы можете переварить это, следующая версия обеспечивает практически ту же функциональность с преобразованием Шварца:

sub longest_repeat {

    my ( $sequence, $what ) = @_;                          # Example:
                                                           # --------------------
    my ( $longest ) = map { $_->[0] }                      # 'ATAT' ...
                        sort { $b->[1] <=> $a->[1] }       # ['ATAT',4], ['AT',2]
                          map { [ $_, length($_) ] }       # ['AT',2], ['ATAT',4]
                            $sequence =~ /((?:$what)+)/g ; # ... 'AT', 'ATAT'

    return $longest ;
}

Некоторые могут возразить, что sort расточительно, потому что это O(n.log(n)), а не O(n), но для вас есть разнообразие.

14.11.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..