Watson-Crickove palindrómy
Vytvorte funkciu, pomocou ktorej možno určiť, či je niektorý reťazec DNA Watson-Crickovým palindrómom. Funkcia prevezme reťazec DNA a vráti skutočnú hodnotu, ak je reťazcom Watson-Crickov palindróm, a nesprávnu hodnotu, ak nie je. (Pravda a nepravda môžu byť tiež vyjadrené ako 1, respektíve 0.)

Reťazec DNA môže byť podľa potreby buď veľkými, alebo malými písmenami.
Prázdny nebude ani reťazec DNA.
Reťazec DNA je Watson-Crickov palindróm, ak sa komplement na jeho zadnej strane zhoduje so sebou.
Keď dostanete reťazec DNA, najskôr ho obráťte a potom pridajte každý znak podľa báz DNA (A ↔ T a C ↔ G). Ak sa pôvodný reťazec zhoduje s doplneným obráteným reťazcom, potom ide o Watson-Crickov palindróm.
Ďalšie informácie nájdete v tejto otázke. Je to ďalšia výzva, kde musíte nájsť najdlhší podreťazec reťazca DNA, ktorým je podskupina Watson-Crickovho palindrómu.
Toto je code golf a vyhráva najkratší kód.
Vysvetlenie:
Ak chcete skontrolovať, či je reťazec palindróm, stačí skontrolovať vstup so vstupom, zameniť ho za at a zameniť cg a potom ho obrátiť. Takže to budeme robiť. Posunieme vstup a vstup s reverzným  (rozdvojením). Teraz prichádza ťažká časť. 'š × je komprimovaná verzia na vytváranie. Ak to obrátime, uvidíte, prečo je to v kóde:
Používa sa na prepis spätného vstupu. Prepis sa vykonáva pomocou ‡. Potom už len skontrolujeme, či je vstup a prepisovaný vstup skutočne Q a na výstupe je táto hodnota. Takto vyzerá vstupný zásobník ako actg:
Čo je tiež viditeľné s príznakom ladenia (skúste tu).
Používa CP-1252- Kódovanie. Vyskúšajte to online! .
Ako to funguje
Zahŕňa +2 za -lp
Zadajte vstup na STDIN a výstup 1 alebo nič:
Nahraďte $ _ = za $ _ + = a nechajte 0 prázdnych pre nesprávny prípad
Tieto by boli 9 bajtov po odstránení problémov, vďaka ktorým nekonkuruje: vyskúšajte online tu .
Sietnica, 34-33 bajtov
Vyskúšajte to online! (Mierne upravené, aby sa spustili všetky testovacie prípady súčasne.)
Vysvetlenie
Duplikujte vstup zladením konca reťazca a; a nasleduje celý záznam .
Namapujte iba druhú polovicu vstupu;. + A páry nahraďte prepisom. Pokiaľ ide o cieľovú sumu, Ro: o Vzťahuje sa na druhú sumu, ktorá je o nahradená ACGT. Ale R obráti túto množinu tak, že dve množiny sú v skutočnosti:
Ak je vstupom DNA palindróm, za vstupom nasleduje reverz (oddelené;).
+ Opakovane odstráňte () dvojicu rovnakých znakov okolo; . Bude to pokračovať dovtedy, kým nebude iba to; je vľavo alebo kým dva znaky okolo; už nie sú identické, čo znamená, že reťazce nie sú obrátené.
Skontrolujte prvý znak; a podľa toho vytlačte 0 alebo 1.
JavaScript (ES6), 59 bajtov
Najlepšie, čo som bez regexpu mohol urobiť, bolo 62 bajtov:
Skúšal som aj iné spôsoby, ale zrejmý bol najkratší:
v testovacom programe
Haskell, 48-45 bajtov
Verzia bez bodu je
Upraviť: @Mathias Dolidon uložil 3 bajty. Veľká vďaka!
Toto je anonymná funkcia, ktorá prijíma pole char a vracia boolovskú hodnotu. Ak ju chcete nazvať, priraďte ju k premennej.
Používa sa Dennisov algoritmus, ktorý je kratší ako naivné riešenie. Dostaneme zvyšok každého kódového bodu vydelený 8, pridáme to k sebe opačne, získame zvyšok vydelením 5 a skontrolujeme, či sú všetky 0. Posledný krok sa vykonáva s verziou Inf infix issubset, ktorá pred testovaním hodí oba argumenty po sade. To znamená, že [0,0,0] je vyhlásená za podmnožinu 0, pretože množina ([0,0,0]) == množina (0). To je kratšie ako pri explicitnom teste proti 0.
Vďaka Dennisovi ušetrených 9 bajtov!
Vysvetlenie
Vlastne 19 bajtov
Reťazec obsahuje riadiace znaky EOT (4) a NAK (21). Vstup musí byť vo forme znakového poľa.
Tento prístup XOR charakterizuje znaky na vstupe so zodpovedajúcimi znakmi na opačnom vstupe. Výsledkom znakov EOT alebo NAK je platné párovanie. Testovanie na zahrnutie do reťazca týchto znakov prinesie požadovanú booleovskú hodnotu.
2 bajty uložené Dennisom. Ďalšie 2 bajty sa uložia úpravou vstupu malými písmenami: konštanty 37 a 21 sa stanú 5 a revidované 2 .
1 bajt uložený: zátvorka bola odstránená pomocou súčinu dvoch kódov ASCII, mód 37. Platné páry sú ohodnotené na 21. Predpokladá sa, že položka je napísaná veľkými písmenami.
Používa skutočnosť, že kódy ASCII platných párov pridávajú až 138 alebo 149. Keď sa použije mod 11, sú to jediné páry, ktorých je spolu 6. Prijíma zadávanie veľkých písmen.
negolfovaný v testovacom programe
Regex mi tu bohužiaľ nemôže pomôcť.
Spätne, vyhľadávacia tabuľka, o chvíľu porovnajte.
Testovanie:
Na základe Dennisovej metódy
použitie
Vysvetlenie
Labyrint, 42 bajtov
Ukončené s chybou delenia nulou (chybové hlásenie na STDERR).
Rozloženie je skutočne neefektívne, ale momentálne nevidím žiadny spôsob, ako ho hrať.
Vysvetlenie
Toto riešenie je založené na Dennisovom aritmetickom triku: vezmite všetky kódy znakov modulo 8, pridajte pár obidvoch koncov a uistite sa, že je deliteľný 5 .
- Labyrint má dva stohy ľubovoľných presných celých čísel, hlavný a aux (iliary), ktoré sú na začiatku naplnené (implicitnou) nekonečnou množinou núl.
- Zdrojový kód pripomína bludisko, v ktorom ukazovateľ inštrukcie (IP) sleduje koridory, kedykoľvek je to možné (dokonca aj za rohy). Kód začína prvým platným znakom v poradí čítania, v tomto prípade v ľavom hornom rohu. Keď sa adresa IP dostane k ľubovoľnému typu spojenia (t. J. K viacerým susedným bunkám okrem bunky, z ktorej pochádzajú), zvolí smer založený na hornej časti hlavného stohu. Základné pravidlá sú: odbočte doľava, ak je záporné, pokračujte, ak je nula, a odbočte doprava, ak ste kladné. A ak jeden z nich nie je možný, pretože je tu múr, potom ide IP opačným smerom. IP sa tiež otočí, keď sú zasiahnuté slepé uličky.
- Číslice sa spracúvajú vynásobením hornej časti hlavného zásobníka číslom 10 a následným pridaním číslice.
Kód začína malou slučkou 2x2 v smere hodinových ručičiek, ktorá číta všetky vstupné moduly 8:
Teraz; hodí -1. Zadáme ďalšiu slučku v smere hodinových ručičiek, ktorá posúva hornú časť hlavnej hromady (t.j. posledný znak) nadol:
Teraz existuje krátky lineárny bit:
IP je teraz na križovatke, ktorá slúži ako križovatka na testovanie deliteľnosti číslom 5. Ak výsledok modulo nie je nula, potom vieme, že vstup nie je Watson-Crickov palindróm, takže sa obrátime na východ:
Inak musíme skontrolovať zvyšok vstupu, aby IP pokračovala na juh. 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:
V opačnom prípade je potrebné skontrolovať viac znakov v reťazci. IP sa točí na západ a posúva sa do ďalšej (v smere hodinových ručičiek) smyčky 2x2, ktorá je väčšinou bez ops:
Po tejto slučke máme vstup späť na hlavný zásobník, okrem prvého a posledného znaku a s nulou navrchu. The; hodí 0 a potom = vrcholy zásobníka, ale toto slúži iba na rozbitie prvého = v slučke, pretože teraz vstupujeme do slučky na inom mieste. Opláchnite a opakujte.