유전자 크로스 오버 알고리즘 실행


16

당신의 임무는 입력으로 두 개의 유전자 서열과 "교차점"의 서열을 받아들이고, 표시된 교차점에서 발생하는 유전자 서열을 반환하는 것입니다.

내가이 의미하는 것은, 당신이 순서를 가지고 있다고한다 [A, A, A, A, A, A, A][Z, Z, Z, Z, Z, Z, Z], 그리고 포인트를 건너 25. 결과 시퀀스는[A, A, Z, Z, Z, A, A] 과 같습니다.

여기 교차 : VV
지수 : 012 34 5 6

유전자 1 : AAAAAAA
유전자 2 : ZZZZZZZ

결과 : AAZZZAA
              ^ ^

명확성을 위해 여기에 글자를 사용하고 있지만 실제 문제는 유전자에 숫자를 사용한다는 점에 유의하십시오.

교차점에 도달 할 때까지 결과는 첫 번째 시퀀스이고, 다른 교차점에 도달 할 때까지 결과는 두 번째 시퀀스에서 가져온 다음 교차점에 도달 할 때까지 첫 번째 시퀀스에서 결과를 가져옵니다.

입력:

  • 입력은 합리적인 형식 일 수 있습니다. 두 개의 시퀀스는 쌍이 될 수 있으며, 점은 두 번째 인수로, 세 개 모두 별도의 인수, 단일 삼중 항 (genes 1, genes 2, cross-points), 명명 된 키가있는 맵일 수 있습니다 .

  • 교차점은 항상 순서대로 있으며 항상 인바운드입니다. 중복 포인트는 없지만 교차 포인트 목록이 비어있을 수 있습니다.

  • 유전자 서열은 항상 길이가 같고 비어 있지 않습니다.

  • 인덱스는 0 또는 1을 기준으로 할 수 있습니다.

  • 유전자는 항상 0-255 범위의 숫자입니다.

  • 어떤 인수가 "유전자 1"또는 "유전자 2"인지는 중요하지 않습니다. 교차점이없는 경우 결과는 완전히 "유전자 1"또는 "유전자 2"일 수 있습니다.


산출

  • 모호하지 않은 합리적인 형식 일 수 있습니다. 그것은 배열 / 숫자 목록, 문자열 숫자 배열, 구분 된 숫자 문자열 (일부 숫자가 아닌 문자는 숫자를 구분해야 함) 일 수 있습니다 ...

  • 표준 출력으로 반환하거나 인쇄 할 수 있습니다.


전체 프로그램 또는 기능별로 항목을 작성할 수 있습니다.


테스트 사례 (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]

이것은 코드 골프입니다.


교차 인덱스가 시퀀스의 요소가 아니라면 실제 예제가 좀 더 명확 해집니다.
얽히고 설킨

1
결정된. A와 Z로 변경했습니다. 더 명확하길 바랍니다.
Carcigenicate

답변:


1

젤리 , 12 10 바이트

ṁ⁹L‘¤ḣ"ḷ"/

온라인으로 사용해보십시오!

인수 1 : seq1, seq2
인수 2 : 교차점 (0 인덱스)


이유가 있습니다 ... 테스트 사례 중 하나 에는 작동하지 않습니다 !
Jonathan Allan

또한, 다른 시나리오에서 실패
조나단 앨런

다음과 같이 ;⁹ZL‘¤Ṭ+\ịŒDḢ보일 것입니다 :(
Jonathan Allan

@JonathanAllan 실제로 12 바이트 버전을 제안한 것과 상당히 다릅니다. :)
Outgolfer Erik

@JonathanAllan ... 그리고 완전히 다른 10 바이트 버전을 발견하고 링크와 다른 테스트 사례를 모두 확인했습니다 (휴식, 0 기반 인덱싱으로 변경 한 것을 기억했습니다). : D
Outgolfer Erik

4

하스켈, 58 53 51 45 바이트

(fst.).foldl(\(a,b)p->(take p a++drop p b,a))

두 유전자 서열은 한 쌍의 목록으로, 교차점은 두 번째 인수로 사용됩니다.

온라인으로 사용해보십시오!

foldl           -- fold the pair of genes into the list of
                -- cross points and on each step
    \(a,b) p -> -- let the pair of genes be (a,b) and the next cross point 'p'
      (take p a++drop p b,a)  
                -- let 'b' the new first element of the pair, but
                --   drop the first 'p' elements and 
                --   prepend the first 'p' elements of 'a'
                -- let 'a' the new second element 
