Watson-Crick palindromes


31

ปัญหา

สร้างฟังก์ชั่นที่สามารถตรวจสอบได้ว่าสาย DNA โดยพลการหรือไม่นั้นเป็น Palindrome ของ Watson-Crick ฟังก์ชั่นจะรับสาย DNA และเอาท์พุทเป็นค่าจริงหากสตริงนั้นเป็น Palatrome ของ Watson-Crick และเป็นค่าเท็จถ้าไม่ใช่ (จริงและเท็จยังสามารถแสดงเป็น 1 และ 0 ตามลำดับ)

สตริงดีเอ็นเออาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กทั้งหมดขึ้นอยู่กับความต้องการของคุณ

นอกจากนี้สตริง DNA จะไม่ว่างเปล่า

คำอธิบาย

สตริงดีเอ็นเอคือ palindrome ของ Watson-Crick เมื่อส่วนเติมเต็มของส่วนกลับมีค่าเท่ากับตัวมันเอง

ให้สายอักขระดีเอ็นเอก่อนอื่นแล้วเสริมอักขระแต่ละตัวตามฐานดีเอ็นเอ (A ↔ T และ C ↔ G) หากสตริงเดิมเท่ากับสตริงที่กลับด้านที่สมบูรณ์นั่นคือ Palatsrome ของ Watson-Crick

สำหรับข้อมูลเพิ่มเติมโปรดดูคำถามนี้ มันเป็นความท้าทายที่แตกต่างกันซึ่งคุณจะต้องค้นหาสตริงย่อยที่ยาวที่สุดของสตริงดีเอ็นเอโดยที่สตริงย่อยนั้นคือ Palindrome ของ Watson-Crick

เป้าหมาย

นี่คือรหัสกอล์ฟและรหัสที่สั้นที่สุดชนะ

กรณีทดสอบ

<input> = <output>รูปแบบคือ

ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false
ACTG = false


3
บางคนควรเขียนโปรแกรมในDNA #ซึ่งเป็น Palindrome ของ Watson-Crick : D (อาจเป็นไปไม่ได้)
mbomb007

หรือถ้าคุณต้องการ "คำว่าเป็นคำสั่งของ Watson – Crick palindrome หากมีคำสั่งที่ 2 ในกลุ่มฟรีในเครื่องกำเนิดไฟฟ้า 2 เครื่อง" (หรือในเครื่องกำเนิดไฟฟ้าn !
wchargin

(ฉันเดาทางเทคนิคว่า "สั่งไม่เกิน 2")
wchargin

1
@AndrasDeak ตามหนังสือวัตสันแฟรงคลินเห็นได้ชัดว่าเป็นหนามในด้านของพวกเขา เธอปฏิเสธที่จะมอบเอกซ์เรย์ซ้ำ ๆ เพื่อแสดงเกลียว (ตามที่ฉันจำได้) เพราะเธอปฏิเสธที่จะเชื่อ มันคุ้มค่าอ่านถ้าคุณมีความสนใจในการค้นพบในอัตราใด ๆ
Obsidian Phoenix

คำตอบ:


27

05AB1E , 10 7 ไบต์

รหัส:

Â'š×‡Q

คำอธิบาย:

ในการตรวจสอบว่าสตริงเป็น Palindrome หรือไม่เราแค่ต้องตรวจสอบอินพุตด้วยอินพุตโดยatสลับและcgสลับแล้วย้อนกลับ นั่นคือสิ่งที่เรากำลังจะทำ เราดันอินพุตและอินพุตกลับด้านโดยใช้Â(สองแฉก) ตอนนี้เป็นส่วนที่ยุ่งยาก เป็นรุ่นที่บีบอัด'š× creatingหากเรากลับรายการคุณสามารถดูสาเหตุที่อยู่ในรหัสได้:

CreATinG
|  ||  |
GniTAerC

สิ่งนี้จะถูกใช้เพื่อถอดเสียงอินพุตกลับด้าน การทับศัพท์จะทำด้วย หลังจากนั้นเราเพียงตรวจสอบว่าอินพุตและอินพุตที่ถอดเสียงนั้นเป็นQค่าจริงและพิมพ์ค่านั้น ดังนั้นนี่คือลักษณะของสแต็กสำหรับอินพุตactg:

          # ["actg", "gtca"]
 'š×       # ["actg", "gtca", "creating"]
    Â      # ["actg", "gtca", "creating", "gnitaerc"]
     ‡     # ["actg", "cagt"]
      Q    # [0]

ซึ่งสามารถเห็นได้ด้วยการตั้งค่าสถานะการดีบัก ( ลองที่นี่ )

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


4
เอ่อมากสร้างสรรค์ ...
Toby Speight

2
ภาษานี้มีคุณสมบัติที่เป็นระเบียบมาก
ไมล์

18

เยลลี่ขนาด 9 ไบต์

O%8µ+U5ḍP

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมดตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

O%8µ+U5ḍP  Main link. Argument: S (string)

O          Compute the code points of all characters.
 %8        Compute the residues of division by 8.
           This maps 'ACGT' to [1, 3, 7, 4].
   µ       Begin a new, monadic link. Argument: A (array of residues)
    +U     Add A and A reversed.
      5ḍ   Test the sums for divisibility by 5.
           Of the sums of all pairs of integers in [1, 3, 7, 4], only 1 + 4 = 5
           and 3 + 7 = 10 are divisible by 5, thus identifying the proper pairings.
        P  Take the product of the resulting Booleans.

4
ฉันคิดว่า Python ค่อนข้างใกล้เคียงกับการแข่งขันกับคำตอบนี้! เปรียบเทียบเก้าไบต์แรกของคำตอบของฉัน: lambda s:. เกือบจะเป็นทางออกเต็ม!
orlp

เดี๋ยวก่อนส่วน "ทำงานอย่างไร" ไม่ได้อธิบายวิธีการทำงานจริง ๆ ... ทำไมจึงเหลือ 8 และผลรวม 5? จดหมายเติมเต็มที่ไหน?
ZeroOne

@ ZeroOne ฉันได้อธิบายส่วนนั้นแล้ว
เดนนิส

โอ้ว้าว! นั่นคือความฉลาด :) ขอบคุณ!
ZeroOne


