Как вы, наверное, знаете, в ДНК есть четыре основания - аденин ( A
), цитозин ( C
), гуанин ( G
) и тимин ( T
). Обычно A
связывается T
и C
связывается G
, образуя «ступеньки» структуры двойной спирали ДНК .
Мы определяем дополнение базы как базу, с которой она связана - то есть дополнение A
есть T
, дополнение T
есть A
, дополнение C
есть G
и дополнение G
есть C
. Мы также можем определить комплемент ДНК-строки как строку с каждым дополненным основанием, например, комплемент GATATC
is CTATAG
.
Из-за двухцепочечной структуры ДНК основания на одной цепи дополняют основания на другой цепи. Однако ДНК имеет направление, и транскрипция ДНК происходит в противоположных направлениях на двух нитях. Следовательно, молекулярные биологи часто заинтересованы в обратном дополнении цепочки ДНК - в буквальном смысле обратном дополнению цепочки.
Для того, чтобы расширить наш предыдущий пример, обратное дополнением GATATC
является в CTATAG
обратном направлении, так GATATC
. Как вы могли заметить, в этом примере обратное дополнение равно исходной строке - такую строку мы называем обратным палиндромом . *
Учитывая последовательность ДНК, можете ли вы найти самую длинную подстроку, которая является обратным палиндромом?
* Я использую термин «обратный палиндром», взятый из Розалинд , чтобы отличить его от обычного значения палиндрома.
вход
Ввод будет одной строкой, состоящей только из символов ACGT
в верхнем регистре. Вы можете написать либо функцию, либо полную программу для этой задачи.
Выход
Вы можете выбрать вывод через печать или возврат (последний вариант доступен только в случае функции).
Ваша программа должна вывести самую длинную обратную палиндромную подстроку входной строки, если существует уникальное решение. Если существует несколько решений, вы можете либо вывести одно из них, либо все (по вашему выбору). Дубликаты в порядке, если вы решите вывести их все.
На входе гарантированно найдется решение как минимум длиной 2.
Работал пример
ATGGATCCG -> GGATCC
Обратным дополнением GGATCC
является сама себе ( GGATCC --complement--> CCTAGG --reverse--> GGATCC
), так GGATCC
же как и обратный палиндром. GATC
также является обратным палиндомом, но он не самый длинный.
Контрольные примеры
AT -> AT
CGT -> CG
AGCA -> GC
GATTACA -> AT, TA
ATGGATCCG -> GGATCC
CCCCCGGGGG -> CCCCCGGGGG
ACATATATAGACT -> ATATAT, TATATA
ATTCGATCTATGTAAAGAGG -> TCGA, GATC
CGCACGTCTACGTACCTACGTAG -> CTACGTAG
TCAATGCATGCGGGTCTATATGCAT -> ATGCAT, GCATGC [, ATGCAT]
CGCTGAACTTTGCCCGTTGGTAGAACGGACTGATGTGAACGAGTGACCCG -> CG, GC, TA, AT [, GC, CG, CG, CG, CG]
CTCGCGTTTGCATAACCGTACGGGCGGAACAGTCGGCGGTGCCTCCCAGG -> CCGTACGG
счет
Это код гольф, поэтому решение в наименьшем количестве байтов выигрывает.
источник
Ответы:
Pyth,
37 36 2824 байтаСочетая советы от FryAmTheEggman и трюк с обратным палиндромом от Питера, это супер короткая версия.
Однако это работает только с Pyth 3.0.1, который вы можете скачать по этой ссылке и запустить как
(только для linux bash. В Windows нажмите Enter вместо <<<, а затем введите ввод)
Это мое предыдущее представление - решение 28 байт
Спасибо FryAmTheEggman за эту версию. Он создает все возможные подмножества входной строки ДНК, фильтрует подмножества при условии, что подмножество является подстрокой ввода, а обратное преобразование равно самому подмножеству.
Из-за всевозможного создания подмножества это занимает даже больше памяти, чем ответ Питера.
Это мое первое представление - 36-байтовое решение.
Это точный перевод моего ответа CJam . Я надеялся, что это будет намного меньше, но оказывается, что отсутствие метода перевода сделало его почти одинаковым по размеру (хотя на 2 байта меньше)
Попробуйте онлайн здесь
источник
Uz
эквивалентноUlz
.J"ACGT"eolNf&}TzqTjk_m@_JxJdTyz
Использованиеy
для подмножеств и последующая фильтрация строк, которые не являются подстрока,z
короче :)y
уже отсортированы по длине. Вы можете просто сделатьef...
GolfScript (
3534 байта)Для целей тестирования вы можете использовать
который добавляет,
.&
чтобы уменьшить дублированное усилие.рассечение
источник
q{]{__(;\);}%~}h]{:c:i6f&_4f^W%=}=
в CJam. Тот же размер. Не пытайтесь использовать его в онлайн-компиляторе для чего-то большего, чем длина ввода 7CJam,
3938 байтЯ уверен, что это может быть дальше в гольфе ...
Извлекает строку ДНК из STDIN и выводит самую длинную обратную палиндромную ДНК в STDOUT
Попробуйте онлайн здесь
(Объяснение в ближайшее время) (Сохранено 1 байт благодаря Питеру)
источник
Python 3, 125 символов
Смотри, мама, нет индексации! (Ну, кроме как перевернуть строку, это не считается.)
Итерация по подстрокам выполняется путем снятия символов с фронта и конца с помощью помеченного назначения . Внешний цикл удаляет символы для начала
S
и для каждого такого суффиксаs
проходит по всем его префиксам, проверяя их один за другим.Тестирование на обратный палиндром проводится по коду
который проверяет, что каждый символ и его обратная строка имеют одно из следующих значений: «AT», «TA», «CG» и «GC». Я также обнаружил, что основанное на множестве решение на один символ короче, но теряет два символа при необходимости использования внешних паренсов при использовании.
Это все еще чувствует, что это может быть сокращено.
Наконец, самый длинный палиндром напечатан.
Я надеюсь, что разделенные пробелами выходы в порядке. Если список также хорошо, звезда может быть удалена. Вместо этого я попытался отследить рабочий максимум в цикле, а также встроить внутренние циклы в понимание списка, чтобы я мог взять максимум напрямую, не создавая
l
, и оба оказались немного длиннее. Но это было достаточно близко, так что трудно сказать, какой подход на самом деле лучше.источник
J (45)
Это функция, которая принимает строку:
Объяснение:
источник
Perl - 59 байт
Считая Шебанг как единое, берется информация от
STDIN
.Пример использования:
источник
Python 2 - 177 байт
Простая грубая сила. Фактическая проверка «обратный палиндромик» - единственная интересная часть. Здесь написано более наглядно:
Я делаю это на каждой возможной подстроке и помещаю их в список, если это правда. Если это ложно, я вставляю пустую строку. Когда все проверки выполнены, я выводю самый длинный элемент списка. Я использовал пустую строку, потому что она экономит байты, не помещая ничего, но это также означает, что программа не захлебнется, если нет решения. Он выводит пустую строку и выходит изящно.
источник
s=raw_input();r,l,g=range,len(s),'TGCA';print max([a for a in[s[i:j+1]for i in r(l)for j in r(i,l)]if[g[n]for n in[~g.find(c)for c in a]]==list(a)[::-1]],key=len)
. Кроме того, для строк используйтеfind
болееindex
:)