Su tarea es aceptar como entrada dos secuencias de genes y una secuencia de "puntos de cruce", y devolver la secuencia de genes que resulta de los cruces indicados.
Lo que quiero decir con esto es, digamos que tiene las secuencias [A, A, A, A, A, A, A]
y [Z, Z, Z, Z, Z, Z, Z]
, y cruce los puntos de 2
y 5
. La secuencia resultante sería [A, A, Z, Z, Z, A, A]
, porque:
Cruce aquí: VV Índices: 0 1 2 3 4 5 6 Genes 1: AAAAAAA Genes 2: ZZZZZZZ Resultado: AAZZZAA ^ ^
Tenga en cuenta que si bien estoy usando letras aquí para mayor claridad, el desafío real usa números para genes.
El resultado es la primera secuencia hasta que se encuentra un punto cruzado, luego el resultado toma de la segunda secuencia hasta que se encuentra otro punto cruzado, luego el resultado toma desde la primera secuencia hasta que se encuentra un punto cruzado ...
Entrada:
La entrada puede ser de cualquier forma razonable. Las dos secuencias pueden ser un par, con los puntos como el segundo argumento, los tres pueden ser argumentos separados, un solo triplete de
(genes 1, genes 2, cross-points)
, un mapa con teclas con nombre ...Los puntos cruzados siempre estarán en orden y siempre estarán dentro de los límites. No habrá puntos duplicados, pero la lista de puntos cruzados puede estar vacía.
Las secuencias de genes siempre tendrán la misma longitud y no estarán vacías.
Los índices pueden estar basados en 0 o 1.
Los genes siempre serán números en el rango 0-255.
No importa qué argumento sea "genes 1" o "genes 2". En el caso de que no haya puntos cruzados, el resultado puede ser completamente "genes 1" o "genes 2".
Salida
La salida puede ser cualquier forma razonable que no sea ambigua. Puede ser una matriz / lista de números, una matriz de números de cadena, una cadena de números delimitada (algunos caracteres no numéricos deben separar los números) ...
Se puede devolver o imprimir en la salida estándar.
Las entradas pueden por programas completos o funciones.
Casos de prueba (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]
Este es el código de golf.
fuente
Respuestas:
Jalea ,
1210 bytesPruébalo en línea!
Argumento 1: seq1, seq2
Argumento 2: puntos cruzados (0 indexado)
fuente
;⁹ZL‘¤Ṭ+\ịŒDḢ
que se requeriría algo así :(Haskell,
58535145 bytesLas dos secuencias de genes se toman como un par de listas y los puntos de cruce como un segundo argumento.
Pruébalo en línea!
fuente
JavaScript (ES6),
4745 bytesGuardado 2 bytes gracias a @ETHproductions
Toma la entrada como un triplete [a, b, c] donde a y b son las secuencias de genes y c es la lista de puntos cruzados indexados en 0.
Pruébalo en línea!
Comentado
fuente
x[(j+=x[2][j]==i)%2][i++]
guardar un par de bytes.APL (Dyalog 16.0) , 26 bytes
Pruébalo en línea!
La entrada es a , c , luego b . c es
1
indexado.¿Cómo?
a←⎕
- obtener un .0⍴⍨≢
- crear una matriz de0
s en su longitud.1@⎕⊢
- tome c y cambie la0
s a1
s en los índices.d←
- asignar a d .⊂≠\d
- expanda d con xor para crear la secuencia de selección (0
para a ,1
para b ) y encierre.(~,⊢)
- tome d y su inverso.a⎕×
- y multiplicar respectivamente con las entradas b y a .+/
- suma cada par de elementos, produciendo a s en0
s y b s en1
s.fuente
⊢0⍴⍨≢
->≠⍨
( punta ),
vector de 1 elemento antes en la entradaPython 2 , 43 bytes
Pruébalo en línea!
Salidas modificando el argumento
a
. En cambio, como un programa:50 bytes
Pruébalo en línea!
fuente
Perl 5
-a
,4540 bytesDé entrada en el orden "control", "segunda secuencia", "primera secuencia" como líneas separadas en STDIN
Pruébalo en línea!
fuente
J , 24 bytes
Pruébalo en línea!
No cuento el
f=:
caracteres, porque funciona igual de bien como una función anónima (como se demuestra en una muestra de TIO)Nota: ¡No funciona para la lista vacía de puntos cruzados!
Un
x
argumento explícito es el argumento izquierdo: la lista de puntos cruzados,y
es el argumento correcto, una tabla de dos filas de las secuencias.Explicación:
4 :' ... '
- un verbo diádico(...)}y
- Cada átomo de operando (...) selecciona un átomo de las posiciones correspondientes de los elementos de y#{.y
- toma la primera secuencia y encuentra su longitudI.
crea una lista de ceros con longitud del argumento1 x}
cambia los elementos del argumento derecho (una lista de ceros) a 1 en los índices indicados porx
(la lista de puntos sobre puntos)+/\
corriendo sumas de una lista2|
módulo 2Montado:
fuente
R ,
8479 bytesPruébalo en línea!
Toma datos como una matriz de 2 columnas y a
vector
.fuente
Python 3,
6160 bytesPruébalo en línea!
-1 byte de Jonathan Frech
Explicación:
fuente
a[d:c[0]]+f(b,a,c[1:],c[0])
eso nunca será falso.Jalea , 13 bytes
Un enlace diádico que acepta los puntos de cruce (indexados) a la izquierda y una lista de las dos secuencias a la derecha que devuelve la lista resultante.
Pruébalo en línea!
¿Cómo?
fuente
Ḃ
: Qué cosa inútil para indexar en una lista de 2 elementos.ż/
: ¡Qué inútil es una complicación, de todos modos es cruelmente aplastada por un gran camión!Carbón de leña , 19 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma datos como un par de secuencias de genes de cadena y una lista de puntos de cruce indexados en 0. Explicación:
Alternativamente,
⭆
podría ser sustituido paraE
imprimir el resultado como una cadena. Pruébalo en línea!fuente
SWI-Prolog, 78 bytes
Uso: llame a "Genes1 / Genes2 / CrossoverPoints / X" donde "Genes1", "Genes2", "CrossoverPoints" son listas entre comillas y separadas por comas.
fuente
C (clang) , 79 bytes
Pruébalo en línea!
Entradas:
g[0]
es la secuencia génica 1,g[1]
es la secuencia génica 2,c
es un punto de cruce.l
es longitudg[0]
yg[1]
m
es longitud dec
Todas las entradas de matriz son matrices de enteros con índice basado en 0.
Salidas:
salida se almacena en
g[0]
la macro a () en el pie de página hace una impresión bonita de los casos de prueba y el resultado
fuente