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


31

Проблема

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

Рядок ДНК може бути або у великому, або в малому регістрі, залежно від ваших уподобань.

Також рядок ДНК не буде порожнім.

Пояснення

ДНК-рядок - це паліндром Уотсона-Крика, коли доповнення його зворотного боку дорівнює самому собі.

Давши рядок ДНК, спочатку переверніть її, а потім доповніть кожен символ відповідно до баз ДНК (A ↔ T і C ↔ G). Якщо початковий рядок дорівнює доповненому зворотному рядку, це паліндром Уотсона-Крика.

Детальніше дивіться у цьому питанні . Це вже інший виклик, коли ви повинні знайти найдовшу підрядок рядка ДНК, де ця підрядка - паліндром Уотсона-Крика.

Мета

Це код-гольф і виграє найкоротший код.

Випробування

Формат є <input> = <output>.

ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false
ACTG = false


3
Хтось повинен написати програму в ДНК #, яка також є паліндром Уотсона-Крика. : D (можливо, це не можливо)
mbomb007

Або, якщо вам подобається, "слово - паліндром Ватсона-Крика, якщо він має порядок 2 у вільній групі на 2 генераторах" (або на n генераторах!).
wchargin

(Гадаю, технічно це "замовлення максимум на 2.")
wchargin

1
@AndrasDeak Згідно з книгою Уотсона, Франклін, мабуть, був здебільшого шипом у їхній бік. Вона неодноразово відмовлялася здавати рентген, що показує спіраль (наскільки я пам’ятаю), тому що вона відмовилася вірити. Варто ознайомитися, якщо будь-який інтерес зацікавлений у відкритті.
Обсидіан Фенікс

Відповіді:


27

05AB1E , 10 7 байт

Код:

Â'š×‡Q

Пояснення:

Щоб перевірити, чи є рядок паліндром, нам просто потрібно перевірити вхід з введенням, atзамінивши його та cgпомінявши його, а потім повернути його назад. Отже, це ми будемо робити. Ми натискаємо на вхід і на вхід, перевернувши за допомогою Â(роздвоєного). Тепер приходить хитра частина. 'š×- стислий варіант для creating. Якщо ми повернемо його назад, ви побачите, чому це в коді:

CreATinG
|  ||  |
GniTAerC

Це буде використано для транслітерації зворотного вводу. Транслітерація робиться за допомогою . Після цього ми просто перевіряємо, чи вхідні дані та транслітерований вхід є електронними Qта друкуємо це значення. Ось так виглядає стек для введення даних actg:

          # ["actg", "gtca"]
 'š×       # ["actg", "gtca", "creating"]
    Â      # ["actg", "gtca", "creating", "gnitaerc"]
     ‡     # ["actg", "cagt"]
      Q    # [0]

Що також можна побачити з прапором налагодження ( Спробуйте тут ).

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .


4
Дуже, е, креативний ...
Toby Speight

2
Ця мова має деякі дуже акуратні риси
милі

18

Желе , 9 байт

O%8µ+U5ḍP

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

O%8µ+U5ḍP  Main link. Argument: S (string)

O          Compute the code points of all characters.
 %8        Compute the residues of division by 8.
           This maps 'ACGT' to [1, 3, 7, 4].
   µ       Begin a new, monadic link. Argument: A (array of residues)
    +U     Add A and A reversed.
      5ḍ   Test the sums for divisibility by 5.
           Of the sums of all pairs of integers in [1, 3, 7, 4], only 1 + 4 = 5
           and 3 + 7 = 10 are divisible by 5, thus identifying the proper pairings.
        P  Take the product of the resulting Booleans.

4
Я думаю, що Python досить близько конкурує з цією відповіддю! Порівняйте перші дев'ять байт моєї відповіді: lambda s:. Це майже повне рішення!
orlp

Зачекайте, частина "Як це працює" насправді не пояснює, як вона працює ... Чому залишки 8 і суми 5 ?? Де букви доповнюються?
ZeroOne

@ZeroOne Я уточнив цю частину.
Денніс

Ух ти! Це чорт розумно. :) Спасибі!
ZeroOne


8

Perl, 27 байт

