проблема
Создайте функцию, которая может определить, является ли произвольная строка ДНК палиндромом Уотсона-Крика. Функция возьмет строку ДНК и выведет истинное значение, если строка является палиндромом Уотсона-Крика, и ложное значение, если это не так. (Истина и Ложь также могут быть представлены как 1 и 0, соответственно.)
Строка ДНК может быть в верхнем или нижнем регистре в зависимости от ваших предпочтений.
Кроме того, строка ДНК не будет пустой.
объяснение
Строка ДНК - это палиндром Уотсона-Крика, когда комплемент его реверса равен самому себе.
Если дана строка ДНК, сначала поменяйте ее местами, а затем дополните каждый символ согласно основаниям ДНК (A A T и C ↔ G). Если исходная строка равна дополненной обратной строке, это палиндром Уотсона-Крика.
Для получения дополнительной информации см. Этот вопрос . Это другая задача, когда вы должны найти самую длинную подстроку в цепочке ДНК, где эта подстрока представляет собой палиндром Уотсона-Крика.
Цель
Это код-гольф, и выигрывает самый короткий код.
Тестовые случаи
Формат есть <input> = <output>
.
ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false
ACTG = false
Ответы:
05AB1E ,
107 байтовКод:
Объяснение:
Чтобы проверить, является ли строка палиндромом, нам просто нужно проверить ввод с помощью ввода, с
at
поменять местами иcg
поменять местами, а затем развернуть его. Вот что мы собираемся сделать. Мы нажимаем на вход и ввод с обратной стороныÂ
(раздвоение). Теперь начинается сложная часть.'š×
это сжатая версия дляcreating
. Если мы изменим это, вы поймете, почему это в коде:Это будет использоваться для транслитерации обратного ввода. Транслитерация делается с
‡
. После этого мы просто проверяем правильность ввода и транслитерированного вводаQ
и печатаем это значение. Вот как выглядит стек для вводаactg
:Что также можно увидеть с флагом отладки ( попробуйте здесь ).
Использует кодировку CP-1252 . Попробуйте онлайн!,
источник
Желе , 9 байт
Попробуйте онлайн!или проверьте все контрольные примеры .
Как это работает
источник
lambda s:
. Это почти полное решение!Python 2,
564544 байтаисточник
lambda s:s==s[::-1].translate("TCG_A"*99)
работает в Python 3Perl, 27 байт
Включает +2 для
-lp
Введите данные на STDIN, печатает 1 или ничего:
dnapalin.pl
:Заменить
$_=
на,$_+=
чтобы получить0
вместо пустого для ложного случаяисточник
Pyth - 10 байт
Попробуйте онлайн здесь .
Это будет 9 байт после исправления ошибки, что делает его неконкурентным: попробуйте его здесь .
источник
Retina ,
3433 байтаПопробуйте онлайн!(Немного изменен для запуска всех тестовых случаев одновременно.)
объяснение
Продублируйте ввод, сопоставив конец строки и вставив
;
после него весь ввод.Сопоставьте только вторую половину входных данных
;.+
и выполните замену пар транслитерацией. Что касается целевого набораRo
:o
ссылается на другой набор, тоo
есть заменяется наACGT
. НоR
переворачивает этот набор, поэтому два набора на самом деле:Если вход является палиндромом ДНК, теперь у нас будет вход, за которым следует его обратное (разделенное
;
).Повторно (
+
) удалить пару одинаковых символов вокруг;
. Это будет продолжаться до тех пор, пока;
не останется только символ или, пока два символа вокруг;
не перестанут совпадать, что будет означать, что строки не противоположны друг другу.Проверьте, есть ли первый символ
;
и напечатайте0
или1
соответственно.источник
JavaScript (ES6), 59 байт
Лучшее, что я мог сделать без использования Regexp - 62 байта:
источник
Руби, 35
Я пробовал другие способы, но очевидный путь был самым коротким:
в тестовой программе
источник
->s{s.==s.reverse.tr'ACGT','TGCA'}
на байт короче.
. Код выглядит для меня более правильным без него, но он необходим для его запуска. Это где-нибудь задокументировано?==
как метода, а не как оператора, но поиск по символам невозможен.Haskell,
4845 байтПример использования:
(==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"
->True
.Неточечная версия
Изменить: @Mathias Dolidon сохранил 3 байта. Благодарность!
источник
cycle "TCG_A"
тоже. :)Сетчатка, 52 байта
источник
Юлия,
4738 байтЭто анонимная функция, которая принимает
Char
массив и возвращает логическое значение. Чтобы вызвать его, назначьте его переменной.При этом используется алгоритм Денниса, который короче наивного решения. Мы получаем остаток каждой кодовой точки, деленный на 8, добавляем его к себе в обратном порядке, получаем остатки от деления на 5 и проверяем, все ли равны 0. Последний шаг выполняется с помощью
⊆
инфиксной версииissubset
, которая приводит оба аргумента кSet
перед проверкой. Это означает , что[0,0,0]
определяется как подмножество0
, так какSet([0,0,0]) == Set(0)
. Это короче, чем явная проверка на 0.Попробуйте онлайн!
Сохранено 9 байтов благодаря Денису!
источник
Джольф, 15 байт
Попытайся!
Объяснение:
источник
Джольф, 16 байт
Попробуй это здесь!
объяснение
источник
На самом деле, 19 байтов
Это использует алгоритм Денниса .
Попробуйте онлайн!
Объяснение:
источник
Oracle SQL 11.2, 68 байт
источник
Юлия 0,4, 22 байта
Строка содержит управляющие символы EOT (4) и NAK (21). Ввод должен быть в форме массива символов.
Этот подход выполняет XOR для символов ввода с соответствующими символами в обратном вводе. Для правильных пар это приводит к символам EOT или NAK. Проверка на включение в строку этих символов выдает желаемое логическое значение.
Попробуйте онлайн!
источник
С, 71
2 байта сохранены Денисом. Дополнительные 2 байта сохранены путем адаптации для ввода строчных букв: константы
37
и21
пересмотрены до5
и2
.С 75
Сохранение одного байта: исключены скобки, взяв произведение двух кодов ASCII, мода 37. Допустимые пары оцениваются как 21. Предполагается ввод заглавными буквами.
С, 76
Использует тот факт, что коды ASCII действительных пар составляют 138 или 149. Когда используется mod 11, это единственные пары, сумма которых равна 6. Предполагается ввод в верхнем регистре.
разряженный в тестовой программе
источник
r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%37^21;return!r;}
сохраняет пару байтов.!=
>^
себя. Я уменьшил еще 2, переключившись на строчные буквы: оба магических числа теперь однозначные.фактор , 72 байта
К сожалению, регулярное выражение не может помочь мне здесь.
Обратный, ищите таблицу, сравнивайте равные.
источник
Bash + coreutils,
4332 байтатесты:
источник
J - 21 байт
По методу Денниса
использование
объяснение
источник
Лабиринт , 42 байта
Завершается ошибкой деления на ноль (сообщение об ошибке в STDERR).
Попробуйте онлайн!
Расположение кажется действительно неэффективным, но я просто не вижу способа играть в гольф прямо сейчас.
объяснение
Это решение основано на арифметическом приеме Денниса: возьмите все коды символов по модулю
8
, добавьте пару с обоих концов и убедитесь, что она делится на5
.Лабиринтный праймер:
Код начинается с небольшого цикла 2x2 по часовой стрелке, который читает все входные данные по модулю 8:
Сейчас
;
сбрасывает-1
. Мы вводим еще один цикл по часовой стрелке, который перемещает верхнюю часть основного стека (т.е. последний символ) вниз:Теперь есть короткий линейный бит:
Теперь IP находится на стыке, который действует как ветвь для проверки делимости на 5. Если результат по модулю не равен нулю, мы знаем, что входной сигнал не является палиндромом Уотсона-Крика, и мы поворачиваем на восток:
В противном случае мы должны продолжать проверять оставшуюся часть ввода, чтобы IP продолжал двигаться на юг. В
{
тянет за нижнюю часть оставшегося входа. Если мы исчерпали ввод, то это будет0
(снизу aux ), и IP продолжает двигаться на юг:В противном случае в строке будет проверено больше символов. IP поворачивается на запад и переходит в следующий (по часовой стрелке) цикл 2x2, который в основном состоит из no-ops:
После этого цикла мы снова получаем ввод в основной стек, за исключением его первого и последнего символа и с нулем сверху. В
;
отбрасывает ,0
а затем=
меняет местами вершины стеков, но это просто отменить первое=
в цикле, потому что мы вступаем в цикл в другом месте. Промыть и повторить.источник
sed,
6761 байт(67 байт)
Тест
Выход
Используя расширенные регулярные выражения, количество байтов может быть уменьшено до 61.
источник
C #, 65 байт
В некоторых случаях в .NET есть довольно длинные имена методов фреймворка, что не обязательно делает лучший фреймворк для гольф-кода. В этом случае имена методов каркаса составляют 33 символа из 90. :)
На основе трюка модуля из другого места в потоке:
Теперь весит 67 символов, из которых 13 являются именами методов.
Еще одна небольшая оптимизация, чтобы сбить колоссальные 2 символа:
Итак, 65 из которых 13 являются каркасными именами.
Редактировать: исключение некоторых из ограниченных «шаблонов» из решения и добавление пары условий оставляет нас с выражением
Что дает 0 тогда и только тогда, когда строка s является правильным ответом. Как указывает cat, «bool F (string s) =>» на самом деле заменяется на «s =>», если в коде в противном случае ясно, что выражение является a
Func<string,bool>
, т.е. сопоставляет строку с логическим значением.источник
!s.Zip...
вместоs.Zip...==0
? (Или вы не можете!
использовать его в C #?) Даже если вы не можете логически отрицать это, вы можете не указывать в своем ответе никаких инверсий и утверждать, что это возвращает <this thing> для false и <this другой детерминированный, явно заметная вещь> для правды.REXX 37
источник
R 101 байт
Тестовые случаи
источник
strsplit(x,"")[[1]]
на 3 байта корочеunlist(strsplit(x,""))
и здесь эквивалентно, такx
как всегда представляет собой одну строку символов.Октава, 52 байта
Следуя трюку Дениса ... возьмите значение 8 ASCII, переверните и сложите вместе; если каждая сумма кратна пяти, вы золотые.
источник
f=
задание; безымянные функции в порядке.Clojure / ClojureScript, 49 символов
Работает на струнах. Если требования ослаблены, чтобы разрешить списки, я могу снять
(list* )
и сохранить 7 символов.источник
R 70 байт
Использование:
источник
C 71 байт
Требуются коды ASCII для соответствующих символов, но допускается ввод прописных, строчных или смешанных букв.
Этот код поддерживает два указателя
s
иp
пересекает строку в противоположных направлениях. На каждом шаге мы сравниваем соответствующие символы, устанавливаяb
true, если они не совпадают. Соответствие основано на XOR значений символов:В приведенной выше таблице видно, что мы хотим записать успех
xx10x
или неудачу для чего-либо еще, поэтому мы XOR с00100
(четыре) и маскируем с00110
(шесть), чтобы получить ноль дляAT
илиCG
ненулевое значение в противном случае. Наконец, мы возвращаем true, если все пары накопили нулевой результат вb
противном случае - false.Тестовая программа:
источник
𝔼𝕊𝕄𝕚𝕟 13 символов / 17 байт
Try it here (Firefox only).
объяснение
Транслитеруйте ввод из
ACGT
вTGCA
и проверьте, является ли полученная строка палиндромом.источник