遺伝子交差アルゴリズムの実行


16

あなたの仕事は、2つの遺伝子配列と「クロスオーバーポイント」の配列を入力として受け入れ、指定されたクロスオーバーから生じる遺伝子配列を返すことです。

これが意味するのは、シーケンス[A, A, A, A, A, A, A]、および[Z, Z, Z, Z, Z, Z, Z]、およびのクロスオーバーポイントがある2とし5ます。結果のシーケンスは[A, A, Z, Z, Z, A, A]次のとおりです。

クロスヒア:VV
インデックス:0 1 2 3 4 5 6

遺伝子1:AAAAAAA
遺伝子2:ZZZZZZZ

結果:AAZZZAA
              ^ ^

ここではわかりやすくするために文字を使用していますが、実際の課題では遺伝子に数字を使用しています。

結果は、クロスオーバーポイントに到達するまで最初のシーケンスであり、次に別のクロスオーバーポイントに到達するまで2番目のシーケンスから結果が取得され、次にクロスオーバーポイントに到達するまで最初のシーケンスから結果が取得されます...

入力:

  • 入力は、任意の合理的な形式にすることができます。2つのシーケンスは、ポイントを2番目の引数とするペアにすることができます。3つすべては、個別の引数、単一のトリプレット、(genes 1, genes 2, cross-points)名前付きキーを持つマップ...

  • クロスポイントは常に整然としており、常にインバウンドになります。重複するポイントはありませんが、クロスオーバーポイントのリストは空の場合があります。

  • 遺伝子配列は常に同じ長さで、空ではありません。

  • インデックスは、0または1ベースにすることができます。

  • 遺伝子は常に0〜255の範囲の数値になります。

  • どの引数が「genes 1」または「genes 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に変更しました。それがより明確であることを願っています。
発がん性

回答:


1

ゼリー12 10バイト

ṁ⁹L‘¤ḣ"ḷ"/

オンラインでお試しください!

引数1:seq1、seq2
引数2:クロスポイント(0インデックス付き)


理由がありました...これはテストケースの1つでは機能しません!
ジョナサンアラン

または、他のシナリオで失敗した
ジョナサン・アラン

;⁹ZL‘¤Ṭ+\ịŒDḢ必要なもののように見える:(
ジョナサンアラン

@JonathanAllan実際に、あなたが提案したものとはまったく異なる12バイトのバージョンを見つけることができました。:)
エリック・ザ・アウトゴルファー

@JonathanAllan ...そして、リンクと別のテストケースの両方で確認した、まったく異なる10バイトバージョンを発見しました(リラックス、0ベースのインデックス作成に変更することを忘れませんでした)。:D
エリック・ザ・アウトゴルファー

4

Haskell、58 53 51 45バイト

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

2つの遺伝子配列はリストのペアとして、クロスポイントは2番目の引数として使用されます。

オンラインでお試しください!

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

JavaScript(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ありがとう!私は愚かにも3番目の変数を追加してx [2]のポインターを追跡しようとしましたが、この最適化を見落としていました。
アーナウルド

3

APL(Dyalog 16.0)、26バイト

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

オンラインでお試しください!

入力はac、そしてbです。c1インデックス付けされています。

どうやって?

a←⎕-を取得ます。

0⍴⍨≢0-sの配列をその長さで作成します。

1@⎕⊢-cを取り、インデックス0のsを1sに変更します。

d←-dに割り当てます。

⊂≠\d-展開Dを用いてXOR(選択シーケンスを作成する0ため、ためB)、及び囲みます。1

(~,⊢)-dとその逆を取ります。

a⎕×-及び多重それぞれ入力とBと。

+/-要素の各ペアを合計し sでa s、0sでb sを1求めます。


⊢0⍴⍨≢-> ≠⍨tip
ngn

私は仕事にそれを得ることができない@ngn [ショ ]
ウリエル

,入力に前の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. 引数の長さでゼロのリストを作成します

   I.6
0 0 0 0 0 0

1 x}で示される指標で1にrigth引数(ゼロのリスト)の項目を変更x(点上CORSのリスト)

   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

Pythonの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:]

オンラインでお試しください!

ジョナサンフレッチから-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])が決して間違っているとは限りません。
ジョナサンフレッチ

1

ゼリー、13 バイト

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

左側の(1-indexed)クロスオーバーポイントを受け入れるダイアディックリンクと、結果のリストを返す右側の2つのシーケンスのリスト。

オンラインでお試しください!

どうやって?

ṬœṗЀż/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
ジョナサン・アラン

:2要素リストへのインデックス付けには何の役にも立たない。ż/:複雑なことは何の役にも立たず、とにかく大きなトラックでひどく平らになります!
エリックアウトゴルファー

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-Prolog、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(clang)、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.