Включає +2 для -lp

Введіть дані про STDIN, відбитки 1 або нічого:

dnapalin.pl <<< ATCGCGAT

dnapalin.pl:

#!/usr/bin/perl -lp
$_=y/ATCG/TAGC/r=~reverse

Замініть $_=на, $_+=щоб отримати 0замість порожнього для помилкового випадку



7

Сітківка , 34 33 байт

$
;$_
T`ACGT`Ro`;.+
+`(.);\1
;
^;

Спробуйте в Інтернеті! (Трохи модифікований для запуску всіх тестових випадків одночасно.)

Пояснення

$
;$_

Дублюйте введення, зіставляючи кінець рядка та вставляючи a ; наступний весь вхід.

T`ACGT`Ro`;.+

Порівнюйте лише другу половину введення з ;.+та виконайте підміну пар транслітерацією. Щодо цільового набору Ro: oпосилається на інший набір, на який oзаміненоACGT . Але Rобертає цей набір, тому два набори є насправді:

ACGT
TGCA

Якщо вхід є паліндром ДНК, тепер ми матимемо введення, а потім його зворотний (розділений на ; ).

+`(.);\1
;

Неодноразово ( +) видаляйте пару однакових символів навколо ;. Це буде продовжуватися до тих пір, поки тільки; не залишиться лише знака "the" або поки два символи навколо ;не стануть однаковими, це означатиме, що рядки не є зворотними один до одного.

^;

Перевірте, чи є перший символ ;і надрукуйте його 0чи 1відповідно.


6

JavaScript (ES6), 59 байт

f=s=>!s||/^(A.*T|C.*G|G.*C|T.*A)$/.test(s)&f(s.slice(1,-1))

Найкраще, що я міг зробити без використання Regexp, було 62 байти:

f=s=>!s||parseInt(s[0]+s.slice(-1),33)%32%7<1&f(s.slice(1,-1))

5

Рубі, 35

Я спробував інші способи, але очевидний спосіб був найкоротшим:

->s{s.tr('ACGT','TGCA').reverse==s}

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

f=->s{s.tr('ACGT','TGCA').reverse==s}

puts f['ATCGCGAT']
puts f['AGT']
puts f['GTGACGTCAC']
puts f['GCAGTGA']
puts f['GCGC']
puts f['AACTGCGTTTAC'] 

2
->s{s.==s.reverse.tr'ACGT','TGCA'}є на байт коротше
Мітч Шварц

@MitchSchwartz вау, це працює, але я поняття не маю, для чого це спочатку .. Код мені здається більш правильним, але його потрібно запустити. Це десь задокументовано?
Рівень річки Св.

Ви впевнені, що не хочете зрозуміти це самостійно?
Мітч Шварц

@MitchSchwartz hahaha Я вже пробував. Я вважаю, що вимоги до рубіну до білого простору є дуже ідіосинкратичними. Дивні вимоги до періодів - це зовсім інше питання. У мене є кілька теорій, але всі вони можуть помилятися. Я підозрюю, що це може мати відношення до трактування ==як до методу, а не до оператора, але пошук символів неможливий.
Річка Рівня Св.

Ви правильно підозрювали. :) Це просто звичайний старий виклик методу.
Мітч Шварц

5

Haskell, 48 45 байт

(==)=<<reverse.map((cycle"TCG_A"!!).fromEnum)

Приклад використання: (==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"-> True.

Неточна версія є

f x = reverse (map h x) == x           -- map h to x, reverse and compare to x
h c = cycle "TCG_A" !! fromEnum c      -- take the ascii-value of c and take the
                                       -- char at this position of string
                                       -- "TCG_ATCG_ATCG_ATCG_A..."

Редагувати: @Mathias Dolidon зберег 3 байти. Спасибі!


Працює і з cycle "TCG_A" . :)
Матіас Долідон


4

Джулія, 47 38 байт

s->((x=map(Int,s)%8)+reverse(x))%50

Це анонімна функція, яка приймає a Char масив і повертає булева. Щоб викликати його, призначте його змінній.