8

Perl, 27 ไบต์

รวมถึง +2 สำหรับ -lp

ให้อินพุตบน STDIN พิมพ์ 1 หรือไม่มีอะไร:

dnapalin.pl <<< ATCGCGAT

dnapalin.pl:

#!/usr/bin/perl -lp
$_=y/ATCG/TAGC/r=~reverse

แทนที่$_=ด้วย$_+=เพื่อรับ0แทนค่าว่างสำหรับกรณีเท็จ


7

Pyth - 10 ไบต์

qQ_XQ"ACGT

ลองมันออนไลน์ได้ที่นี่

นี้จะเป็น9 ไบต์หลังจากแก้ไขข้อผิดพลาดซึ่งทำให้มันไม่ใช่การแข่งขัน: ลองออนไลน์ได้ที่นี่


7

เรติน่า , 34 33 ไบต์

$
;$_
T`ACGT`Ro`;.+
+`(.);\1
;
^;

ลองออนไลน์!(แก้ไขเล็กน้อยเพื่อเรียกใช้กรณีทดสอบทั้งหมดในครั้งเดียว)

คำอธิบาย

$
;$_

ทำสำเนาอินพุตโดยจับคู่ส่วนท้ายของสตริงและแทรก;ตามด้วยอินพุตทั้งหมด

T`ACGT`Ro`;.+

จับคู่เฉพาะครึ่งหลังของอินพุตด้วย;.+และดำเนินการแทนที่คู่ด้วยการทับศัพท์ ในฐานะที่เป็นสำหรับการตั้งค่าเป้าหมายRo: oอ้างอิงอื่น ๆชุดที่จะถูกแทนที่ด้วยo ACGTแต่Rกลับชุดนี้ดังนั้นทั้งสองชุดเป็นจริง:

ACGT
TGCA

หากอินพุตเป็น DNA palindrome ตอนนี้เราจะมีอินพุตตามด้วยย้อนกลับ (คั่นด้วย;)

+`(.);\1
;

ซ้ำแล้วซ้ำอีก ( +) ;เอาคู่ของตัวละครที่เหมือนรอบที่ สิ่งนี้จะดำเนินต่อไปจนกระทั่งเหลือเพียง;หรือจนกว่าอักขระสองตัวที่อยู่รอบ ๆ;จะไม่เหมือนกันอีกต่อไปซึ่งหมายความว่าสตริงจะไม่กลับกัน

^;

ตรวจสอบว่าตัวอักษรตัวแรกเป็น;และพิมพ์0หรือ1ตาม


6

JavaScript (ES6), 59 ไบต์

