Велсон-Крик палиндроми
Создадете функција што може да се искористи за да се утврди дали некоја низа ДНК е палиндром на Вотсон-Крик. Функцијата зема ДНК низа и враќа вистинска вредност ако низата е палиндром на Вотсон-Крик и лажна вредност, ако не е. (Вистинското и неточното исто така може да бидат претставени како 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 бајти
Најдоброто што можев да го сторам без regexp беше 62 бајти:
Пробав и на други начини, но очигледниот беше најкраток:
во програмата за тестирање
Хаскел, 48-45 бајти
Верзија без поенти е
Уредување: @Mathias Dolidon зачува 3 бајти. Многу благодарам!
Ова е анонимна функција што прифаќа низа со знаци и враќа булова вредност. За да го повикате, доделете му на променлива.
Користен е алгоритам на Денис, што е пократок од наивното решение. Го добиваме остатокот од секоја кодна точка поделена со 8, го додаваме ова на себе во обратна насока, остатокот го делиме со 5 и проверуваме дали сите се 0. Последниот чекор се изведува со Inf верзијата на издавачот на инффикс, што ги фрла двата аргументи по поставувањето пред тестирањето. Ова значи дека [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 mod 37. Валидните парови се оценети со 21. Се претпоставува дека записот е со големи букви.
Го користи фактот дека кодовите ASCII на важечките парови додаваат 138 или 149. Кога се користи мод 11, овие се единствените парови што собираат до 6. Прифаќа внесување со голема буква.
без голф во програмата за тестирање
За жал Regex не може да ми помогне тука.
Назад, табела за разгледување, споредете за еден момент.
Тестирање:
Врз основа на методот на Денис
употреба
Објаснување
Лавиринт, 42 бајти
Прекинато со грешка поделба на нула (порака за грешка на STDERR).
Изгледот се чувствува навистина неефикасен, но не гледам како да го играм во моментов.
Објаснување
Ова решение се заснова на аритметичкиот трик на Денис: земете ги сите кодови на карактери модул 8, додадете пар од двата краја и проверете дали е делив со 5 .
- Лавиринтот има две групи произволни прецизни цели броеви, главни и помошни (илиријални), кои првично се полни со (имплицитно) бесконечно множество нули.
- Изворниот код наликува на лавиринт во кој покажувачот на инструкции (IP) ги следи ходниците секогаш кога е можно (дури и околу аглите). Кодот започнува со првиот валиден знак во редоследот на читање, во овој случај во горниот лев агол. Кога IP ќе дојде до кој било вид на раскрсница (т.е. повеќе соседни ќелии, покрај онаа од која потекнува), таа избира насока заснована на горниот дел од главниот оџак. Основните правила се: сврти лево ако е негативно, продолжи ако е нула, сврти надесно ако е позитивно. И, ако едно од тие не е можно затоа што има wallид, тогаш IP оди во спротивна насока. IP исто така се врти кога ќе се погоди ќорсокак.
- Бројките се обработуваат со множење на горниот дел од главниот оџак со 10 и потоа додавање на цифрата.
Кодот започнува со мала јамка 2x2 во насока на стрелките на часовникот што ги чита сите влезни модули 8:
Сега; фрла -1. Внесуваме друга јамка во насока на стрелките на часовникот што го поместува горниот дел од главниот куп (т.е. последниот знак) надолу:
Сега има краток линеарен бит:
IP сега е на пресек што служи како спој за да се тестира поделбата со 5. Ако резултатот од модулот не е нула, тогаш знаеме дека влезот не е палиндром Вотсон-Крик, па се свртуваме кон исток:
Во спротивно, треба да го провериме остатокот од влезот, така што IP ќе продолжи јужно. На < 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, што е главно без опции:
По оваа јамка, го имаме влезот назад на главниот оџак, освен првиот и последниот знак и со нула на врвот. На; фрла 0 и потоа = врвови на магацинот, но ова служи само за да се пробие првиот = во јамката бидејќи сега ја внесуваме јамката на различна локација. Исплакнете и повторете.