Палиндроми на Уотсън-Крик

Създайте функция, която може да се използва, за да се определи дали някой низ от ДНК е палиндром на Уотсън-Крик. Функцията взема ДНК низ и връща истинска стойност, ако низът е палиндром на Уотсън-Крик и фалшива стойност, ако не е. (Вярно и невярно също могат да бъдат представени съответно като 1 и 0).

палиндроми

ДНК низът може да бъде с главни или малки букви, както предпочитате.

ДНК низът също няма да е празен.

ДНК веригата е палиндром на Уотсън-Крик, ако комплементът от обратната му страна съвпада със себе си.

Когато получите ДНК низ, първо я обърнете и след това добавете всеки знак според ДНК основите (A ↔ T и C ↔ G). Ако оригиналният низ съвпада с допълнения обратен низ, това е палиндром на Уотсън-Крик.

Вижте този въпрос за повече информация. Друго предизвикателство е, когато трябва да се намери най-дългият подниз от ДНК низ, който подниз е палиндром на Уотсън-Крик.

Това е код голф и най-краткият код печели.

Обяснение:

За да проверим дали низът е палиндром, просто трябва да проверим входа с входа, да разменим с at и да разменим cg и след това да ги обърнем. Така че това ще направим. Преместваме входа и входа с Â (бифуркация) в обратна посока. Сега идва трудна част. 'š × е компресираната версия за създаване. Ако го обърнем, можете да разберете защо е в кода:

Това се използва за транслитерация на обратния вход. Транслитерацията се извършва с ‡. След това просто проверяваме дали входът и транслитерираният вход всъщност са Q и извеждаме тази стойност. Ето как входният стек изглежда като актг:

Което може да се види и с флага за отстраняване на грешки (опитайте тук).

Използва CP-1252- Кодиране. Опитайте онлайн! .

Как работи

Включва +2 за -lp

Въведете вход на STDIN и изведете 1 или нищо:

Заменете $ _ = с $ _ + =, за да оставите 0 празно за грешния случай

Това би било 9 байта след отстраняване на неизправности какво го кара да не се конкурира: опитайте онлайн тук .

Ретина, 34-33 байта

Опитайте онлайн! (Малко модифициран, за да стартирате всички тестови случаи едновременно.)

Обяснение

Дублирайте въведеното чрез съвпадение на края на низа и a; последвано от целия запис .

Картирайте само втората половина на входа;. + И заменете двойките с транслитерация. По отношение на целевата сума Ro: o Отнася се за другата сума, която o се заменя с ACGT. Но R обръща този набор, така че двата набора всъщност са:

Ако входът е ДНК палиндром, входът е последван от обратното (разделено с;).

+ Многократно премахвайте () двойка идентични знаци около; . Това ще продължи или само до това; остава или докато двата знака около; вече не са идентични, което означава, че низовете не са обърнати.

Проверете за първия знак; и отпечатайте съответно 0 или 1.

JavaScript (ES6), 59 байта

Най-доброто, което можех да направя без регулярно изражение, беше 62 байта:

Опитах други начини, но очевидният беше най-краткият:

в тестовата програма

Haskell, 48-45 байта

Не-pointfree версия е

Редактиране: @Mathias Dolidon спести 3 байта. Много благодаря!

Това е анонимна функция, която приема масив char и връща булева стойност. За да го извикате, присвойте го на променлива.

Използва се алгоритъм на Денис, който е по-кратък от наивното решение. Получаваме остатъка от всяка кодова точка, разделен на 8, добавяме това към себе си обратно, получаваме остатъка от деление на 5 и проверяваме дали всички са 0. Последната стъпка се извършва с инфиксираната версия на issubset, която хвърля и двата аргумента след набор преди тестване. Това означава, че [0,0,0] се обявява за подмножество от 0, тъй като Set ([0,0,0]) == Set (0). Това е по-кратко от изричен тест срещу 0.

9 байта спестени благодарение на Денис!

Обяснение

Всъщност 19 байта

Низът съдържа контролните знаци EOT (4) и NAK (21). Входът трябва да бъде под формата на символен масив.

Този подход XORs символите във входа със съответните знаци в обратния вход. Резултатите от знаците EOT или NAK за валидни сдвоявания. Тестването за включване в низа на тези символи дава желаната булева стойност.

2 байта запазени от Денис. Допълнителни 2 байта се запазват чрез адаптиране на входа с малки букви: константи 37 и 21 стават 5 и се ревизират 2 .

Запазен 1 байт: скобата е премахната с помощта на произведението на двата ASCII кода мод 37. Валидните двойки са оценени на 21. Предполага се, че вписването е с главни букви.

Използва факта, че ASCII кодовете на валидните двойки добавят до 138 или 149. Когато се използва мод 11, това са единствените двойки, които добавят до 6. Приема запис с главни букви.

без голф в тестовата програма

За съжаление Regex не може да ми помогне тук.

Назад, таблица за търсене, сравнете след малко.

Тестване:

Въз основа на метода на Денис

използване

Обяснение

Лабиринт, 42 байта

Прекратява се с грешка при разделяне по нула (съобщение за грешка на STDERR).

Оформлението се чувства наистина неефективно, но в момента не виждам начин да го възпроизведа.

Обяснение

Това решение се основава на аритметичния трик на Денис: вземете всички символни кодове по модул 8, добавете чифт от двата края и се уверете, че се дели на 5 .

  • Лабиринтът има два стека с произволни прецизни цели числа, main и aux (iliary), които първоначално са изпълнени с (неявен) безкраен набор от нули.
  • Изходният код прилича на лабиринт, в който указателят за инструкции (IP) следва коридори, когато е възможно (дори около ъглите). Кодът започва с първия валиден символ в реда на четене, в този случай в горния ляв ъгъл. Когато IP стигне до всякакъв вид кръстовище (т.е. множество съседни клетки в допълнение към тази, от която произхожда), той избира посока въз основа на горната част на основния стек. Основните правила са: обърнете се наляво, ако е отрицателно, продължете, ако е нула, обърнете надясно, ако е положително. И ако едно от тези не е възможно, защото има стена, тогава IP отива в обратна посока. IP също се обръща, когато се ударят задънени улици.
  • Цифрите се обработват чрез умножаване на горната част на основния стек по 10 и след това добавяне на цифрата.

Кодът започва с малък контур 2x2 по посока на часовниковата стрелка, който чете всички входни модули 8:

Сега; хвърля -1. Въвеждаме друг цикъл по посока на часовниковата стрелка, който премества горната част на основната купчина (т.е. последния знак) надолу:

Сега има кратък линеен бит:

IP вече е на кръстовище, което служи като кръстовище за тестване на делимост с 5. Ако резултатът от модула не е нула, тогава знаем, че входът не е палиндром на Уотсън-Крик, затова се насочваме на изток:

В противен случай трябва да проверим останалата част от входа, така че IP да продължи на юг. The < zieht über den unteren Rand der verbleibenden Eingabe. Wenn die Eingabe erschöpft ist, ist dies a 0 (von der Unterseite von aux ), und die IP bewegt sich weiter nach Süden:

В противен случай трябва да се проверят повече знаци в низа. IP се завърта на запад и се премества в следващия (по посока на часовниковата стрелка) контур 2x2, който е предимно без операция

След този цикъл имаме входа обратно на основния стек, с изключение на първите и последните знаци и с нула отгоре. The; хвърля 0 и след това = върховете на стека, но това служи само за прекъсване на first = в цикъла, тъй като сега въвеждаме цикъла на различно място. Изплакнете и повторете.