fst             -- when finished, return the first gene   

4

자바 스크립트 (ES6), 47 45 바이트

@ETHproductions 덕분에 2 바이트 절약

입력을 삼중 항 [a, b, c] 으로 취합니다 . 여기서 ab 는 유전자 서열이고 c 는 0- 인덱싱 된 교차점 목록입니다.

x=>x[i=j=0].map(_=>x[(j+=x[2][j]==i)&1][i++])

온라인으로 사용해보십시오!

댓글

x =>                    // given x = [ geneSeqA, geneSeqB, crossPoints ]
  x[i = j = 0]          // initialize i = gene sequence pointer and j = cross point pointer
  .map(_ =>             // for each value in the first gene sequence:
    x[(                 //   access x[]
      j += x[2][j] == i //     increment j if i is equal to the next cross point
    ) & 1]              //   access either x[0] or x[1] according to the parity of j
    [i++]               //   read gene at x[0][i] or x[1][i]; increment i
  )                     // end of map()

나는 당신 x[(j+=x[2][j]==i)%2][i++]이 몇 바이트를 절약하는 것과 같은 것을 할 수 있다고 생각합니다 .
ETHproductions

@ETHproductions 감사합니다! 어리석게 x [2] 의 포인터를 추적하기 위해 3 번째 변수를 추가하려고 했지만이 최적화를 간과했습니다.
Arnauld

3

APL (Dyalog 16.0) , 26 바이트

+/a⎕×(~,⊢)⊂≠\d1@⎕⊢0⍴⍨≢a←⎕

온라인으로 사용해보십시오!

입력 값은 a , c , b 입니다. c1색인됩니다.

어떻게?

a←⎕- 얻을 .

0⍴⍨≢- 0길이 의 s 배열을 만듭니다 .

1@⎕⊢- 인덱스에서 c를 취하고 0s를 1s로 변경하십시오 .

d←-d에 할당하십시오 .

⊂≠\d- 확장 (D)를 함께 XOR (선택 시퀀스를 생성하기 0위해 , 위한 B )을 둘러싼 다.1

(~,⊢)-d 와 그 역을 취하십시오 .

a⎕×입력 한 ba를 각각 곱 합니다 .

+/- 항복 요소들의 각 쌍의 합 S에서 S 및 B 의 S 들.01


⊢0⍴⍨≢-> ≠⍨( tip )
ngn

@ngn 작동시키지 못합니다 [tio ]
Uriel

,입력에 1- 요소 벡터 이전 이 필요
ngn



2

J , 24 바이트

4 :'(2|+/\1 x}I.#{.y)}y'

온라인으로 사용해보십시오!

f=:익명 함수와 동일하게 작동하기 때문에 문자를 세지 않습니다 (TIO 샘플에서 설명).

참고 : 빈 교차점 목록에는 작동하지 않습니다!

명시 적 oneliner x는 왼쪽 인수입니다. 교차점 목록은 y시퀀스의 2 행 테이블 인 오른쪽 인수입니다.

설명:

4 :' ... ' -이원 동사

(...)}y -피연산자의 각 원자 (...)는 y 항목의 해당 위치에서 원자를 선택합니다.

#{.y -첫 번째 순서를 취하고 길이를 찾습니다

    #{. 0 2 4 6 8 0,: 1 3 5 7 9 1
6

I. 인수 길이가 0 인리스트를 작성합니다.

   I.6
0 0 0 0 0 0

1 x}rigth 인수 (0의 목록)의 항목을 (표시된 x점수의 목록)으로 표시된 색인에서 1로 변경합니다.

   1(1 3 5)}I.6
0 1 0 1 0 1

+/\ 리스트의 누계

   +/\ 0 1 0 1 0 1
0 1 1 2 2 3

2| 모듈로 2

   2|+/\ 0 1 0 1 0 1
0 1 1 0 0 1

조립 :

    0 1 1 0 0 1 } 0 2 4 6 8 0 ,: 1 3 5 7 9 1
0 3 5 6 8 1


2

파이썬 3, 61 60 바이트

f=lambda a,b,c,d=0:c and a[d:c[0]]+f(b,a,c[1:],c[0])or a[d:]

온라인으로 사용해보십시오!

Jonathan Frech에서 -1 바이트