f=s=>!s||/^(A.*T|C.*G|G.*C|T.*A)$/.test(s)&f(s.slice(1,-1))

ดีที่สุดที่ฉันสามารถทำได้โดยไม่ใช้ Regexp คือ 62 ไบต์:

f=s=>!s||parseInt(s[0]+s.slice(-1),33)%32%7<1&f(s.slice(1,-1))

5

ทับทิม, 35

ฉันลองวิธีอื่น ๆ แต่วิธีที่ชัดเจนคือสั้นที่สุด:

->s{s.tr('ACGT','TGCA').reverse==s}

ในโปรแกรมทดสอบ

f=->s{s.tr('ACGT','TGCA').reverse==s}

puts f['ATCGCGAT']
puts f['AGT']
puts f['GTGACGTCAC']
puts f['GCAGTGA']
puts f['GCGC']
puts f['AACTGCGTTTAC'] 

2
->s{s.==s.reverse.tr'ACGT','TGCA'}สั้นลงหนึ่งไบต์
Mitch Schwartz

@MitchSchwartz ว้าวมันใช้งานได้ แต่ฉันไม่รู้ว่าสิ่งแรก.คืออะไร รหัสดูถูกต้องกว่าสำหรับฉันหากไม่มีรหัสนี้ แต่จำเป็นต้องใช้เพื่อให้ทำงานได้ มีการบันทึกไว้ที่ใดบ้างหรือไม่?
เลเวลริเวอร์เซนต์

คุณแน่ใจหรือว่าคุณไม่ต้องการคิดออกเอง
Mitch Schwartz

@MitchSchwartz ฮ่าฮ่าฮ่าฉันลองไปแล้ว ฉันพบว่าข้อกำหนดของ ruby ​​สำหรับ whitespace นั้นเป็นไปได้ยากมาก ข้อกำหนดที่แปลกสำหรับช่วงเวลาเป็นปัญหาอื่นทั้งหมด ฉันมีหลายทฤษฎี แต่พวกเขาทั้งหมดอาจผิด ฉันสงสัยว่าอาจมีบางอย่างเกี่ยวข้องกับการปฏิบัติ==เป็นวิธีการแทนการใช้ตัวดำเนินการ แต่การค้นหาด้วยสัญลักษณ์เป็นไปไม่ได้
เลเวลริเวอร์เซนต์

คุณสงสัยว่าถูกต้อง :) มันเป็นแค่การเรียกใช้วิธีเก่าแบบธรรมดา
Mitch Schwartz

5

Haskell, 48 45 ไบต์

(==)=<<reverse.map((cycle"TCG_A"!!).fromEnum)

ตัวอย่างการใช้งาน: ->(==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"True

รุ่นที่ไม่ใช่จุดชมวิวคือ

f x = reverse (map h x) == x           -- map h to x, reverse and compare to x
h c = cycle "TCG_A" !! fromEnum c      -- take the ascii-value of c and take the
                                       -- char at this position of string
                                       -- "TCG_ATCG_ATCG_ATCG_A..."

แก้ไข: @Mathias Dolidon บันทึก 3 ไบต์ ขอบคุณ!


ทำงานร่วมกับcycle "TCG_A" เกินไป :)
Mathias Dolidon


4

Julia, 47 38 ไบต์

s->((x=map(Int,s)%8)+reverse(x))%50

นี่คือฟังก์ชั่นนิรนามที่ยอมรับCharอาร์เรย์และส่งกลับค่าบูลีน หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

สิ่งนี้ใช้อัลกอริธึมของเดนนิสซึ่งสั้นกว่าโซลูชันไร้เดียงสา เราได้ส่วนที่เหลือของแต่ละจุดรหัสหารด้วย 8, เพิ่มที่กลับตัวเองรับส่วนที่เหลือจากการหารด้วย 5 และตรวจสอบว่าทั้งหมดเป็น 0 ขั้นตอนสุดท้ายจะประสบความสำเร็จโดยใช้รุ่น infix ของissubsetซึ่งโยนทั้งอาร์กิวเมนต์Setก่อนตรวจสอบ ซึ่งหมายความว่า[0,0,0]จะมีการประกาศชุดย่อยของตั้งแต่0 Set([0,0,0]) == Set(0)สิ่งนี้สั้นกว่าการตรวจสอบอย่างชัดเจนกับ 0

ลองออนไลน์!

บันทึกแล้ว 9 ไบต์ขอบคุณเดนนิส!




