জিন ক্রসওভার অ্যালগরিদম চলছে


16

আপনার কাজটি হ'ল ইনপুট দুটি জিন সিকোয়েন্স এবং "ক্রস ওভার পয়েন্টস" এর একটি অনুক্রম হিসাবে গ্রহণ করা এবং জিন ক্রমটি প্রত্যাবর্তিত ক্রস ওভারগুলি থেকে ফিরে আসা।

আমি কি এই দ্বারা মানে, আপনি সিকোয়েন্স বলার হয় [A, A, A, A, A, A, A]এবং [Z, Z, Z, Z, Z, Z, Z], এবং পয়েন্ট পার 2এবং 5। ফলস্বরূপ ক্রমটি হবে [A, A, Z, Z, Z, A, A], কারণ:

এখানে ক্রস করুন: ভিভি
সূচকগুলি: 0 1 2 3 4 5 6

জিন 1: এএএএএএএএএ
জিনস 2: জেডজেডজেডজেডজেড

ফলাফল: এএজেডজেডএএ
              ^ ^

মনে রাখবেন যে আমি এখানে বর্ণের জন্য স্বচ্ছতার জন্য ব্যবহার করছি, আসল চ্যালেঞ্জটি জিনের জন্য সংখ্যা ব্যবহার করে।

ক্রস ওভার পয়েন্ট না আসা পর্যন্ত ফলাফলটি প্রথম ক্রম হয়, তারপরে ফলটি দ্বিতীয় ক্রম থেকে অন্য ক্রস ওভার পয়েন্ট না হওয়া পর্যন্ত লাগে, ফলস প্রথম ক্রম থেকে একটি ক্রস ওভার পয়েন্ট না হওয়া পর্যন্ত লাগে ...

ইনপুট:

  • ইনপুট যে কোনও যুক্তিসঙ্গত ফর্ম হতে পারে। দুটি ক্রম দুটি যুক্ত হতে পারে, দ্বিতীয় যুক্তি হিসাবে পয়েন্টগুলি সহ, তিনটিই আলাদা যুক্তি, একক ট্রিপল (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
সংশোধন করা হয়েছে। এটি এ এবং জেড এর মধ্যে পরিবর্তন করা হয়েছে। আশা করি এটা আরও পরিষ্কার হয়েছে।
কারসিজেনিকেট

উত্তর:


1

জেলি , 12 10 বাইট

ṁ⁹L‘¤ḣ"ḷ"/

এটি অনলাইন চেষ্টা করুন!

আর্গুমেন্ট 1: seq1, seq2
আর্গুমেন্ট 2: ক্রস পয়েন্ট (0- সূচকযুক্ত )


একটি কারণ ছিল ... এটি কোনও পরীক্ষার ক্ষেত্রে কাজ করে না !
জোনাথন অ্যালান

অন্যান্য পরিস্থিতিতে যেমন
জোনাথন অ্যালান

দেখে মনে হচ্ছে এমন ;⁹ZL‘¤Ṭ+\ịŒDḢকোনও কিছুর প্রয়োজন হবে :(
জোনাথন অ্যালান

@ জোনাথান অ্যালান আমি আসলে আপনার প্রস্তাবের চেয়ে 12-বাইট সংস্করণ খুঁজে পেতে পেরেছি। :)
এরিক আউটগল্ফার

@ জোনাথান অ্যালান ... এবং তারপরে আমি একটি সম্পূর্ণ ভিন্ন 10-বাইট সংস্করণ আবিষ্কার করেছি, আপনার লিঙ্কগুলি এবং অন্য একটি পরীক্ষার কেস উভয়ের সাথে চেক করা হয়েছে (শিথিল থাকুন, আমি 0-ভিত্তিক সূচকগুলিতে পরিবর্তনের কথা মনে করি না)। : ডি
এরিক দি আউটগল্ফার

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 বাইট

2 বাইট সংরক্ষিত হয়েছে @ ইথ প্রডাকশনগুলির জন্য ধন্যবাদ

একটি ট্রিপলেট [a, b, c] হিসাবে ইনপুট নেয় যেখানে a এবং b জিন সিকোয়েন্স হয় এবং সি 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++]কয়েকটি বাইট সংরক্ষণ করার মতো কিছু করতে পারেন ।
ETH প্রোডাকশনগুলি 25:58

