Sua tarefa é aceitar como entrada duas seqüências genéticas e uma sequência de "pontos de cruzamento" e retornar a sequência de genes resultante dos cruzamentos indicados.
O que quero dizer com isso é dizer que você tem as seqüências [A, A, A, A, A, A, A]
e [Z, Z, Z, Z, Z, Z, Z]
, e cruza os pontos de 2
e 5
. A sequência resultante seria [A, A, Z, Z, Z, A, A]
, porque:
Cruze aqui: VV Índices: 0 1 2 3 4 5 6 Genes 1: AAAAAAA Genes 2: ZZZZZZZ Resultado: AAZZZAA ^ ^
Observe que, enquanto uso letras aqui para maior clareza, o desafio real usa números para genes.
O resultado é a primeira sequência até que um ponto de cruzamento seja encontrado; o resultado leva da segunda sequência até que outro ponto de cruzamento seja encontrado; o resultado leva a partir da primeira sequência até que um ponto de cruzamento seja encontrado ...
Entrada:
A entrada pode ser de qualquer forma razoável. As duas sequências podem ser um par, com os pontos como segundo argumento, todos os três podem ser argumentos separados, um único trigêmeo de
(genes 1, genes 2, cross-points)
, um mapa com chaves nomeadas ...Os pontos cruzados estarão sempre em ordem e sempre estarão dentro dos limites. Não haverá pontos duplicados, mas a lista de pontos de cruzamento pode estar vazia.
As seqüências de genes sempre terão o mesmo comprimento e não serão vazias.
Os índices podem ser baseados em 0 ou 1.
Os genes sempre serão números no intervalo de 0 a 255.
Não importa qual argumento seja "genes 1" ou "genes 2". No caso de não haver pontos de cruzamento, o resultado pode ser inteiramente "genes 1" ou "genes 2".
Resultado
A saída pode ser de qualquer forma razoável que não seja ambígua. Pode ser uma matriz / lista de números, uma matriz de números de sequência, uma sequência de números delimitada (algum caractere não numérico deve separar os números) ...
Ele pode ser devolvido ou impresso na saída padrão.
As entradas podem por programas ou funções completos.
Casos de teste (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 é o Code Golf.
fonte
Respostas:
Gelatina ,
1210 bytesExperimente online!
Argumento 1: seq1, seq2
Argumento 2: pontos cruzados (indexado 0)
fonte
;⁹ZL‘¤Ṭ+\ịŒDḢ
seria necessário :(Haskell,
58535145 bytesAs duas seqüências gênicas são tomadas como um par de listas e os pontos cruzados como um segundo argumento.
Experimente online!
fonte
JavaScript (ES6),
4745 bytesEconomizou 2 bytes graças a @ETHproductions
Toma de entrada como um tripleto [a, b, c] , onde um e b são as sequências de genes e c é a lista de pontos de cruzamento 0-indexados.
Experimente online!
Comentado
fonte
x[(j+=x[2][j]==i)%2][i++]
salvar alguns bytes.APL (Dyalog 16.0) , 26 bytes
Experimente online!
A entrada é a , c e b . c é
1
indexado.Quão?
a←⎕
- pegue um .0⍴⍨≢
- crie uma matriz de0
s em seu comprimento.1@⎕⊢
- pegue c e mude0
s para1
s nos índices.d←
- atribuir a d .⊂≠\d
- expanda d com xor para criar a sequência de seleção (0
para a ,1
para b ) e inclua.(~,⊢)
- tome d e seu inverso.a⎕×
- e multiplique respectivamente com b e a inseridos .+/
- somar cada par de elementos, obtendo-se o um s em0
s e b s no1
s.fonte
⊢0⍴⍨≢
->≠⍨
( tip ),
vetor de 1 elemento anterior na entradaPython 2 , 43 bytes
Experimente online!
Saídas modificando o argumento
a
. Em vez disso, como um programa:50 bytes
Experimente online!
fonte
Perl 5
-a
,4540 bytesDê entrada na ordem "controle", "segunda sequência", "primeira sequência" como linhas separadas em STDIN
Experimente online!
fonte
J , 24 bytes
Experimente online!
Eu não conto os
f=:
caracteres, porque funciona igualmente bem como uma função anônima (como demonstrado em uma amostra TIO)Nota: Não funciona para uma lista vazia de pontos de passagem!
Um oneliner explícito
x
é o argumento da esquerda - a lista de pontos de cruzamento,y
é o argumento da direita, uma tabela de duas linhas das seqüências.Explicação:
4 :' ... '
- um verbo diádico(...)}y
- Cada átomo do operando (...) seleciona um átomo das posições correspondentes dos itens de y#{.y
- pega a primeira sequência e encontra seu comprimentoI.
cria uma lista de zeros com o comprimento do argumento1 x}
altera os itens do argumento rigth (uma lista de zeros) para 1 nos índices indicados porx
(a lista de cors sobre pontos)+/\
executando somas de uma lista2|
módulo 2Montado:
fonte
R ,
8479 bytesExperimente online!
Recebe entrada como uma matriz de 2 colunas e a
vector
.fonte
Python 3,
6160 bytesExperimente online!
-1 byte de Jonathan Frech
Explicação:
fonte
a[d:c[0]]+f(b,a,c[1:],c[0])
nunca será falso.Gelatina , 13 bytes
Um link diádico que aceita os pontos de cruzamento (indexados em 1) à esquerda e uma lista das duas seqüências à direita que retorna a lista resultante.
Experimente online!
Quão?
fonte
Ḃ
: Que coisa inútil para indexar em uma lista de 2 elementos.ż/
: Como é inútil uma complicação, ela é cruelmente achatada por um caminhão grande de qualquer maneira!Carvão , 19 bytes
Experimente online! Link é a versão detalhada do código. Recebe entrada como um par de seqüências de genes de cadeia e uma lista indexada de 0 de pontos de cruzamento. Explicação:
Como alternativa,
⭆
pode ser substituído paraE
imprimir o resultado como uma sequência. Experimente online!fonte
SWI-Prolog, 78 bytes
Uso: chame "Genes1 / Genes2 / CrossoverPoints / X" onde "Genes1", "Genes2", "CrossoverPoints" são listas entre colchetes e separadas por vírgula.
fonte
C (clang) , 79 bytes
Experimente online!
Entradas:
g[0]
é a sequência gênica 1,g[1]
é a seqüência gênica 2,c
é um ponto de cruzamento.l
é comprimento deg[0]
eg[1]
m
é comprimento dec
Todas as entradas da matriz são matrizes de números inteiros com índice baseado em 0.
Saídas: A
saída é armazenada em
g[0]
A macro a () no rodapé faz uma bonita impressão de casos de teste e resulta
fonte