Ihre Aufgabe ist es, zwei Gensequenzen und eine Sequenz von "Crossover-Punkten" als Eingabe zu akzeptieren und die Gensequenz zurückzugeben, die sich aus den angegebenen Crossovers ergibt.
Damit meine ich, dass Sie die Sequenzen [A, A, A, A, A, A, A]
und [Z, Z, Z, Z, Z, Z, Z]
haben und Punkte von 2
und kreuzen 5
. Die resultierende Sequenz wäre [A, A, Z, Z, Z, A, A]
, weil:
Hier kreuzen: VV Indizes: 0 1 2 3 4 5 6 Gene 1: AAAAAAA Gene 2: ZZZZZZZ Ergebnis: AAZZZAA ^^
Beachten Sie, dass ich hier aus Gründen der Klarheit Buchstaben verwende, während die eigentliche Herausforderung Zahlen für Gene verwendet.
Das Ergebnis ist die erste Sequenz, bis ein Überkreuzungspunkt angetroffen wird. Dann wird das Ergebnis von der zweiten Sequenz übernommen, bis ein weiterer Überkreuzungspunkt angetroffen wird. Dann wird das Ergebnis von der ersten Sequenz übernommen, bis ein Überkreuzungspunkt angetroffen wird.
Eingang:
Die Eingabe kann in jeder vernünftigen Form erfolgen. Die zwei Sequenzen können ein Paar sein, mit den Punkten als zweitem Argument, alle drei können separate Argumente sein, ein einzelnes Triplett von
(genes 1, genes 2, cross-points)
, eine Karte mit benannten Schlüsseln ...Die Kreuzungspunkte werden immer in Ordnung sein und werden immer eingehend sein. Es gibt keine doppelten Punkte, aber die Liste der Überkreuzungspunkte kann leer sein.
Gensequenzen sind immer gleich lang und nicht leer.
Indizes können 0 oder 1 sein.
Gene sind immer Zahlen im Bereich von 0 bis 255.
Es spielt keine Rolle, welches Argument "Gene 1" oder "Gene 2" ist. Wenn keine Kreuzungspunkte vorhanden sind, kann das Ergebnis entweder vollständig "Gene 1" oder "Gene 2" sein.
Ausgabe
Die Ausgabe kann in jeder vernünftigen Form erfolgen, die nicht mehrdeutig ist. Es kann ein Array / eine Liste von Zahlen sein, ein Array von Zeichenfolgenummern, eine durch Trennzeichen getrennte Zeichenfolge von Zahlen (einige nicht numerische Zeichen müssen die Zahlen trennen) ...
Es kann zurückgegeben oder auf die Standardausgabe gedruckt werden.
Einträge können durch vollständige Programme oder Funktionen erfolgen.
Testfälle (genes 1, genes 2, cross points) => result
:
[0], [1], [0] => [1]
[0, 1], [9, 8], [1] => [0, 8]
[0, 2, 4, 6, 8, 0], [1, 3, 5, 7, 9, 1], [1, 3, 5] => [0, 3, 5, 6, 8, 1]
[1, 2, 3, 4], [5, 6, 7, 8], [] => [1, 2, 3, 4]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 2, 3, 6, 8] => [1, 1, 0, 1, 1, 1, 0, 0, 1, 1]
Das ist Code Golf.
quelle
Antworten:
Gelee ,
1210 BytesProbieren Sie es online!
Argument 1: seq1, seq2
Argument 2: Kreuzungspunkte (0-indiziert)
quelle
;⁹ZL‘¤Ṭ+\ịŒDḢ
wäre etwas erforderlich :(Haskell,
58535145 BytesDie beiden Gensequenzen werden als Listenpaar und die Kreuzungspunkte als zweites Argument verwendet.
Probieren Sie es online!
quelle
JavaScript (ES6),
47-45Byte2 Bytes gespart dank @ETHproductions
Wird als Triplett [a, b, c] eingegeben , wobei a und b die Gensequenzen und c die Liste der 0-indizierten Kreuzungspunkte sind.
Probieren Sie es online!
Kommentiert
quelle
x[(j+=x[2][j]==i)%2][i++]
ein paar Bytes sparen.APL (Dyalog 16.0) , 26 Bytes
Probieren Sie es online!
Eingabe ist a , c , dann b . c ist
1
indiziert.Wie?
a←⎕
- Holen Sie sich ein .0⍴⍨≢
- Array von0
s in seiner Länge erstellen .1@⎕⊢
- nimm c und ändere das0
s in1
s auf den Indizes.d←
- Zuordnen zu d .⊂≠\d
- Erweitern Sie d mit xoder , um die Auswahlsequenz (0
für a ,1
für b ) zu erstellen , und schließen Sie sie ein.(~,⊢)
- nimm d und seine Umkehrung.a⎕×
- und multiplizieren jeweils mit eingegebenen b und a .+/
- Summiere jedes Elementpaar und ergebe die a s auf0
s und b s auf1
s.quelle
⊢0⍴⍨≢
->≠⍨
( tip ),
Vorher-1-Element-Vektor in der EingabePython 2 , 43 Bytes
Probieren Sie es online!
Ausgabe durch Ändern des Arguments
a
. Stattdessen als Programm:50 Bytes
Probieren Sie es online!
quelle
Perl 5
-a
,4540 BytesGeben Sie die Eingabe in der Reihenfolge "Steuerung", "zweite Sequenz", "erste Sequenz" als separate Zeilen in STDIN ein
Probieren Sie es online!
quelle
J , 24 Bytes
Probieren Sie es online!
Ich zähle die
f=:
Zeichen nicht, weil es genauso gut funktioniert wie eine anonyme Funktion (wie in einem TIO-Beispiel gezeigt).Hinweis: Es funktioniert nicht bei einer leeren Liste von Überkreuzungspunkten!
Ein expliziter Einzeiler
x
ist das linke Argument - die Liste der Kreuzungspunkte,y
das rechte Argument, eine zweizeilige Tabelle der Folgen.Erläuterung:
4 :' ... '
- ein dyadisches Verb(...)}y
- Jedes Atom eines Operanden (...) wählt ein Atom aus den entsprechenden Positionen der Elemente von y aus#{.y
- Nimmt die erste Sequenz und findet ihre LängeI.
Erstellt eine Liste von Nullen mit der Länge des Arguments1 x}
Ändert die Elemente des rechten Arguments (eine Liste von Nullen) an den durchx
(die Liste der Kors über Punkten) angegebenen Indizes in 1.+/\
laufende Summen einer Liste2|
Modulo 2Gebaut:
quelle
R ,
8479 BytesProbieren Sie es online!
Übernimmt die Eingabe als Matrix aus 2 Spalten und a
vector
.quelle
Python 3,
6160 BytesProbieren Sie es online!
-1 Byte von Jonathan Frech
Erläuterung:
quelle
a[d:c[0]]+f(b,a,c[1:],c[0])
wird niemals falsch sein.Jelly , 13 Bytes
Ein dyadischer Link, der die (1-indizierten) Überkreuzungspunkte auf der linken Seite und eine Liste der beiden Sequenzen auf der rechten Seite akzeptiert, die die resultierende Liste zurückgibt.
Probieren Sie es online!
Wie?
quelle
Ḃ
: Was für eine nutzlose Sache für die Indizierung in eine Liste mit 2 Elementen.ż/
: Wie nutzlos von einer Komplikation, es wird sowieso grausam von einem großen Lastwagen abgeflacht!Holzkohle , 19 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt Eingaben als ein Paar von String-Gensequenzen und eine 0-indizierte Liste von Kreuzungspunkten auf. Erläuterung:
Alternativ
⭆
könnte auch ersetzt werdenE
, um das Ergebnis als String auszudrucken. Probieren Sie es online!quelle
SWI-Prolog, 78 Bytes
Verwendung: Rufen Sie "Genes1 / Genes2 / CrossoverPoints / X" auf, wobei "Genes1", "Genes2" und "CrossoverPoints" in eckigen Klammern stehende, durch Kommas getrennte Listen sind.
quelle
C (clang) , 79 Bytes
Probieren Sie es online!
Eingänge:
g[0]
ist Gensequenz 1,g[1]
ist Gensequenz 2,c
ist Kreuzungspunkte.l
ist Länge vong[0]
undg[1]
m
ist Länge vonc
Alle Array-Eingaben sind Arrays von Ganzzahlen mit 0-basiertem Index.
Ausgänge: Die
Ausgabe wird in gespeichert
g[0]
Das Makro a () in der Fußzeile druckt Testfälle und Ergebnisse hübsch aus
quelle