설명:

f=lambda a,b,c,d=0:c and a[d:c[0]]+f(b,a,c[1:],c[0])or a[d:]
f=lambda a,b,c,d=0:
 # recursive lambda: a and b are the two lists,
 # c is the crossovers, and d is where to start
                   c and
 # if there is at least one crossover left
 #  then
                         a[d:c[0]]
 #  return the items of the first list from the
 #  starting point up to the first crossover
                                  +f(b,a,c[1:],c[0])
 #  plus the result of the inverted lists with
 #  the remaining crossovers, starting where
 #  the first part left off
                                                    or
 # else
                                                       a[d:]
 #  the first list from the starting point to the end

1
가능한 60 바이트 ; a[d:c[0]]+f(b,a,c[1:],c[0])절대 거짓이 아니라고 가정합니다 .
Jonathan Frech

1

젤리 , 13 바이트

ṬœṗЀż/JḂị"ƊF

왼쪽의 (1 인덱스) 크로스 오버 포인트와 오른쪽의 두 시퀀스 목록을 허용하는 이진 링크는 결과 목록을 반환합니다.

온라인으로 사용해보십시오!

어떻게?

ṬœṗЀż/JḂị"ƊF - Link: list, C; list, S     e.g. [2,4,6]; [[0,2,4,6,8,0],[1,3,5,7,9,1]]
Ṭ             - untruth C                       [0,1,0,1,0,1]
   Ѐ         - map across S with:
 œṗ           -   partition at truthy indices   [[0],[2,4],[6,8],[0]]  /  [[1],[3,5],[7,9],[1]]
      /       - reduce with:
     ż        -   zip                           [[[0],[1]],[[2,4],[3,5]],[[6,8],[7,9]],[[0],[1]]]
           Ɗ  - last three links as a monad:
       J      -   range of length               [1,2,3,4]
        Ḃ     -   bit (modulo by 2)             [1,0,1,0]
          "   -   zip with:
         ị    -     index into                  [[0],[3,5],[6,8],[1]]
            F - flatten                         [0,3,5,6,8,1]

@Carcigenicate-방금 물어 보니 고마워 : D
Jonathan Allan

: 2- 요소 목록에 색인을 생성하는 데 쓸모없는 것. ż/: 어쨌든 합병증이 아무리 쓸모가 없더라도 어쨌든 큰 트럭으로 무너져 버립니다!
Outgolfer Erik

1

, 19 바이트

AθAηE§θ⁰§§θLΦ⊕κ№ηλκ

온라인으로 사용해보십시오!링크는 자세한 버전의 코드입니다. 입력을 한 쌍의 문자열 유전자 서열과 0- 인덱싱 된 교차점 목록으로 취합니다. 설명:

Aθ                  Input the pair of gene sequences into `q`
  Aη                Input the list of crossing points into `h`
    E§θ⁰            Loop over one of the gene sequences
              κ     Current index
             ⊕      Incremented
            Φ  №ηλ  Intersect implicit range with crossing points
           L        Take the length
         §θ         Cyclically index into the pair of gene sequences
        §         κ Take the appropriate element of that sequence
                    Implicitly output on separate lines

또는 결과를 문자열로 인쇄하기 위해 대체 할 수 있습니다 . 온라인으로 사용해보십시오!


1

SWI- 프롤로그, 78 바이트

A/B/[0|C]/D:-B/A/C/D. [H|A]/[_|B]/C/[H|D]:-maplist(succ,E,C),A/B/E/D. A/_/_/A.

사용법 : "Genes1 / Genes2 / CrossoverPoints / X"를 호출하십시오. 여기서 "Genes1", "Genes2", "CrossoverPoints"는 괄호로 묶고 쉼표로 구분 된 목록입니다.


1

C (클랑) , 79 바이트

*g[2],*c,l,m;f(i,j,k){for(i=j=k=0;i<l;g[0][i++]=g[k][i])m&&c[j]==i?k=!k,j++:0;}

온라인으로 사용해보십시오!

입력 :
g[0]유전자 순서 1,
g[1]유전자 순서 2,
c교차점입니다.
l의 길이 g[0]g[1]
m의 길이가 c
0 기반 인덱스 정수 배열 된 모든 배열 입력한다.

출력 :
출력은g[0]

바닥 글의 매크로 a ()는 테스트 사례 및 결과를 예쁘게 인쇄합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.