Problem
Erstellen Sie eine Funktion, mit der festgestellt werden kann, ob es sich bei einem beliebigen DNA-String um ein Watson-Crick-Palindrom handelt. Die Funktion nimmt einen DNA-String und gibt einen wahren Wert aus, wenn der String ein Watson-Crick-Palindrom ist, und einen falschen Wert, wenn dies nicht der Fall ist. (Wahr und Falsch können auch als 1 bzw. 0 dargestellt werden.)
Die DNA-Zeichenfolge kann je nach Belieben entweder in Groß- oder Kleinbuchstaben angegeben werden.
Auch der DNA-String wird nicht leer sein.
Erläuterung
Eine DNA-Kette ist ein Watson-Crick-Palindrom, wenn das Komplement ihrer Rückseite mit sich selbst übereinstimmt.
Wenn Sie einen DNA-String erhalten, kehren Sie ihn zunächst um und ergänzen Sie dann jedes Zeichen gemäß den DNA-Basen (A ↔ T und C ↔ G). Wenn die ursprüngliche Zeichenfolge der komplementierten umgekehrten Zeichenfolge entspricht, handelt es sich um ein Watson-Crick-Palindrom.
Weitere Informationen finden Sie in dieser Frage . Es ist eine andere Herausforderung, bei der Sie den längsten Teilstring eines DNA-Strings finden müssen, wobei dieser Teilstring ein Watson-Crick-Palindrom ist.
Tor
Dies ist Code-Golf und der kürzeste Code gewinnt.
Testfälle
Das Format ist <input> = <output>
.
ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false
ACTG = false
Antworten:
05AB1E ,
107 BytesCode:
Erläuterung:
Um zu überprüfen, ob es sich bei einer Zeichenfolge um ein Palindrom handelt, müssen wir nur die Eingabe mit der Eingabe überprüfen, mit
at
vertauschen undcg
vertauschen und sie dann umkehren. Das werden wir also tun. Wir schieben die Eingabe und die Eingabe mitÂ
(Bifurkate) umgekehrt . Jetzt kommt ein schwieriger Teil.'š×
ist die komprimierte Version fürcreating
. Wenn wir es umkehren, können Sie sehen, warum es im Code ist:Dies wird zum Transliterieren der umgekehrten Eingabe verwendet. Die Transliteration erfolgt mit
‡
. Danach prüfen wir nur, ob die Eingabe und die transliterierte EingabeQ
tatsächlich sind, und geben diesen Wert aus. So sieht der Stack für die Eingabe ausactg
:Welches kann auch mit dem Debug-Flag gesehen werden ( Versuchen Sie es hier ).
Verwendet CP-1252- Codierung. Probieren Sie es online! .
quelle
Gelee , 9 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
lambda s:
. Das ist fast die vollständige Lösung!Python 2,
564544 Bytesquelle
lambda s:s==s[::-1].translate("TCG_A"*99)
arbeitet in Python 3Perl, 27 Bytes
Beinhaltet +2 für
-lp
Geben Sie auf STDIN eine Eingabe ein, und geben Sie 1 oder nichts aus:
dnapalin.pl
:Ersetzen Sie
$_=
durch$_+=
, um0
für den falschen Fall leer zu werdenquelle
Pyth - 10 Bytes
Probieren Sie es hier online aus .
Dies wären 9 Bytes nach der Fehlerbehebung, wodurch es nicht konkurriert: Probieren Sie es hier online aus .
quelle
Retina ,
3433 BytesProbieren Sie es online!(Leicht modifiziert, um alle Testfälle gleichzeitig auszuführen.)
Erläuterung
Duplizieren Sie die Eingabe, indem Sie das Ende der Zeichenfolge abgleichen und ein
;
gefolgt von der gesamten Eingabe einfügen .Ordnen Sie nur die zweite Hälfte der Eingabe zu
;.+
und ersetzen Sie Paare durch eine Transliteration. Bezüglich der ZielmengeRo
:o
Bezieht sich auf die andere Menge, dieo
durch ersetzt wirdACGT
. AberR
kehrt diese Menge um, so dass die beiden Mengen tatsächlich sind:Wenn es sich bei der Eingabe um ein DNA-Palindrom handelt, folgt auf die Eingabe die Umkehrung (getrennt durch
;
).+
Entfernen Sie wiederholt ( ) ein Paar identischer Zeichen um das;
. Dies wird entweder fortgesetzt, bis nur noch das;
übrig ist oder bis die beiden Zeichen um das;
nicht mehr identisch sind, was bedeutet, dass die Zeichenfolgen nicht umgekehrt sind.Überprüfen Sie, ob das erste Zeichen
;
und drucken0
oder1
entsprechend.quelle
JavaScript (ES6), 59 Byte
Das Beste, was ich ohne Regexp machen konnte, waren 62 Bytes:
quelle
Rubin, 35
Ich habe andere Wege ausprobiert, aber der naheliegende war der kürzeste:
im Testprogramm
quelle
->s{s.==s.reverse.tr'ACGT','TGCA'}
ist ein Byte kürzer.
ist. Der Code sieht ohne ihn für mich besser aus, aber er ist erforderlich, damit er ausgeführt werden kann. Ist es irgendwo dokumentiert?==
eher um eine Methode als um einen Operator handelt, aber die Suche nach Symbolen ist unmöglich.Haskell,
48-45BytesAnwendungsbeispiel:
(==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"
->True
.Eine nicht pointfree Version ist
Edit: @Mathias Dolidon sparte 3 Bytes. Vielen Dank!
quelle
cycle "TCG_A"
. :)Netzhaut, 52 Bytes
quelle
Julia,
4738 BytesDies ist eine anonyme Funktion, die a akzeptiert
Char
Array und einen Booleschen Wert zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.Dabei wird der Algorithmus von Dennis verwendet, der kürzer ist als die naive Lösung. Wir erhalten den Rest jedes Codepunkts geteilt durch 8, addieren diesen zu sich selbst umgekehrt, erhalten die Restwerte aus der Division durch 5 und prüfen, ob alle 0 sind. Der letzte Schritt wird mit
⊆
der Infix-Version von ausgeführtissubset
, die beide Argumente nach wirftSet
vor der Prüfung. Dies bedeutet, dass[0,0,0]
eine Teilmenge von deklariert wird0
, since wirdSet([0,0,0]) == Set(0)
. Dies ist kürzer als eine explizite Prüfung gegen 0.Probieren Sie es online!
9 Bytes gespart dank Dennis!
quelle
Jolf, 15 Bytes
Versuch es!
Erläuterung:
quelle
Jolf, 16 Bytes
Probieren Sie es hier aus!
Erläuterung
quelle
Eigentlich 19 Bytes
Dies verwendet Dennis 'Algorithmus .
Probieren Sie es online!
Erläuterung:
quelle
Oracle SQL 11.2, 68 Byte
quelle
Julia 0,4, 22 Bytes
Die Zeichenfolge enthält die Steuerzeichen EOT (4) und NAK (21). Die Eingabe muss in Form eines Zeichenarrays erfolgen.
Dieser Ansatz XORs die Zeichen der Eingabe mit den entsprechenden Zeichen in der umgekehrten Eingabe. Für gültige Paarungen ergeben sich die Zeichen EOT oder NAK. Das Testen auf Aufnahme in die Zeichenfolge dieser Zeichen ergibt den gewünschten Booleschen Wert.
Probieren Sie es online!
quelle
C 71
2 Bytes von Dennis gespeichert. Zusätzliche 2 Bytes werden durch Anpassung für die Eingabe in Kleinbuchstaben gespart: Konstanten
37
und21
werden zu5
und überarbeitet2
.C 75
1 Byte gespeichert: Die Klammer wurde entfernt, indem das Produkt der beiden ASCII-Codes mod 37 verwendet wurde. Die gültigen Paare werden mit 21 bewertet. Es wird die Eingabe in Großbuchstaben vorausgesetzt.
C 76
Verwendet die Tatsache, dass sich die ASCII-Codes der gültigen Paare zu 138 oder 149 summieren. Wenn Mod 11 verwendet wird, sind dies die einzigen Paare, die sich zu 6 summieren. Nimmt eine Eingabe in Großbuchstaben an.
im Testprogramm ungolfed
quelle
r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%37^21;return!r;}
spart ein paar Bytes.!=
>^
mich. Ich habe eine weitere 2 reduziert, indem ich auf Kleinbuchstaben umgestellt habe: Beide magischen Zahlen sind jetzt einstellig.Faktor 72 Bytes
Leider kann mir Regex hier nicht weiterhelfen.
Rückwärts, Nachschlagetabelle, vergleiche gleich.
quelle
Bash + Coreutils,
4332 BytesTests:
quelle
J - 21 Bytes
Basierend auf Dennis 'Methode
Verwendung
Erläuterung
quelle
Labyrinth , 42 Bytes
Beendet mit einem Division-durch-Null-Fehler (Fehlermeldung bei STDERR).
Probieren Sie es online!
Das Layout fühlt sich wirklich ineffizient an, aber ich sehe gerade keinen Weg, es zu spielen.
Erläuterung
Diese Lösung basiert auf Dennis 'arithmetischem Trick: Nehmen Sie alle Zeichencodes modulo
8
, fügen Sie ein Paar von beiden Enden hinzu und stellen Sie sicher, dass es durch teilbar ist5
.Labyrinth-Grundierung:
Der Code beginnt mit einer kleinen 2x2-Schleife im Uhrzeigersinn, die alle Eingangsmodule 8 liest:
Jetzt
;
wirft die-1
. Wir betreten eine weitere Schleife im Uhrzeigersinn, die den oberen Teil des Hauptstapels (dh das letzte Zeichen) nach unten bewegt:Jetzt gibt es ein kurzes lineares Bit:
Die IP befindet sich jetzt an einer Kreuzung, die als Verzweigung dient, um die Teilbarkeit durch 5 zu testen. Wenn das Ergebnis des Modulos nicht Null ist, wissen wir, dass die Eingabe kein Watson-Crick-Palindrom ist, und wenden uns nach Osten:
Andernfalls müssen wir den Rest der Eingabe überprüfen, damit die IP weiter nach Süden geht. Der
{
zieht über den unteren Rand der verbleibenden Eingabe. Wenn die Eingabe erschöpft ist, ist dies a0
(von der Unterseite von aux ), und die IP bewegt sich weiter nach Süden:Andernfalls müssen mehr Zeichen in der Zeichenfolge überprüft werden. Die IP dreht sich nach Westen und bewegt sich in die nächste (im Uhrzeigersinn) 2x2-Schleife, die größtenteils aus No-Ops besteht:
Nach dieser Schleife haben wir die Eingabe wieder auf dem Hauptstapel, mit Ausnahme des ersten und letzten Zeichens und mit einer Null oben. Die
;
wirft die0
und dann=
die Stapeloberseiten, aber dies dient nur dazu, das erste=
in der Schleife abzubrechen , da wir die Schleife jetzt an einer anderen Stelle betreten. Spülen und wiederholen.quelle
sed,
6761 bytes(67 Bytes)
Prüfung
Ausgabe
Durch die Verwendung von erweiterten regulären Ausdrücken kann die Byteanzahl auf 61 reduziert werden.
quelle
C #, 65 Bytes
.NET hat manchmal ziemlich lange Framework-Methodennamen, was nicht unbedingt das beste Code-Golf-Framework darstellt. In diesem Fall bestehen die Namen der Framework-Methoden aus 33 von 90 Zeichen. :)
Basierend auf dem Modulus-Trick von einer anderen Stelle im Thread:
Wiegt jetzt 67 Zeichen, wovon 13 Methodennamen sind.
Eine weitere kleine Optimierung, um unglaubliche 2 Zeichen zu entfernen:
65 davon sind Framework-Namen.
Bearbeiten: Weglassen von einigen der begrenzten "Boilerplate" aus der Lösung und Hinzufügen von ein paar Bedingungen lässt uns mit dem Ausdruck
Was genau dann 0 ergibt, wenn der String s eine gültige Antwort ist. Wie cat betont, kann "bool F (string s) =>" tatsächlich durch "s =>" ersetzt werden, wenn im Code klar ist
Func<string,bool>
, dass der Ausdruck a ist , d. H. ordnet einen String einem Booleschen Wert zu.quelle
!s.Zip...
stattdessen tuns.Zip...==0
? (Oder können Sie es!
nicht in C # einfügen?) Auch wenn Sie es nicht boolesch negieren können, können Sie in Ihrer Antwort jede Art von Inversion auslassen und angeben, dass dies <dieses Ding> für falsch und <dieses andere Deterministische zurückgibt. klar erkennbare sache> für wahrheit.REXX 37
quelle
R 101 Bytes
Testfälle
quelle
strsplit(x,"")[[1]]
ist 3 Bytes kürzer alsunlist(strsplit(x,""))
und hier äquivalent, dax
es sich immer um eine einzelne Zeichenfolge handelt.Oktave, 52 Bytes
Nach Denis 'Trick ... nimm die ASCII-Werte Mod 8, drehe sie um und addiere sie; Wenn jede Summe ein Vielfaches von fünf ist, sind Sie golden.
quelle
f=
Zuordnung auch weglassen. unbenannte Funktionen sind in Ordnung.Clojure / ClojureScript, 49 Zeichen
Arbeitet mit Streichern. Wenn die Anforderungen gelockert werden, um Listen zuzulassen, kann ich die abnehmen
(list* )
und 7 Zeichen sparen.quelle
R, 70 Bytes
Verwendung:
quelle
C 71 Bytes
Erfordert ASCII-Codes für die relevanten Zeichen, akzeptiert jedoch Eingaben in Groß-, Klein- oder Mischbuchstaben.
Dieser Code verwaltet zwei Zeiger
s
undp
durchläuft die Zeichenfolge in entgegengesetzte Richtungen. Bei jedem Schritt vergleichen wir die entsprechenden Zeichen, Einstellungb
true, wenn sie nicht übereinstimmen. Der Abgleich basiert auf der XOR-Verknüpfung der Zeichenwerte:Wir können in der obigen Tabelle sehen, dass wir Erfolg
xx10x
und Misserfolg für irgendetwas anderes aufzeichnen wollen , also XOR mit00100
(vier) und Maske mit00110
(sechs), um Null für zu erhaltenAT
oder zu erhaltenCG
und andernfalls ungleich Null zu erhalten. Schließlich geben wir true zurück, wenn alle Paare ein Null-Ergebnis angesammelt habenb
, andernfalls false.Testprogramm:
quelle
𝔼𝕊𝕄𝕚𝕟 13 Zeichen / 17 Bytes
Try it here (Firefox only).
Erläuterung
Transkribieren Sie die Eingabe von
ACGT
bisTGCA
und überprüfen Sie, ob die resultierende Zeichenfolge ein Palindrom ist.quelle