Для цього використовується алгоритм Денніса, який коротший за наївне рішення. Отримуємо решту кожної кодової точки, поділену на 8, додаємо, що до неї відновлено, одержуємо залишки з поділу на 5, і перевіряємо, чи всі 0. Останній крок виконується за допомогою інфіксованої версії issubset, яка передає обидва аргументи на Setперед перевіркою. Це означає , що [0,0,0]визначається як підмножина 0, так як Set([0,0,0]) == Set(0). Це коротше, ніж явна перевірка на 0.

Спробуйте в Інтернеті!

Збережено 9 байт завдяки Деннісу!


4

Йолф, 15 байт

Спробуй це!

=~A_iγ"AGCT"_γi

Пояснення:

   _i            Reverse the input
 ~A_iγ"AGCT"_γ   DNA swap the reversed input
=~A_iγ"AGCT"_γi  Check if the new string is the same as the original input



3

Oracle SQL 11.2, 68 байт

SELECT DECODE(TRANSLATE(REVERSE(:1),'ATCG','TAGC'),:1,1,0)FROM DUAL; 

2
З таким SQL, я впевнений, ви повинні писати звіти для деяких моїх проектів раніше ...
corsiKa

3

Джулія 0,4, 22 байти

s->s$reverse(s)⊆""

Рядок містить символи керування EOT (4) та NAK (21). Введення має бути у формі символьного масиву.

Цей підхід XOR позначає символи вводу з відповідними символами на зворотному вході. Для дійсних пар це призводить до символів EOT або NAK. Тестування на включення до рядка цих символів створює потрібний булів.

Спробуйте в Інтернеті!


3

C, 71

r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%5^2;return!r;}

Денніс врятував 2 байти. Додаткові 2 байти, збережені за допомогою адаптації для введення малих літер: константи 37та 21переглядаються на 5та2 .

C, 75

i,j;f(char*s){for(i=j=0;s[i];i++)j|=s[i]*s[strlen(s)-i-1]%37!=21;return!j;}

Збережений один байт: Видалено круглі дужки, взявши добуток двох кодів ASCII mod 37. Дійсні пари оцінюють до 21. Передбачає введення великого регістру.

С, 76

i,j;f(char*s){for(i=j=0;s[i];i++)j|=(s[i]+s[strlen(s)-i-1])%11!=6;return!j;}

Використовує той факт, що коди ASCII дійсних пар становлять 138 або 149. Якщо прийнято mod 11, це єдині пари, які сумуються до 6. Передбачає введення великого регістру.

unolfolf у тестовій програмі

i,j;

f(char *s){
   for(i=j=0;s[i];i++)                  //initialize i and j to 0; iterate i through the string
     j|=(s[i]+s[strlen(s)-i-1])%11!=6;  //add characters at i from each end of string, take result mod 11. If not 6, set j to 1
return!j;}                              //return not j (true if mismatch NOT detected.)

main(){
  printf("%d\n", f("ATCGCGAT"));
  printf("%d\n", f("AGT"));
  printf("%d\n", f("GTGACGTCAC"));
  printf("%d\n", f("GCAGTGA"));
  printf("%d\n", f("GCGC"));
  printf("%d\n", f("AACTGCGTTTAC"));
} 

1
r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%37^21;return!r;}економить пару байт.
Денніс

@ Денніс спасибі, я насправді не мав настрою змінювати покажчики, але це видавило байт! Я повинен був !=> ^сам. Я зменшив ще 2, змінивши на малий вхід: обидва магічні числа тепер однозначні.
Рівень р. Св.

3

Фактор , 72 байти

На жаль, тут не може допомогти мені регулярний гекс.

[ dup reverse [ { { 67 71 } { 65 84 } { 71 67 } { 84 65 } } at ] map = ]

Реверс, таблиця пошуку, порівняння рівних.


Нічого собі, це багато пробілів !!! Чи все це потрібно? Також буде корисним посилання на домашню сторінку мови.
Рівень Рівер Сент

@LevelRiverSt На жаль, кожен шматочок необхідний. Я додаю посилання на заголовок.
кіт

3

Bash + coreutils, 43 32 байт

[ `tr ATCG TAGC<<<$1|rev` = $1 ]

Тести:

