Watson-Crick palindromok

Hozzon létre egy függvényt, amellyel meghatározható, hogy a DNS bármelyik húrja-e Watson-Crick-palindróma. A függvény felvesz egy DNS-karakterláncot, és valódi értéket ad vissza, ha a karakterlánc Watson-Crick-palindróma, és hamis értéket ad meg, ha nem. (Az igaz és a hamis 1, illetve 0 alakban is ábrázolható.)

watson-crick

A DNS karakterlánc nagybetűvel vagy kisbetűkkel állhat elő, ahogy Ön szeretné.

A DNS-húr sem lesz üres.

A DNS-lánc akkor Watson-Crick-palindróma, ha a hátoldalán lévő komplement megegyezik önmagával.

Ha kap egy DNS-húrot, először fordítsa meg, majd adja hozzá az egyes karaktereket a DNS-bázisoknak megfelelően (A ↔ T és C ↔ G). Ha az eredeti karakterlánc megegyezik a kiegészített fordított karakterlánccal, akkor ez egy Watson-Crick-palindrom.

További információkért lásd ezt a kérdést. Ez egy másik kihívás, ahol meg kell találni a DNS-húr leghosszabb alszövegét, amely egy Watson-Crick-palindróma.

Ez a kódgolf, és a legrövidebb kód nyer.

Magyarázat:

Annak ellenőrzéséhez, hogy egy karakterlánc palindrom-e, csak meg kell vizsgálnunk a bemenetet a bemenettel, fel kell cserélnünk az at -val és fel kell cserélnünk a cg-t, majd meg kell fordítanunk őket. Tehát ezt fogjuk tenni. A bemenetet és a bemenetet  (bifurkátum) -val fordítva toljuk el. Most jön egy nehéz rész. 'š × a létrehozás tömörített verziója. Ha megfordítjuk, akkor megnézheti, miért van a kódban:

Ezt használják a fordított bemenet átírására. Az átírást ‡-vel végezzük. Ezt követően csak ellenőrizzük, hogy a bemenet és az átírt bemenet valójában Q és ezt az értéket adja-e ki. Így néz ki az input verem actg:

Ami a hibakereső zászlóval is látható (próbáld meg itt).

Használ CP-1252- Kódolás. Próbálja ki online! .

Hogyan működik

+2 -t tartalmaz a -lp számára

Írja be a bemenetet az STDIN-be és az 1-es kimenetet, vagy semmit:

Cserélje ki a $ _ = értéket a $ _ + = értékre, ha 0-t üresen hagy a rossz esetre

Ezek lennének 9 bájt hibaelhárítás után, ami miatt nem versenyez: próbálja ki online itt .

Retina, 34-33 bájt

Próbálja ki online! (Kicsit módosítva az összes tesztesemény egyidejű futtatásához.)

Magyarázat

Ismételje meg a bemenetet a sztring végének és a; amelyet a teljes bejegyzés követ .

Csak a bemenet második felét térképezze fel. + A párokat helyettesítse átírással. Az Ro: o célösszegre vonatkoztatva: o A másik összegre utal, amelyet o helyettesít az ACGT. De R megfordítja ezt a halmazt úgy, hogy a két halmaz valójában:

Ha a bemenet DNS-palindróma, akkor a bemenetet a fordított követi (elválasztva;).

+ Ismételten távolítson el () egy pár azonos karaktert a; . Ez vagy addig folytatódik, amíg csak addig nem; marad, vagy amíg a két karakter a; már nem azonosak, ami azt jelenti, hogy a karakterláncok nincsenek megfordítva.

Ellenőrizze az első karaktert; és ennek megfelelően nyomtasson 0 vagy 1 értéket.

JavaScript (ES6), 59 bájt

A legjobb, amit regexp nélkül tehettem, 62 bájt volt:

Próbáltam más módszereket is, de a nyilvánvaló volt a legrövidebb:

a tesztprogramban

Haskell, 48-45 bájt

A nem pointfree verzió az

Szerkesztés: @Mathias Dolidon 3 bájtot mentett. Nagyon köszönöm!

Ez egy névtelen függvény, amely elfogadja a char tömböt és logikai értéket ad vissza. Hívásához rendelje hozzá egy változóhoz.

Dennis algoritmusát használják, amely rövidebb, mint a naiv megoldás. Megkapjuk az egyes kódpontok maradékát elosztva 8-mal, ezt hozzáadjuk fordítva, megkapjuk a maradékot az 5-vel való osztásból, és ellenőrizzük, hogy mindegyik 0. Az utolsó lépést az Infs az issubset verziójával hajtjuk végre, amely a tesztelés előtt mindkét argumentumot eldobja a beállítás után. Ez azt jelenti, hogy a [0,0,0] értéke 0 részhalmaza, mivel Set ([0,0,0]) == Set (0). Ez rövidebb, mint a 0 elleni kifejezett teszt.