@ ইথ প্রডাকশন ধন্যবাদ! আমি x [2] এ পয়েন্টারটির উপর নজর রাখতে বোকামি দিয়ে 3 য় পরিবর্তনশীল যুক্ত করার চেষ্টা করেছি তবে এই অপটিমাইজেশনটিকে উপেক্ষা করেছি।
আর্নৌল্ড

3

এপিএল (ডায়ালগ 16.0) , 26 বাইট

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

এটি অনলাইন চেষ্টা করুন!

ইনপুট হ'ল , সি , তারপর সি হয়1 ইন্ডেক্স।

কিভাবে?

a←⎕- পেতে একটি

0⍴⍨≢ - এর অ্যারে তৈরি করুন 0 এর দৈর্ঘ্যে ।

1@⎕⊢- নিতে এবং পরিবর্তন 0করার জন্য গুলি1 সূচকগুলিতে ।

d←- অর্পণ ডি

⊂≠\d- প্রসারিত সঙ্গে XOR নির্বাচন ক্রম (তৈরি করতে 0জন্য একটি , 1জন্য ), এবং ঘিরা।

(~,⊢)- নিতে d এবং এর বিপরীতমুখী ।

a⎕×- এবং সংখ্যাবৃদ্ধি যথাক্রমে ইনপুট সঙ্গে এবং একটি

+/- উপাদানের প্রতিটি জোড়া যোগফল, ফলনশীল একটি উপর গুলি 0s এবং উপর গুলি 1গুলি।


⊢0⍴⍨≢-> ≠⍨( টিপ )
এনজিএন

@ngn আমি এটি কাজ করতে পারছি না [tio ]
উরিয়েল

আপনার ,
ইনপুটটিতে



2

জে , 24 বাইট

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

এটি অনলাইন চেষ্টা করুন!

আমি f=:চরিত্রগুলি গণনা করি না , কারণ এটি একটি বেনাম ফাংশন হিসাবে সমানভাবে কাজ করে (যেমনটি একটি টিআইও নমুনায় প্রদর্শিত হয়েছে)

দ্রষ্টব্য: এটি ক্রস ওভার পয়েন্টের খালি তালিকার জন্য কাজ করে না!

একটি স্পষ্ট অনিয়েনার, xবাম আর্গুমেন্ট - ক্রস ওভার পয়েন্টের তালিকা,y ডান যুক্তি, ক্রমের দুটি সারি সারণী।

ব্যাখ্যা:

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}সূচিত সূচকগুলিতে দৃth় আর্গুমেন্টের আইটেমগুলি (জিরোগুলির তালিকা) 1 এ পরিবর্তন করে (পয়েন্টের উপরে কর্সের xতালিকা)

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

এটি অনলাইন চেষ্টা করুন!

-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-ইনডেক্সড) ক্রসওভার পয়েন্ট এবং ডানদিকে দুটি ক্রমের একটি তালিকা গ্রহণ করবে যা ফলাফলের তালিকাটি ফেরত দেয়।

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

ṬœṗЀż/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]

@ কারসিজেনিকেট - ধন্যবাদ আমি ঠিক জিজ্ঞাসা করার পরে লক্ষ্য করেছি: ডি
জোনাথন অ্যালান

: 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

এসডাব্লুআই-প্রোলগ, 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.

ব্যবহার: "জেনেস 1 / জেনেস 2 / ক্রসওভারপয়েন্টস / এক্স" কল করুন যেখানে "জেনেস 1", "জেনেস 2", "ক্রসওভারপয়েন্টস" বন্ধনী দ্বারা আবদ্ধ, কমা-বিচ্ছিন্ন তালিকা রয়েছে।


1

সি (ঝনঝন) , 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]

পাদদেশে ম্যাক্রো ক () টেস্ট-কেস এবং ফলাফলের সুন্দর-মুদ্রণ করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.