ใช้อัลกอริธึมของยีนแบบไขว้


16

งานของคุณคือการยอมรับการป้อนข้อมูลลำดับของยีนที่สองและลำดับของ "ข้ามจุด" และส่งกลับลำดับของยีนที่เป็นผลมาจากการข้ามครอสที่ระบุ

สิ่งที่ผมหมายถึงนี้คือว่าคุณมีลำดับ[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
              ^ ^

โปรดทราบว่าในขณะที่ฉันกำลังใช้ตัวอักษรที่นี่เพื่อความชัดเจนความท้าทายที่แท้จริงใช้ตัวเลขสำหรับยีน

ผลลัพธ์คือลำดับแรกจนกระทั่งพบจุดข้ามจากนั้นผลลัพธ์จะเริ่มจากลำดับที่สองจนกระทั่งพบจุดข้ามอีกจุดจากนั้นผลลัพธ์จะเริ่มจากลำดับแรกจนกระทั่งพบจุดตัดเหนือ ...

การป้อนข้อมูล:

  • การป้อนข้อมูลอาจเป็นรูปแบบที่เหมาะสม ทั้งสองลำดับสามารถเป็นคู่โดยมีคะแนนเป็นอาร์กิวเมนต์ที่สองทั้งสามสามารถแยกอาร์กิวเมนต์อาร์กิวเมนต์แฝดของ(genes 1, genes 2, cross-points)แผนที่ที่มีชื่อคีย์ ...

  • จุดไขว้จะเป็นระเบียบและจะอยู่ในขอบเขตเสมอ จะไม่มีคะแนนซ้ำกัน แต่รายการข้ามจุดอาจว่างเปล่า

  • ลำดับของยีนจะมีความยาวเท่ากันเสมอและจะไม่ว่างเปล่า

  • ดัชนีสามารถเป็น 0 หรือ 1

  • ยีนจะเป็นตัวเลขในช่วง 0-255 เสมอ

  • ไม่สำคัญว่าการโต้แย้งแบบใดคือ "ยีน 1" หรือ "ยีน 2" ในกรณีที่ไม่มีการข้ามจุดผลลัพธ์อาจเป็นได้ทั้ง "ยีน 1" หรือ "ยีน 2"


เอาท์พุต

  • เอาต์พุตอาจเป็นรูปแบบที่สมเหตุสมผลซึ่งไม่คลุมเครือ มันสามารถเป็นอาร์เรย์ / รายการของตัวเลขอาร์เรย์ของตัวเลขสตริงที่คั่นสตริงที่ตัวเลข (ตัวละครที่ไม่ใช่ตัวเลขบางตัวต้องแยกตัวเลข) ...

  • สามารถส่งคืนหรือพิมพ์ไปยัง std-out ได้


คอมเมนต์สามารถโดยโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ


กรณีทดสอบ(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]

นี่คือรหัสกอล์ฟ


ตัวอย่างการทำงานของคุณจะชัดเจนขึ้นเล็กน้อยหากดัชนีครอสโอเวอร์ยังไม่มีองค์ประกอบในลำดับ
Shaggy

1
แก้ไขแล้ว. เปลี่ยนเป็น A's และ Z's หวังว่าชัดเจน
Carcigenicate

คำตอบ:


1

เจลลี่ , 12 10 ไบต์

ṁ⁹L‘¤ḣ"ḷ"/

ลองออนไลน์!

อาร์กิวเมนต์ 1: seq1, seq2
อาร์กิวเมนต์ 2: จุดข้าม (ดัชนี 0)


มีเหตุผลเป็น ... นี้ไม่ได้ทำงานให้กับหนึ่งในกรณีการทดสอบ !
Jonathan Allan

ล้มเหลวในสถานการณ์อื่น ๆเช่น
Jonathan Allan

ดูเหมือนว่า;⁹ZL‘¤Ṭ+\ịŒDḢต้องมีสิ่งที่ต้องการ :(
Jonathan Allan

@JanathanAllan จริง ๆ แล้วฉันสามารถหารุ่น 12 ไบต์ค่อนข้างแตกต่างจากที่คุณแนะนำ :)
Erik the Outgolfer

@JanathanAllan ... และจากนั้นฉันค้นพบเวอร์ชัน 10 ไบต์ที่แตกต่างกันอย่างสิ้นเชิงตรวจสอบกับลิงก์ของคุณและกรณีทดสอบอื่น (ผ่อนคลายฉันจำได้ว่าเปลี่ยนเป็นดัชนีแบบ 0) : D
Erik the Outgolfer

4

Haskell, 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

JavaScript (ES6), 47 45 ไบต์

บันทึก 2 ไบต์ด้วย @ETHproductions

รับอินพุตเป็น triplet [a, b, c]โดยที่aและbเป็นลำดับของยีนและ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]อย่างโง่ ๆแต่มองข้ามการเพิ่มประสิทธิภาพนี้
Arnauld

3

APL (Dyalog 16.0) , 26 ไบต์

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

ลองออนไลน์!

การป้อนข้อมูลเป็น, แล้วข cถูกทำดัชนี1

อย่างไร?

a←⎕- รับ

0⍴⍨≢- สร้างอาร์เรย์ของ0s ที่ความยาว

1@⎕⊢- รับcและเปลี่ยน0s เป็น1s บนดัชนี

d←- มอบหมายให้d d

⊂≠\d- ขยายdด้วยxorเพื่อสร้างลำดับการเลือก ( 0สำหรับa , 1สำหรับb ) และล้อมรอบ

(~,⊢)- รับdและอินเวอร์ส

a⎕×- และคูณตามลำดับป้อนและ

+/- สรุปองค์ประกอบแต่ละคู่โดยให้ค่าaกับ0s และb s บน1s


⊢0⍴⍨≢-> ≠⍨( เคล็ดลับ )
ก.ย.

@ngn ฉันไม่สามารถทำงานได้[tio ]
Uriel

คุณต้องมี,เวกเตอร์ 1 องค์ประกอบก่อนหน้าในอินพุต
ngn



2

J , 24 ไบต์

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

ลองออนไลน์!

ฉันไม่นับf=:ตัวอักษรเพราะมันใช้ได้ดีพอ ๆ กับฟังก์ชั่นนิรนาม (ดังที่แสดงในตัวอย่าง TIO)

หมายเหตุ: มันใช้ไม่ได้กับรายการกากบาทที่ว่างเปล่า!

Oneliner ที่ชัดเจนxเป็นอาร์กิวเมนต์ด้านซ้าย - รายการของการข้ามจุดyเป็นอาร์กิวเมนต์ที่ถูกต้องเป็นตารางสองแถวของลำดับ

คำอธิบาย:

4 :' ... ' - คำกริยา dyadic

(...)}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}เปลี่ยนรายการของอาร์กิวเมนต์ rigth (รายการศูนย์) เป็น 1 ที่ดัชนีที่ระบุโดย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 ไบต์จาก Jonathan Frech

คำอธิบาย:

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

ลิงก์ dyadic ยอมรับจุดครอสโอเวอร์ (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 องค์ประกอบนั้นไร้ประโยชน์อะไร ż/: วิธีการที่ไร้ประโยชน์จากความยุ่งยากมันก็ถูกแบนอย่างทารุณโดยรถบรรทุกขนาดใหญ่!
Erik the Outgolfer

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

อีกทางเลือกหนึ่งอาจจะเป็น subsituted สำหรับการพิมพ์ผลเป็นสตริง ลองออนไลน์!


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 (เสียงดังกราว) , 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.