Палиндроми на Уотсън-Крик
Създайте функция, която може да се използва, за да се определи дали някой низ от ДНК е палиндром на Уотсън-Крик. Функцията взема ДНК низ и връща истинска стойност, ако низът е палиндром на Уотсън-Крик и фалшива стойност, ако не е. (Вярно и невярно също могат да бъдат представени съответно като 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 = в цикъла, тъй като сега въвеждаме цикъла на различно място. Изплакнете и повторете.