3

ที่จริงแล้ว 19 ไบต์

O`8@%`M;RZ`5@Σ%Y`Mπ

นี้ใช้อัลกอริทึมของเดนนิส

ลองออนไลน์!

คำอธิบาย:

O`8@%`M;RZ`5@Σ%Y`Mπ
O                    push an array containing the Unicode code points of the input
 `8@%`M              modulo each code point by 8
       ;RZ           zip with reverse
          `5@Σ%Y`M   test sum for divisibility by 5
                  π  product

3

Oracle SQL 11.2, 68 ไบต์

SELECT DECODE(TRANSLATE(REVERSE(:1),'ATCG','TAGC'),:1,1,0)FROM DUAL; 

2
กับ SQL เช่นนั้นผมมั่นใจว่าคุณจะต้องมีการเขียนรายงานสำหรับบางส่วนของโครงการของฉันก่อน ...
corsiKa

3

Julia 0.4, 22 ไบต์

s->s$reverse(s)⊆""

สตริงมีอักขระควบคุม EOT (4) และ NAK (21) อินพุตต้องอยู่ในรูปแบบของอาร์เรย์อักขระ

วิธีการนี้ XORs อักขระของอินพุตด้วยอักขระที่สอดคล้องกันในอินพุตที่ตรงกันข้าม สำหรับการจับคู่ที่ถูกต้องผลลัพธ์จะเป็นอักขระ EOT หรือ NAK การทดสอบเพื่อรวมไว้ในสตริงของอักขระเหล่านั้นจะสร้างบูลีนที่ต้องการ

ลองออนไลน์!


3

C 71

r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%5^2;return!r;}

2 ไบต์บันทึกโดย Dennis เพิ่มเติม 2 ไบต์บันทึกไว้โดยการปรับตัวสำหรับการป้อนข้อมูลพิมพ์เล็ก: ค่าคงที่37และ21มีการปรับและ52

C, 75

i,j;f(char*s){for(i=j=0;s[i];i++)j|=s[i]*s[strlen(s)-i-1]%37!=21;return!j;}

หนึ่งไบต์ที่บันทึกไว้: กำจัดวงเล็บโดยการใช้ผลิตภัณฑ์ของรหัส ASCII สองตัว mod 37 คู่ที่ถูกต้องประเมินเป็น 21 สมมติว่าอินพุตตัวพิมพ์ใหญ่

C, 76

i,j;f(char*s){for(i=j=0;s[i];i++)j|=(s[i]+s[strlen(s)-i-1])%11!=6;return!j;}

ใช้ความจริงที่ว่ารหัส ASCII ของคู่ที่ถูกต้องรวมถึง 138 หรือ 149 เมื่อนำมา mod 11 เหล่านี้เป็นคู่เท่านั้นที่รวมถึง 6 ถือว่าการป้อนข้อมูลตัวพิมพ์ใหญ่

ungolfed ในโปรแกรมทดสอบ

i,j;

f(char *s){
   for(i=j=0;s[i];i++)                  //initialize i and j to 0; iterate i through the string
     j|=(s[i]+s[strlen(s)-i-1])%11!=6;  //add characters at i from each end of string, take result mod 11. If not 6, set j to 1
return!j;}                              //return not j (true if mismatch NOT detected.)

main(){
  printf("%d\n", f("ATCGCGAT"));
  printf("%d\n", f("AGT"));
  printf("%d\n", f("GTGACGTCAC"));
  printf("%d\n", f("GCAGTGA"));
  printf("%d\n", f("GCGC"));
  printf("%d\n", f("AACTGCGTTTAC"));
} 

1
r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%37^21;return!r;}บันทึกสองไบต์
เดนนิส

@ เดนนิสขอบคุณจริงๆฉันไม่ได้อยู่ในอารมณ์ที่จะแก้ไขพอยน์เตอร์ แต่มันบีบไบต์ออก! ฉันควรจะเห็นตัวเอง!=> ^ฉันลดอีก 2 โดยเปลี่ยนเป็นอินพุตตัวพิมพ์เล็ก: ตอนนี้ทั้งหมายเลขเวทมนตร์เป็นเลขหลักเดียว
เลเวลริเวอร์เซนต์

3

ตัวคูณ 72 ไบต์

น่าเสียดายที่ regex ไม่สามารถช่วยฉันได้ที่นี่

