Palindromii Watson-Crick
Creați o funcție care poate fi utilizată pentru a determina dacă orice șir de ADN este un palindrom Watson-Crick. Funcția ia un șir ADN și returnează o valoare adevărată dacă șirul este un palindrom Watson-Crick și o valoare falsă dacă nu este. (Adevărul și falsul pot fi, de asemenea, reprezentate ca 1 și respectiv 0).

Șirul ADN poate fi scris cu litere mari sau mici, după cum doriți.
Nici șirul de ADN nu va fi gol.
Un lanț ADN este un palindrom Watson-Crick dacă complementul de pe partea sa inversă se potrivește singur.
Când primiți un șir de ADN, inversați-l mai întâi și apoi adăugați fiecare caracter în funcție de bazele ADN (A ↔ T și C ↔ G). Dacă șirul original se potrivește cu șirul invers completat, atunci este un palindrom Watson-Crick.
Consultați această întrebare pentru mai multe informații. Este o altă provocare în care trebuie să găsești cel mai lung substring al unui șir de ADN, care substring este un palindrom Watson-Crick.
Acesta este codul de golf, iar cel mai scurt cod câștigă.
Explicaţie:
Pentru a verifica dacă un șir este un palindrom, trebuie doar să verificăm intrarea cu intrarea, să schimbăm cu at și să schimbăm cg, apoi să le inversăm. Deci asta vom face. Schimbăm intrarea și intrarea cu  (bifurcate) în sens invers. Acum vine o parte dificilă. 'š × este versiunea comprimată pentru creare. Dacă îl inversăm, puteți vedea de ce se află în cod:
Aceasta este utilizată pentru transliterarea intrării inverse. Transliterarea se face cu ‡. După aceea, verificăm doar dacă intrarea și intrarea transliterată sunt de fapt Q și produc valoarea respectivă. Acesta este modul în care stiva de intrare arată ca actg:
Care poate fi văzut și cu semnalizatorul de depanare (încercați aici).
Utilizări CP-1252- Codificare. Încercați-l online! .
Cum functioneaza
Include +2 pentru -lp
Introduceți intrarea pe STDIN și ieșirea 1 sau nimic:
Înlocuiți $ _ = cu $ _ + = pentru a lăsa 0 necompletat pentru cazul greșit
Acestea ar fi 9 octeți după depanarea a ceea ce îl face să nu concureze: încercați-l online aici .
Retină, 34 33 octeți
Încercați online! (Ușor modificat pentru a rula toate cazurile de test în același timp.)
Explicaţie
Duplicați intrarea prin potrivirea capătului șirului și a; urmată de întreaga intrare .
Hartați doar a doua jumătate a intrării;. + Și înlocuiți perechile cu o transliterare. În ceea ce privește suma țintă Ro: o Se referă la cealaltă sumă, care o este înlocuită de ACGT. Dar R inversează acest set astfel încât cele două seturi să fie de fapt:
Dacă intrarea este un palindrom ADN, intrarea este urmată de invers (separat prin;).
+ Elimină în mod repetat () o pereche de caractere identice în jurul; . Acest lucru va continua fie până doar atât; este lăsat sau până când cele două personaje din jurul; nu mai sunt identice, ceea ce înseamnă că șirurile nu sunt inversate.
Verificați primul caracter; și tipăriți 0 sau 1 în consecință.
JavaScript (ES6), 59 octeți
Cel mai bun lucru pe care l-aș putea face fără regexp a fost de 62 de octeți:
Am încercat alte modalități, dar cea evidentă a fost cea mai scurtă:
în programul de testare
Haskell, 48-45 de octeți
O versiune non-pointfree este
Editați: @Mathias Dolidon a salvat 3 octeți. Mulțumesc mult!
Aceasta este o funcție anonimă care acceptă o matrice de caractere și returnează o valoare booleană. Pentru a o apela, atribuiți-o unei variabile.
Se folosește algoritmul lui Dennis, care este mai scurt decât soluția naivă. Obținem restul fiecărui punct de cod împărțit la 8, îl adăugăm invers, obținem restul din împărțirea la 5 și verificăm dacă toate sunt 0. Ultimul pas este realizat cu Inf, versiunea infix a issubset, care aruncă ambele argumente după set înainte de testare. Aceasta înseamnă că [0,0,0] este declarat subset de 0, deoarece Set ([0,0,0]) == Set (0). Acesta este mai scurt decât un test explicit împotriva lui 0.
9 octeți salvați datorită lui Dennis!
Explicaţie
De fapt, 19 octeți
Șirul conține caracterele de control EOT (4) și NAK (21). Intrarea trebuie să aibă forma unui tablou de caractere.
Această abordare XORs caracterele din intrare cu caracterele corespunzătoare în intrarea inversă. Caracterele EOT sau NAK rezultă pentru asocieri valide. Testarea pentru includerea în șirul acestor caractere dă valoarea booleană dorită.
2 octeți salvați de Dennis. Se salvează încă 2 octeți prin adaptarea intrării cu litere mici: constantele 37 și 21 devin 5 și 2 revizuite .
1 octet stocat: parantezul a fost eliminat folosind produsul celor două coduri ASCII mod 37. Perechile valide sunt cotate cu 21. Se presupune că intrarea este cu majuscule.
Folosește faptul că codurile ASCII ale perechilor valide se adaugă la 138 sau 149. Când se utilizează mod 11, acestea sunt singurele perechi care adună până la 6. Acceptă introducerea cu majuscule.
neluat în programul de testare
Din păcate, Regex nu mă poate ajuta aici.
Înapoi, căutați masa, comparați într-o clipă.
Testare:
Pe baza metodei lui Dennis
utilizare
Explicaţie
Labirint, 42 octeți
Încheiat cu o eroare divizare la zero (mesaj de eroare pe STDERR).
Aspectul se simte cu adevărat ineficient, dar nu văd nicio modalitate de a-l reda chiar acum.
Explicaţie
Această soluție se bazează pe trucul aritmetic al lui Dennis: luați toate codurile de caractere modulul 8, adăugați o pereche de ambele capete și asigurați-vă că este divizibil cu 5 .
- Labirintul are două stive de numere întregi de precizie arbitrare, main și aux (iliary), care sunt inițial umplute cu un set (implicit) infinit de zerouri.
- Codul sursă seamănă cu un labirint în care indicatorul de instrucțiuni (IP) urmează coridoarele ori de câte ori este posibil (chiar și în jurul colțurilor). Codul începe cu primul caracter valid în ordinea citirii, în acest caz în colțul din stânga sus. Când IP ajunge la orice tip de joncțiune (adică mai multe celule învecinate în plus față de cea din care a provenit), alege o direcție bazată pe partea superioară a stivei principale. Regulile de bază sunt: virează la stânga dacă este negativ, continuă dacă este zero, virează la dreapta dacă este pozitiv. Și dacă una dintre acestea nu este posibilă, deoarece există un perete, atunci IP-ul merge în direcția opusă. IP-ul se întoarce și atunci când sunt lovite fundăturile.
- Cifrele sunt procesate înmulțind partea de sus a stivei principale cu 10 și apoi adăugând cifra.
Codul începe cu o buclă mică 2x2 în sensul acelor de ceasornic care citește toate modulele de intrare 8:
Acum; aruncă -1. Intrăm într-o altă buclă în sensul acelor de ceasornic care mută partea de sus a grămezii principale (adică ultimul caracter) în jos:
Acum există un bit liniar scurt:
IP-ul se află acum la o intersecție care servește ca joncțiune pentru a testa divizibilitatea cu 5. Dacă rezultatul modulului nu este zero, atunci știm că intrarea nu este un palindrom Watson-Crick, deci ne întoarcem spre est:
În caz contrar, trebuie să verificăm restul intrării, astfel încât IP să continue spre sud. < 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:
În caz contrar, mai multe caractere din șir trebuie verificate. IP-ul se rotește spre vest și se mută în următoarea buclă 2x2 (în sensul acelor de ceasornic), care este în mare parte fără opțiuni:
După această buclă, avem intrarea înapoi pe stiva principală, cu excepția primului și ultimului caracter și cu un zero deasupra. The; aruncă 0 și apoi = vârfurile stivei, dar acest lucru servește doar pentru a sparge primul = în buclă deoarece intrăm acum în buclă într-o altă locație. Clătiți și repetați.