9 bájt mentve Dennisnek köszönhetően!

Magyarázat

Valójában 19 bájt

A karakterlánc tartalmazza az EOT (4) és a NAK (21) vezérlő karaktereket. A bemenetnek karaktertömb formájában kell lennie.

Ez a megközelítés XOR írja be a bemenetben szereplő karaktereket a megfelelő karakterekkel a fordított bemenetben. Az EOT vagy a NAK karakterek érvényes párosításokat eredményeznek. E karakterek karaktersorozatába történő felvétel tesztelése a kívánt logikai értéket eredményezi.

2 bájt mentette Dennis. További 2 bájt mentésre kerül a bevitel kisbetűkkel történő adaptálásával: a 37. és 21. konstans 5-ös lesz, és 2-es átdolgozásra kerül .

1 bájt tárolva: a konzolt a két 37-es ASCII-kód szorzatával eltávolítottuk. Az érvényes párok besorolása 21. Feltételezzük, hogy a bejegyzés nagybetűvel történik.

Azt a tényt használja, hogy az érvényes párok ASCII-kódjai összeadják a 138-at vagy a 149-et. Ha a mod 11-et használjuk, akkor ezek az egyetlen párok, amelyek összeadják a 6-ot. Nagybetűs bejegyzést fogad el.

ungolfozatlan a tesztprogramban

Sajnos a Regex nem tud itt segíteni.

Visszafelé, keresési táblázat, összehasonlítás egy pillanat alatt.

Tesztelés:

Dennis módszere alapján

használat

Magyarázat

Labirintus, 42 bájt

Nulla osztással hibával végződik (hibaüzenet az STDERR-en).

Az elrendezés valóban hatástalannak tűnik, de most nem látok semmiféle módot a lejátszására.

Magyarázat

Ez a megoldás Dennis számtani trükkjén alapul: vegye be az összes modulo 8 karakterkódot, adjon hozzá két véget, és győződjön meg róla, hogy osztható 5-tel .

  • A labirintus két halom tetszőleges pontosságú egész számmal rendelkezik, a fő és az aux (iliary), amelyek kezdetben egy (implicit) végtelen nulla halmazzal vannak tele.
  • A forráskód hasonlít egy labirintusra, amelyben az utasításmutató (IP) lehetőség szerint folyosókat követ (még a sarkoknál is). A kód az első érvényes karakterrel kezdődik az olvasási sorrendben, ebben az esetben a bal felső sarokban. Amikor az IP bármilyen típusú csomópontba kerül (vagyis több szomszédos cellába kerül, azon kívül, ahonnan származik), akkor a fő verem teteje alapján választ egy irányt. Az alapszabályok: forduljon balra, ha negatív, folytassa, ha nulla, forduljon jobbra, ha pozitív. És ha ezek közül az egyik nem lehetséges, mert van egy fal, akkor az IP ellentétes irányba megy. Az IP akkor is megfordul, ha zsákutcákat találunk.
  • A számokat úgy dolgozzuk fel, hogy a fő verem tetejét megszorozzuk 10-vel, majd hozzáadjuk a számjegyet.

A kód egy kis 2x2 hurokkal indul az óramutató járásával megegyező irányban, amely beolvassa az összes 8 bemeneti modult:

Most; dobja a -1-et. Belépünk egy másik óramutató járásával megegyező irányba, amely lefelé mozgatja a fő halom tetejét (vagyis az utolsó karaktert):

Most van egy rövid lineáris bit:

Az IP most egy kereszteződésben van, amely csomópontként szolgál az 5-tel való oszthatóság tesztelésére. Ha a modulo eredménye nem nulla, akkor tudjuk, hogy a bemenet nem Watson-Crick palindróma, ezért kelet felé fordulunk:

Ellenkező esetben ellenőriznünk kell a bemenet többi részét, hogy az IP dél felé folytatódjon. A < 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:

Ellenkező esetben a karakterláncban további karaktereket kell ellenőrizni. Az IP nyugat felé fordul, és a következő (óramutató járásával megegyező irányú) 2x2 hurokba mozog, amely többnyire nem működik:

Ez után a hurok után a bemenet visszakerül a fő verembe, kivéve az első és az utolsó karaktert, a tetején pedig nulla. A; dobja a 0, majd a = verem tetejét, de ez csak az első = megtörését szolgálja a hurokban, mivel most egy másik helyre lépünk be. Öblítse le és ismételje meg.