[ dup reverse [ { { 67 71 } { 65 84 } { 71 67 } { 84 65 } } at ] map = ]

ย้อนกลับตารางการค้นหาเปรียบเทียบเท่ากัน


ว้าวนั่นเป็นช่องว่างมากมาย !!! จำเป็นหรือไม่ นอกจากนี้ลิงก์ไปยังโฮมเพจภาษาจะมีประโยชน์เช่นกัน
เลเวลริเวอร์เซนต์

@ LevelRiverSt แต่น่าเสียดายที่จำเป็นต้องใช้บิตทุกบิต ฉันจะเพิ่มลิงค์ไปยังส่วนหัว
แมว

3

Bash + coreutils, 43 32 ไบต์

[ `tr ATCG TAGC<<<$1|rev` = $1 ]

แบบทดสอบ:

for i in ATCGCGAT AGT GTGACGTCAC GCAGTGA GCGC AACTGCGTTTAC; do ./78410.sh $i && echo $i = true || echo $i = false; done
ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false

3

J - 21 ไบต์

0=[:+/5|[:(+|.)8|3&u:

ตามวิธีของเดนนิส

การใช้

   f =: 0=[:+/5|[:(+|.)8|3&u:
   f 'ATCGCGAT'
1
   f 'AGT'
0
   f 'GTGACGTCAC'
1
   f 'GCAGTGA'
0
   f 'GCGC'
1
   f 'AACTGCGTTTAC'
0
   f 'ACTG'
0

คำอธิบาย

0=[:+/5|[:(+|.)8|3&u:
                 3&u:    - Convert from char to int
               8|        - Residues from division by 8 for each
            |.           - Reverse the list
           +             - Add from the list and its reverse element-wise
        [:               - Cap, compose function
      5|                 - Residues from division by 5 for each
    +/                   - Fold right using addition to create a sum
  [:                     - Cap, compose function
0=                       - Test the sum for equality to zero

3

เขาวงกต 42 ไบต์

_8
,%
;
"}{{+_5
"=    %_!
 = """{
 ;"{" )!

สิ้นสุดด้วยข้อผิดพลาดการหารด้วยศูนย์ (ข้อความแสดงข้อผิดพลาดบน STDERR)

ลองออนไลน์!

เลย์เอาต์รู้สึกไม่มีประสิทธิภาพจริงๆ แต่ตอนนี้ฉันไม่เห็นวิธีในการเล่นกอล์ฟ

คำอธิบาย

การแก้ปัญหานี้จะขึ้นอยู่กับเคล็ดลับเลขคณิตเดนนิส: ใช้ตัวอักษรทั้งหมดรหัส modulo เพิ่มคู่จากปลายทั้งสองข้างและให้แน่ใจว่ามันหารด้วย85

ไพรเมอร์เขาวงกต:

  • เขาวงกตมีจำนวนเต็มสองจำนวนโดยมีความแม่นยำตามอำเภอใจหลักและaux (iliary) ซึ่งในตอนแรกจะเต็มไปด้วยจำนวนศูนย์ (โดยปริยาย) จำนวนอนันต์
  • ซอร์สโค้ดมีลักษณะคล้ายเขาวงกตที่ซึ่งตัวชี้คำแนะนำ (IP) ตามทางเดินเมื่อมันสามารถ (แม้รอบมุม) รหัสเริ่มต้นที่อักขระตัวแรกที่ถูกต้องในลำดับการอ่านคือที่มุมบนซ้ายในกรณีนี้ เมื่อ IP มาถึงรูปแบบของการแยกใด ๆ (เช่นเซลล์ที่อยู่ติดกันหลายแห่งนอกเหนือจากที่มันมาจาก) มันจะเลือกทิศทางตามด้านบนของสแต็กหลัก กฎพื้นฐานคือเลี้ยวซ้ายเมื่อลบเดินหน้าต่อไปเมื่อศูนย์เลี้ยวขวาเมื่อบวก และเมื่อหนึ่งในสิ่งเหล่านี้เป็นไปไม่ได้เพราะมีกำแพงแล้ว IP จะไปในทิศทางตรงกันข้าม IP ยังหันไปรอบ ๆ เมื่อกดปุ่ม Dead Dead
  • ตัวเลขจะถูกประมวลผลโดยการคูณด้านบนของสแต็กหลักด้วย 10 จากนั้นเพิ่มตัวเลข

รหัสเริ่มต้นด้วย 2x2 วนตามเข็มนาฬิกาขนาดเล็กซึ่งอ่านโมดูโลอินพุตทั้งหมด 8:

_   Push a 0.
8   Turn into 8.
%   Modulo. The last three commands do nothing on the first iteration
    and will take the last character code modulo 8 on further iterations.
,   Read a character from STDIN or -1 at EOF. At EOF we will leave loop.

ตอนนี้เหลือใช้; -1เราเข้าไปอีกวงตามเข็มนาฬิกาซึ่งย้ายด้านบนของสแต็กหลัก (เช่นอักขระสุดท้าย) ลงไปที่ด้านล่าง:

"   No-op, does nothing.
}   Move top of the stack over to aux. If it was at the bottom of the stack
    this will expose a zero underneath and we leave the loop.
=   Swap top of main with top of aux. The effect of the last two commands
    together is to move the second-to-top stack element from main to aux.
"   No-op.

ตอนนี้มีบิตเชิงเส้นสั้น ๆ :

{{  Pull two characters from aux to main, i.e. the first and last (remaining)
    characters of the input (mod 8).
+   Add them.
_5  Push 5.
%   Modulo.

IP อยู่ที่จุดเชื่อมต่อซึ่งทำหน้าที่เป็นสาขาเพื่อทดสอบการหารด้วย 5 หากผลลัพธ์ของโมดูโลไม่เป็นศูนย์เรารู้ว่าอินพุตไม่ใช่ palindrome ของ Watson-Crick และเราหันไปทางทิศตะวันออก:

_   Push 0.
!   Print it. The IP hits a dead end and turns around.
_   Push 0.
%   Try to take modulo, but division by zero fails and the program terminates.

มิฉะนั้นเราจะต้องตรวจสอบอินพุตที่เหลืออยู่เรื่อย ๆ ดังนั้น IP จะไปทางทิศใต้ {ดึงกว่าด้านล่างของการป้อนข้อมูลที่เหลือ หากเราหมดอินพุตแล้วนี่จะเป็น0(จากด้านล่างของaux ) และ IP ยังคงเคลื่อนที่ต่อไป:

)   Increment 0 to 1.
!   Print it. The IP hits a dead end and turns around.
)   Increment 0 to 1.
{   Pull a zero over from aux, IP keeps moving north.
%   Try to take modulo, but division by zero fails and the program terminates.

มิฉะนั้นจะมีการตรวจสอบอักขระจำนวนมากขึ้นในสตริง IP จะหันไปทางทิศตะวันตกและเคลื่อนไปสู่ลูป 2x2 ถัดไป (ตามเข็มนาฬิกา) ซึ่งประกอบด้วยส่วนใหญ่ที่ไม่มี ops:

"   No-op.
"   No-op.
{   Pull one value over from aux. If it's the bottom of aux, this will be
    zero and the IP will leave the loop eastward.
"   No-op.

หลังจากวนรอบนี้เราได้รับอินพุตในสแต็กหลักอีกครั้งยกเว้นอักขระตัวแรกและตัวสุดท้ายและมีศูนย์อยู่ด้านบน การ;ละทิ้ง0และจากนั้น=สลับยอดของสแต็ค แต่นี่เป็นเพียงการยกเลิกอันแรก=ในลูปเพราะตอนนี้เรากำลังเข้าสู่ลูปในตำแหน่งอื่น ล้างและทำซ้ำ


3

sed, 67 61 bytes

G;H;:1;s/\(.\)\(.*\n\)/\2\1/;t1;y/ACGT/TGCA/;G;s/^\(.*\)\1$/1/;t;c0

(67 ไบต์)

ทดสอบ

for line in ATCGCGAT AGT GTGACGTCAC GCAGTGA GCGC AACTGCGTTTAC ACTG
do echo -n "$line "
    sed 'G;H;:1;s/\(.\)\(.*\n\)/\2\1/;t1;y/ACGT/TGCA/;G;s/^\(.*\)\1$/1/;t;c0' <<<"$line"
done

เอาท์พุต

ATCGCGAT 1
AGT 0
GTGACGTCAC 1
GCAGTGA 0
GCGC 1
AACTGCGTTTAC 0
ACTG 0

ด้วยการใช้นิพจน์ทั่วไปแบบขยายจำนวนไบต์สามารถลดลงเป็น 61

sed -r 'G;H;:1;s/(.)(.*\n)/\2\1/;t1;y/ACGT/TGCA/;G;s/^(.*)\1$/1/;t;c0'

หากคุณสามารถทำได้ใน 61 ไบต์นั่นคือคะแนนของคุณ - ไม่มีอะไรเทียบกับ NFA หรือ regexp สมบูรณ์ในการท้าทายนี้ ความท้าทายบางอย่างไม่อนุญาตให้ regex เต็ม แต่โดยปกติจะมีเพียงregex-golfเท่านั้นที่จะไม่อนุญาตให้ใช้-exions ปกติ
แมว

3

C #, 65 ไบต์

bool F(string s)=>s.SequenceEqual(s.Reverse().Select(x=>"GACT"[("GACT".IndexOf(x)+2)%4]));

. NET มีชื่อวิธีเฟรมเวิร์กที่ค่อนข้างยาวในบางครั้งซึ่งไม่จำเป็นต้องทำเพื่อกรอบโค้ดกอล์ฟที่ดีที่สุด ในกรณีนี้ชื่อเมธอดเฟรมเวิร์กประกอบด้วย 33 อักขระจาก 90 :)

ขึ้นอยู่กับเคล็ดลับโมดูลัสจากที่อื่น ๆ ในหัวข้อ:

bool F(string s)=>s.Zip(s.Reverse(),(a,b)=>a%8+b%8).All(x=>x%5==0);

ตอนนี้มีน้ำหนักตัวที่ 67 ตัวอักษรโดยที่ 13 เป็นชื่อเมธอด

การปรับให้เหมาะสมเล็กน้อยอีกอันเพื่อกำจัดอักขระ 2 อันที่ใหญ่โต:

bool F(string s)=>s.Zip(s.Reverse(),(a,b)=>(a%8+b%8)%5).Sum()<1;

ดังนั้น 65 ใน 13 นั้นเป็นชื่อกรอบงาน

แก้ไข: การละเว้น "สำเร็จรูป" บางส่วนจากโซลูชันและการเพิ่มเงื่อนไขสองประการทำให้เรามีนิพจน์

s.Zip(s.Reverse(),(a,b)=>(a%8+b%8)%5).Sum()

ซึ่งให้ 0 หากสตริง s เป็นคำตอบที่ถูกต้องเท่านั้น ตามที่ cat ชี้ให้เห็น "bool F (string s) =>" สามารถเปลี่ยนได้จริงด้วย "s =>" ถ้ามันชัดเจนในโค้ดที่นิพจน์นั้นFunc<string,bool>คือ แม็พสตริงกับบูลีน


1
ยินดีต้อนรับสู่ PPCG คำตอบแรกที่ดี! : D
cat

@cat ขอบคุณสำหรับสิ่งนั้น! :)
robhol

1
ฉันไม่รู้ C # จริง ๆแต่ถ้านี่เป็นแลมบ์ดาคุณสามารถแยกประเภทและกำหนดมันได้เนื่องจากฟังก์ชั่นที่ไม่ระบุชื่อนั้นดีตราบใดที่พวกเขาสามารถกำหนดได้
แมว

1
นอกจากนี้คุณไม่สามารถทำ!s.Zip...แทนs.Zip...==0? (หรือไม่สามารถคุณ! int # ใน C # ได้) แม้ว่าคุณจะไม่สามารถลบล้างบูลีนได้คุณสามารถละทิ้งการผกผันและสถานะใด ๆ ในคำตอบของคุณว่าสิ่งนี้จะส่งกลับ <สิ่งนี้> สำหรับความผิดพลาด สิ่งที่มองเห็นได้ชัดเจน> สำหรับความจริง
แมว

1
@cat: คุณถูกต้องเกี่ยวกับการลดประเภท ฉันคิดว่ารหัสจะต้องปฏิบัติการโดยตรง แต่การตั้งสมมติฐานง่าย ๆ เกี่ยวกับอินพุตและเอาต์พุตทำให้ง่ายขึ้นเล็กน้อย อย่างไรก็ตามสิ่งอื่น ๆ ใช้งานไม่ได้ - อย่างถูกต้องในความคิดของฉันเนื่องจากการดำเนินการบูลีนไม่มีวิธีตรรกะ (hue hue) ที่จะใช้กับตัวเลข การกำหนด 0 และ 1 ให้ค่าของเท็จและจริงคือหลังจากทั้งหมดเพียงแค่การประชุม
robhol


2

R, 101 ไบต์

g=function(x){y=unlist(strsplit(x,""));all(sapply(rev(y),switch,"C"="G","G"="C","A"="T","T"="A")==y)}

กรณีทดสอบ

g("ATCGCGAT")
[1] TRUE
g("AGT")
[1] FALSE
g("GTGACGTCAC")
[1] TRUE
g("GCAGTGA")
[1] FALSE
g("GCGC")
[1] TRUE
g("AACTGCGTTTAC")
[1] FALSE
g("ACTG")
[1] FALSE

strsplit(x,"")[[1]]สั้นกว่า 3 ไบต์unlist(strsplit(x,""))และที่นี่มีค่าเทียบเท่าเนื่องจากxเป็นสตริงอักขระเดียวเสมอ
plannapus

2

อ็อกเทฟ 52 ไบต์

f=@(s) prod(mod((i=mod(toascii(s),8))+flip(i),5)==0)

ติดตามเคล็ดลับของ Denis ... นำค่า ASCII mod 8, พลิกและเพิ่มเข้าด้วยกัน; ถ้าทุกผลรวมคูณด้วยห้าคุณก็เป็นทองคำได้


ที่หนึ่งในช่องว่างที่มีความสำคัญ? นั่นคือ ... แปลก
แมว

นอกจากนี้คุณสามารถออกจากการf=มอบหมาย; ฟังก์ชั่นที่ไม่มีชื่อก็โอเค
แมว

1

Clojure / ClojureScript, 49 ตัวอักษร

#(=(list* %)(map(zipmap"ATCG""TAGC")(reverse %)))

ทำงานบนสตริง หากข้อกำหนดถูกคลายเพื่ออนุญาตรายการฉันสามารถถอด(list* )และบันทึกได้ 7 ตัวอักษร


1

R, 70 ไบต์

f=function(x)all(chartr("GCTA","CGAT",y<-strsplit(x,"")[[1]])==rev(y))

การใช้งาน:

> f=function(x)all(chartr("GCTA","CGAT",y<-strsplit(x,"")[[1]])==rev(y))
> f("GTGACGTCAC")
[1] TRUE
> f("AACTGCGTTTAC")
[1] FALSE
> f("AGT")
[1] FALSE
> f("ATCGCGAT")
[1] TRUE

1

C, 71 ไบต์

ต้องการรหัส ASCII สำหรับอักขระที่เกี่ยวข้อง แต่ยอมรับอินพุตตัวพิมพ์ใหญ่ตัวพิมพ์เล็กหรือตัวพิมพ์เล็ก

f(char*s){char*p=s+strlen(s),b=0;for(;*s;b&=6)b|=*--p^*s++^4;return!b;}

รหัสนี้เก็บรักษาพอยน์เตอร์สองตัวไว้sและpข้ามผ่านสตริงในทิศทางตรงกันข้าม ในแต่ละขั้นตอนเราเปรียบเทียบอักขระที่เกี่ยวข้องโดยตั้งค่าbเป็นจริงหากไม่ตรงกัน การจับคู่จะขึ้นอยู่กับ XOR ของค่าตัวอักษร:

'A' ^ 'T' = 10101
'C' ^ 'G' = 00100

'C' ^ 'T' = 10111
'G' ^ 'A' = 00110
'A' ^ 'C' = 00010
'T' ^ 'G' = 10011
 x  ^  x  = 00000

เราสามารถเห็นได้ในตารางด้านบนที่เราต้องการบันทึกความสำเร็จxx10xและความล้มเหลวสำหรับสิ่งอื่นดังนั้นเราจึง XOR ด้วย00100(สี่) และปิดบังด้วย00110(หก) เพื่อให้เป็นศูนย์สำหรับATหรือCGไม่เป็นศูนย์ ในที่สุดเราจะคืนค่าจริงถ้าคู่ทั้งหมดสะสมผลลัพธ์เป็นศูนย์bเท็จอย่างอื่น

โปรแกรมทดสอบ:

#include <stdio.h>
int main(int argc, char **argv)
{
    while (*++argv)
        printf("%s = %s\n", *argv, f(*argv)?"true":"false");
}

1

𝔼𝕊𝕄𝕚𝕟, 13 ตัวอักษร / 17 ไบต์

⟮ïĪ`ACGT”⟯ᴙ≔Ⅰ

Try it here (Firefox only).

คำอธิบาย

แปลอินพุตจากACGTเป็นTGCAและตรวจสอบว่าสตริงผลลัพธ์เป็น palindrome หรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.