for i in ATCGCGAT AGT GTGACGTCAC GCAGTGA GCGC AACTGCGTTTAC; do ./78410.sh $i && echo $i = true || echo $i = false; done
ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false

3

J - 21 байт

0=[:+/5|[:(+|.)8|3&u:

На основі методу Денніса

Використання

   f =: 0=[:+/5|[:(+|.)8|3&u:
   f 'ATCGCGAT'
1
   f 'AGT'
0
   f 'GTGACGTCAC'
1
   f 'GCAGTGA'
0
   f 'GCGC'
1
   f 'AACTGCGTTTAC'
0
   f 'ACTG'
0

Пояснення

0=[:+/5|[:(+|.)8|3&u:
                 3&u:    - Convert from char to int
               8|        - Residues from division by 8 for each
            |.           - Reverse the list
           +             - Add from the list and its reverse element-wise
        [:               - Cap, compose function
      5|                 - Residues from division by 5 for each
    +/                   - Fold right using addition to create a sum
  [:                     - Cap, compose function
0=                       - Test the sum for equality to zero

3

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

_8
,%
;
"}{{+_5
"=    %_!
 = """{
 ;"{" )!

Закінчується помилкою поділу на нуль (повідомлення про помилку на STDERR).

Спробуйте в Інтернеті!

Макет відчуває себе справді неефективним, але я просто не бачу способу розіграти його.

Пояснення

Це рішення засноване на арифметичному трюку Денніса: візьміть усі коди символів за модулем 8, додайте пару з обох кінців і переконайтесь, що воно розділене на5 .

Лабіринтний праймер:

  • Лабіринт має два стеки цілих чисел з довільною точністю, основний і допоміжний (iliary), які спочатку заповнені (неявне) нескінченну кількість нулів.
  • Вихідний код нагадує лабіринт, де вказівник інструкції (IP) слідує за коридорами, коли може (навіть за кутами). Код починається з першого дійсного символу в порядку читання, тобто у верхньому лівому куті в цьому випадку. Коли IP доходить до будь-якої форми з'єднання (тобто декількох суміжних комірок на додаток до тієї, з якої він увійшов), він вибере напрямок на основі верхньої частини основного стеку. Основні правила: поверніть ліворуч при негативі, продовжуйте рухатись вперед, коли нуль, поверніть праворуч, коли позитивно. І коли одне з них неможливо, тому що є стіна, то IP буде приймати протилежний бік. ІС також обертається, коли потрапляє в тупики.
  • Цифри обробляються шляхом множення верхньої частини основного стека на 10, а потім додавання цифри.

Код починається з невеликого циклу 2x2 за годинниковою стрілкою, який читає весь вхідний модуль 8:

_   Push a 0.
8   Turn into 8.
%   Modulo. The last three commands do nothing on the first iteration
    and will take the last character code modulo 8 on further iterations.
,   Read a character from STDIN or -1 at EOF. At EOF we will leave loop.

Тепер ;відкидає -1. Вводимо ще одну петлю за годинниковою стрілкою, яка переміщує верхню частину основного стека (тобто останній символ) донизу:

"   No-op, does nothing.
}   Move top of the stack over to aux. If it was at the bottom of the stack
    this will expose a zero underneath and we leave the loop.
=   Swap top of main with top of aux. The effect of the last two commands
    together is to move the second-to-top stack element from main to aux.
"   No-op.

Тепер є короткий лінійний біт:

{{  Pull two characters from aux to main, i.e. the first and last (remaining)
    characters of the input (mod 8).
+   Add them.
_5  Push 5.
%   Modulo.

Зараз IP знаходиться на стику, який виступає гілкою для перевірки на подільність на 5. Якщо результат модуля не дорівнює нулю, ми знаємо, що вхід не є паліндром Ватсона-Крика, і ми повертаємо на схід:

_   Push 0.
!   Print it. The IP hits a dead end and turns around.
_   Push 0.
%   Try to take modulo, but division by zero fails and the program terminates.

В іншому випадку нам потрібно продовжувати перевіряти решту вхідних даних, щоб IP продовжував іти на південь. У {тягне за нижню частину залишився входу. Якщо ми вичерпали вхід, то це буде 0(знизу aux ), і IP продовжує рухатися на південь:

)   Increment 0 to 1.
!   Print it. The IP hits a dead end and turns around.
)   Increment 0 to 1.
{   Pull a zero over from aux, IP keeps moving north.
%   Try to take modulo, but division by zero fails and the program terminates.

В іншому випадку в рядку буде перевірено більше символів. ІР повертає на захід і переходить у наступний (за годинниковою стрілкою) 2х2 цикл, який складається здебільшого відсутності:

"   No-op.
"   No-op.
{   Pull one value over from aux. If it's the bottom of aux, this will be
    zero and the IP will leave the loop eastward.
"   No-op.

Після цього циклу ми знову отримали вхід на основний стек, за винятком першого та останнього символу та з нулем зверху. У ;відкидає , 0а потім =міняє місцями вершини стеків, але це просто скасував перше =в циклі, тому що ми вступаємо в цикл в іншому місці. Промийте і повторіть.


3

sed, 67 61 байт

G;H;:1;s/\(.\)\(.*\n\)/\2\1/;t1;y/ACGT/TGCA/;G;s/^\(.*\)\1$/1/;t;c0

(67 байт)

Тест

for line in ATCGCGAT AGT GTGACGTCAC GCAGTGA GCGC AACTGCGTTTAC ACTG
do echo -n "$line "
    sed 'G;H;:1;s/\(.\)\(.*\n\)/\2\1/;t1;y/ACGT/TGCA/;G;s/^\(.*\)\1$/1/;t;c0' <<<"$line"
done

Вихідні дані

ATCGCGAT 1
AGT 0
GTGACGTCAC 1
GCAGTGA 0
GCGC 1
AACTGCGTTTAC 0
ACTG 0

Використовуючи розширені регулярні вирази, кількість байтів можна зменшити до 61.

sed -r 'G;H;:1;s/(.)(.*\n)/\2\1/;t1;y/ACGT/TGCA/;G;s/^(.*)\1$/1/;t;c0'

Якщо ви можете це зробити в 61 байт, то це ваш результат - нічого не проти НФА або повного повторного вироблення в цьому конкретному виклику. Деякі виклики забороняють регулярний вираз, але зазвичай тільки регулярний гольф забороняє не регулярні вирази.
кіт

3

C #, 65 байт

bool F(string s)=>s.SequenceEqual(s.Reverse().Select(x=>"GACT"[("GACT".IndexOf(x)+2)%4]));

.NET має часом досить довгі назви методів фреймворку, що не обов'язково створює найкращі рамки коду для гольфу. У цьому випадку назви методів рамки складають 33 символи з 90. :)

На основі модульного трюку з інших місць у потоці:

bool F(string s)=>s.Zip(s.Reverse(),(a,b)=>a%8+b%8).All(x=>x%5==0);

Тепер важить 67 символів, з яких 13 - назви методів.

Ще одна незначна оптимізація для гоління колосальних 2 символів:

bool F(string s)=>s.Zip(s.Reverse(),(a,b)=>(a%8+b%8)%5).Sum()<1;

Отже, 65 з яких 13 - рамкові назви.

Редагувати: Опускання деяких обмежених "котельних плит" з розчину та додавання пари умов залишає нам вираз

s.Zip(s.Reverse(),(a,b)=>(a%8+b%8)%5).Sum()

Що дає 0, якщо і лише тоді, якщо рядок s є дійсною відповіддю. Як зазначає кішка, "bool F (рядок s) =>" насправді замінюється на "s =>", якщо в іншому випадку в коді ясно, що вираз є Func<string,bool>, тобто. відображає рядок з булевим.


1
Ласкаво просимо до PPCG, приємна перша відповідь! : D
кіт

@cat Дякую за це! :)
robhol

1
Я не дуже знаю , C #, але якщо це лямбда, то ви можете залишити його тип і призначення його, так як анонімні функції в порядку, поки вони правонаступник стану .
кіт

1
Крім того, ви не можете зробити це !s.Zip...замість s.Zip...==0? (Або ви не можете !вписати в C #?) Навіть якщо ви не можете бути булево-заперечувати це, ви можете залишити будь-яку інверсію і заявити у своїй відповіді, що це повертається <ця річ> за хибність і <цю іншу детерміністику, чітко помітна річ> для truthy.
кіт

1
@cat: Ти маєш рацію щодо відмови від типу. Я подумав, що код повинен бути безпосередньо виконуваним, але робити прості припущення щодо введення та виведення полегшує його. Однак інша справа не буде працювати - на мій погляд, це правильно, оскільки булева операція не має логічного (відтінку) способу застосування до числа. Присвоєння значень 0 та 1 значення false та true - це, зрештою, лише умовність.
robhol


2

R, 101 байт

g=function(x){y=unlist(strsplit(x,""));all(sapply(rev(y),switch,"C"="G","G"="C","A"="T","T"="A")==y)}

Випробування

g("ATCGCGAT")
[1] TRUE
g("AGT")
[1] FALSE
g("GTGACGTCAC")
[1] TRUE
g("GCAGTGA")
[1] FALSE
g("GCGC")
[1] TRUE
g("AACTGCGTTTAC")
[1] FALSE
g("ACTG")
[1] FALSE

strsplit(x,"")[[1]]на 3 байти коротше unlist(strsplit(x,""))і, тут, еквівалентно, оскільки xце завжди один рядок символів.
планування

2

Октава, 52 байти

f=@(s) prod(mod((i=mod(toascii(s),8))+flip(i),5)==0)

Дотримуючись хитрості Дениса ... візьміть значення ASCII mod 8, переверніть і додайте разом; якщо кожна сума кратна п'яти, ти золотий.


Це один пробіл значний? Це дивно.
кіт

Крім того, ви можете залишити f=завдання; неназвані функції нормально.
кіт

1

Clojure / ClojureScript, 49 символів

#(=(list* %)(map(zipmap"ATCG""TAGC")(reverse %)))

Працює над струнами. Якщо вимоги будуть послаблені, щоб дозволити списки, я можу зняти (list* )та зберегти 7 символів.


1

R, 70 байт

f=function(x)all(chartr("GCTA","CGAT",y<-strsplit(x,"")[[1]])==rev(y))

Використання:

> f=function(x)all(chartr("GCTA","CGAT",y<-strsplit(x,"")[[1]])==rev(y))
> f("GTGACGTCAC")
[1] TRUE
> f("AACTGCGTTTAC")
[1] FALSE
> f("AGT")
[1] FALSE
> f("ATCGCGAT")
[1] TRUE

1

C, 71 байт

Потрібні коди ASCII для відповідних символів, але приймає великі, малі та великі регістри.

f(char*s){char*p=s+strlen(s),b=0;for(;*s;b&=6)b|=*--p^*s++^4;return!b;}

Цей код підтримує два покажчики sі p, переходячи рядок у протилежних напрямках. На кожному кроці ми порівнюємо відповідні символи, встановлюючи bістинні, якщо вони не відповідають. Відповідність заснована на XOR знакових знаків:

'A' ^ 'T' = 10101
'C' ^ 'G' = 00100

'C' ^ 'T' = 10111
'G' ^ 'A' = 00110
'A' ^ 'C' = 00010
'T' ^ 'G' = 10011
 x  ^  x  = 00000

У наведеній вище таблиці ми можемо побачити, що ми хочемо зафіксувати успіх xx10xі невдачу ні для чого іншого, тому ми XOR з 00100(чотири) і маскуємо 00110((шість), щоб отримати нуль для ATабо CGі не нуль в іншому випадку. Нарешті, ми повертаємо істину, якщо всі пари накопичили нульовий результат уb , в іншому випадку помилкові.

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

#include <stdio.h>
int main(int argc, char **argv)
{
    while (*++argv)
        printf("%s = %s\n", *argv, f(*argv)?"true":"false");
}

1

𝔼𝕊𝕄𝕚𝕟, 13 символів / 17 байт

⟮ïĪ`ACGT”⟯ᴙ≔Ⅰ

Try it here (Firefox only).

Пояснення

Transliterate вхід з ACGTдо TGCAі перевірити , якщо отриманий рядок є паліндромом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.