Паліндроми Уотсона-Крика
Створіть функцію, за допомогою якої можна визначити, чи є будь-яка низка ДНК паліндромом Ватсона-Крика. Функція приймає рядок ДНК і повертає справжнє значення, якщо рядок є паліндромом Уотсона-Крика, і помилкове значення, якщо це не так. (Істинні та хибні також можуть бути представлені як 1 та 0 відповідно.)

Рядок ДНК може бути як у верхньому, так і в нижньому регістрі, як вам більше подобається.
Рядок ДНК теж не буде порожнім.
ДНК-ланцюг - це паліндром Уотсона-Крика, якщо комплемент на його зворотній стороні відповідає самому собі.
Отримавши рядок ДНК, спочатку переверніть його, а потім додайте кожен символ відповідно до основ ДНК (A ↔ T і C ↔ G). Якщо вихідний рядок відповідає доповненому зворотному рядку, то це паліндром Уотсона-Крика.
Докладніше див. У цьому питанні. Це ще один виклик, коли вам потрібно знайти найдовшу підрядку з низки ДНК, яка є підліпком паліндрому Уотсона-Крика.
Це кодовий гольф, і виграє найкоротший код.
Пояснення:
Щоб перевірити, чи рядок є паліндром, нам просто потрібно перевірити вхід за допомогою вводу, поміняти місцями на at і поміняти місцями cg, а потім змінити їх. Отже, це те, що ми будемо робити. Ми зміщуємо вхід і вхід за допомогою Â (біфуркація) у зворотному напрямку. Тепер настає важка частина. 'š × - це стисла версія для створення. Якщо ми змінимо його, ви побачите, чому це в коді:
Це використовується для транслітерації зворотного введення. Транслітерація виконується за допомогою ‡. Після цього ми просто перевіряємо, що вхід і транслітерований вхід насправді Q, і виводимо це значення. Ось як вхідний стек виглядає як actg:
Що також можна побачити за допомогою прапора налагодження (спробуйте тут).
Використовує CP-1252- Кодування. Спробуйте в Інтернеті! .
Як це працює
Включає +2 для -lp
Введіть введення на STDIN і виведіть 1 або нічого:
Замініть $ _ = на $ _ + =, щоб залишити 0 порожнім для неправильного випадку
Це було б 9 байт після усунення несправностей, через що він не конкурує: спробуйте в Інтернеті тут .
Сітківка, 34 33 байта
Спробуйте в Інтернеті! (Трохи змінено для запуску всіх тестових кейсів одночасно.)
Пояснення
Дублюйте введення, узгоджуючи кінець рядка та a; за яким слід весь запис .
Зіставити лише другу половину вводу;. + І замінити пари транслітерацією. Щодо цільової суми Ro: o Відноситься до іншої суми, яку o замінюють ACGT. Але R змінює цей набір так, що два набори насправді:
Якщо введенням є ДНК-паліндром, за входом слідує зворотне (розділене знаком;).
+ Неодноразово видаляйте () пару однакових символів навколо; . Це буде тривати доти лише до цього; залишається або поки два символи навколо; більше не ідентичні, це означає, що рядки не зворотні.
Перевірте наявність першого символу; і відповідно надрукуйте 0 або 1.
JavaScript (ES6), 59 байт
Найкраще, що я міг зробити без регулярного виразу, - 62 байти:
Я пробував інші способи, але очевидний був найкоротший:
в тестовій програмі
Хаскелл, 48-45 байт
Безточкова версія - це
Редагувати: @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). Введення має бути у вигляді символьного масиву.
Цей підхід XOR обробляє символи на вході з відповідними символами на зворотному вводі. Результати символів EOT або NAK для дійсних пар. Тестування на включення до рядка цих символів дає бажане булеве значення.
2 байти, збережені Деннісом. Додаткові 2 байти зберігаються шляхом адаптації введення з малих літер: константи 37 і 21 стають 5 і переглядаються 2 .
Зберігається 1 байт: дужка була видалена за допомогою добутку двох кодів ASCII мод 37. Дійсні пари оцінюються як 21. Передбачається, що запис робиться великими літерами.
Використовує той факт, що коди ASCII дійсних пар складають 138 або 149. Коли використовується mod 11, це єдині пари, які складають до 6. Приймає запис з великої літери.
гольф в тестовій програмі
На жаль, Regex не може мені тут допомогти.
Назад, таблиця пошуку, порівняйте за мить.
Тестування:
Заснований на методі Денніса
використання
Пояснення
Лабіринт, 42 байти
Припинено помилкою ділення на нуль (повідомлення про помилку на STDERR).
Макет здається насправді неефективним, але я не бачу жодного способу відтворити його зараз.
Пояснення
Це рішення базується на арифметичному фокусі Денніса: візьміть усі символьні коди за модулем 8, додайте пару обох кінців і переконайтеся, що він ділиться на 5 .
- Лабіринт має два стеки цілих чисел довільної точності, основний і допоміжний (клубовий), які спочатку заповнені (неявним) нескінченним набором нулів.
- Вихідний код нагадує лабіринт, в якому вказівник інструкцій (IP) слідує за коридорами, коли це можливо (навіть навколо кутів). Код починається з першого дійсного символу в порядку читання, в даному випадку у верхньому лівому куті. Коли IP потрапляє до будь-якого типу переходу (тобто декількох сусідніх комірок на додаток до тієї, з якої він походить), він вибирає напрямок на основі верхньої частини основного стека. Основні правила: поверніть ліворуч, якщо мінус, продовжуйте, якщо нуль, поверніть праворуч, якщо позитивно. І якщо одна з них неможлива, оскільки є стіна, то ІР йде в зворотному напрямку. IP також обертається, коли потрапляють у глухі кути.
- Цифри обробляються шляхом множення верхньої частини основного стека на 10, а потім додавання цифри.
Код починається з невеликого циклу 2x2 за годинниковою стрілкою, який зчитує всі вхідні модулі 8:
Зараз; кидає -1. Ми вводимо ще одну петлю за годинниковою стрілкою, яка рухає верхню частину основної купи (тобто останній символ) вниз:
Тепер є короткий лінійний біт:
ІР зараз знаходиться на перетині, який служить переходом для перевірки подільності на 5. Якщо результат за модулем не дорівнює нулю, тоді ми знаємо, що вхідні дані не є паліндромом Ватсона-Крика, тому ми повертаємо на схід:
В іншому випадку нам потрібно перевірити решту вхідних даних, щоб ІР продовжувався на південь. < 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 = у циклі, оскільки ми зараз вводимо цикл в іншому місці. Промити і повторити.