Watson-Crick palindromes


31

Vấn đề

Tạo một hàm có thể xác định xem chuỗi DNA tùy ý có phải là một bảng màu Watson-Crick hay không. Hàm sẽ lấy một chuỗi DNA và xuất ra một giá trị thực nếu chuỗi đó là một bảng màu Watson-Crick và một giá trị sai nếu không. (Đúng và Sai cũng có thể được biểu diễn lần lượt là 1 và 0.)

Chuỗi DNA có thể ở dạng chữ hoa hoặc chữ thường tùy theo sở thích của bạn.

Ngoài ra, chuỗi DNA sẽ không trống.

Giải trình

Một chuỗi DNA là một palindrom Watson-Crick khi phần bù của nó ngược lại với chính nó.

Cho một chuỗi DNA, đầu tiên đảo ngược nó, và sau đó bổ sung cho mỗi ký tự theo các cơ sở DNA (A ↔ T và C ↔ G). Nếu chuỗi gốc bằng với chuỗi ngược được bổ sung, thì đó là một bảng màu Watson-Crick.

Để biết thêm, xem câu hỏi này . Đó là một thách thức khác nhau khi bạn phải tìm chuỗi con dài nhất của chuỗi DNA trong đó chuỗi con đó là một bảng màu Watson-Crick.

Mục tiêu

Đây là mã golf và mã ngắn nhất sẽ thắng.

Các trường hợp thử nghiệm

Các định dạng là <input> = <output>.

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


3
Ai đó nên viết một chương trình trong DNA # cũng là một bảng màu Watson-Crick. : D (có thể không thể)
mbomb007

Hoặc, nếu bạn thích, "một từ là một bảng màu Watson Watson Crick nếu nó có thứ tự 2 trong nhóm miễn phí trên 2 máy phát điện" (hoặc trên n máy phát điện!).
wchargein

(Tôi đoán về mặt kỹ thuật đó là "đặt hàng nhiều nhất là 2")
wchargein

1
@AndrasDeak Theo cuốn sách của ERICons, Franklin rõ ràng chủ yếu là một cái gai ở bên cạnh họ. Cô ấy liên tục từ chối trao các tia X cho thấy hình xoắn ốc (như tôi nhớ lại), vì cô ấy đã từ chối tin vào điều đó. Nó đáng để đọc nếu bạn quan tâm đến khám phá ở mức nào.
Phoenix Obsidian

Câu trả lời:


27

05AB1E , 10 7 byte

Mã số:

Â'š×‡Q

Giải trình:

Để kiểm tra xem một chuỗi có phải là một palindrom hay không, chúng ta chỉ cần kiểm tra đầu vào với đầu vào, với athoán đổi và cghoán đổi và sau đó đảo ngược nó. Vì vậy, đó là những gì chúng ta sẽ làm. Chúng tôi đẩy đầu vào và đầu vào đảo ngược bằng cách sử dụng Â(bifurcate). Bây giờ đến một phần khó khăn. 'š×là phiên bản nén cho creating. Nếu chúng tôi đảo ngược nó, bạn có thể thấy tại sao nó có trong mã:

CreATinG
|  ||  |
GniTAerC

Điều này sẽ được sử dụng để chuyển ngữ đầu vào đảo ngược. Chuyển ngữ được thực hiện với . Sau đó, chúng tôi chỉ kiểm tra xem đầu vào và đầu vào được chuyển ngữ có phải là e Qvà in giá trị đó không. Vì vậy, đây là cách ngăn xếp trông như thế nào cho đầu vào actg:

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

Điều này cũng có thể được nhìn thấy với cờ gỡ lỗi ( Thử tại đây ).

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


4
Rất, er, sáng tạo ...
Toby Speight

2
Ngôn ngữ này có một số tính năng rất gọn gàng
dặm

18

Thạch , 9 byte

O%8µ+U5ḍP

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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
Tôi nghĩ Python khá gần với việc cạnh tranh với câu trả lời này! So sánh chín byte đầu tiên của câu trả lời của tôi : lambda s:. Đó gần như là giải pháp đầy đủ!
orlp

Đợi đã, phần "Cách thức hoạt động" không thực sự giải thích cách thức hoạt động của nó ... Tại sao dư lượng của 8 và tổng của 5 ?? Các chữ cái được bổ sung ở đâu?
ZeroOne

@ZeroOne Tôi đã làm rõ phần đó.
Dennis

Tuyệt vời! Thật là thông minh. :) Cảm ơn!
ZeroOne

12

Python 2, 56 45 44 byte

lambda s:s==s[::-1].translate("_T_GA__C"*32)

lambda s:s==s[::-1].translate("TCG_A"*99)hoạt động trong Python 3
Alex Varga

8

Perl, 27 byte

Bao gồm +2 cho -lp

Cung cấp đầu vào trên STDIN, in 1 hoặc không có gì:

dnapalin.pl <<< ATCGCGAT

dnapalin.pl:

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

Thay thế $_=bằng $_+=để có được 0thay vì trống cho trường hợp sai



7

Võng mạc , 34 33 byte

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

Hãy thử trực tuyến! (Sửa đổi một chút để chạy tất cả các trường hợp thử nghiệm cùng một lúc.)

Giải trình

$
;$_

Sao chép đầu vào bằng cách khớp đầu cuối của chuỗi và chèn ;theo sau bởi toàn bộ đầu vào.

T`ACGT`Ro`;.+

Chỉ khớp nửa sau của đầu vào với ;.+và thực hiện thay thế các cặp bằng cách chuyển ngữ. Đối với bộ mục tiêu Ro: otham chiếu bộ khác , ođược thay thế bằng ACGT. Nhưng Rđảo ngược bộ này, vì vậy hai bộ thực sự là:

ACGT
TGCA

Nếu đầu vào là một bảng màu DNA, bây giờ chúng ta sẽ có đầu vào theo sau là đảo ngược của nó (cách nhau bởi ;).

+`(.);\1
;

Lặp đi lặp lại ( +) loại bỏ một cặp ký tự giống hệt nhau xung quanh ;. Điều này sẽ tiếp tục cho đến khi chỉ ;còn lại hoặc cho đến khi hai ký tự xung quanh ;không còn giống nhau, điều đó có nghĩa là các chuỗi không đảo ngược nhau.

^;

Kiểm tra xem ký tự đầu tiên là ;và in 0hoặc 1phù hợp.


6

JavaScript (ES6), 59 byte

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

Tốt nhất tôi có thể làm mà không cần sử dụng Regapi là 62 byte:

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

5

Hồng ngọc, 35

Tôi đã thử những cách khác, nhưng cách rõ ràng là ngắn nhất:

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

trong chương trình kiểm tra

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'}là một byte ngắn hơn
Mitch Schwartz

@MitchSchwartz wow, nó hoạt động, nhưng tôi không biết cái đó đầu tiên .là để làm gì. Mã có vẻ đúng hơn đối với tôi mà không có nó, nhưng nó được yêu cầu để làm cho nó chạy. Nó được ghi nhận ở bất cứ đâu?
Cấp sông St

Bạn có chắc chắn bạn không muốn tự mình tìm ra nó?
Mitch Schwartz

@MitchSchwartz hahaha Tôi đã thử. Tôi thấy các yêu cầu của ruby ​​cho khoảng trắng rất bình dị. Yêu cầu kỳ lạ cho các giai đoạn là một vấn đề hoàn toàn khác. Tôi có một số lý thuyết nhưng tất cả chúng có thể sai. Tôi nghi ngờ nó có thể có liên quan đến việc coi ==như là một phương thức chứ không phải là một toán tử, nhưng tìm kiếm bằng các ký hiệu là không thể.
Cấp sông St

Bạn nghi ngờ chính xác. :) Đó chỉ là một cuộc gọi phương thức cũ đơn giản.
Mitch Schwartz

5

Haskell, 48 45 byte

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

Ví dụ sử dụng: (==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"-> True.

Một phiên bản không có điểm là

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..."

Chỉnh sửa: @Mathias Dolidon đã lưu 3 byte. Cảm ơn!


Làm việc với cycle "TCG_A" quá. :)
Mathias Dolidon


4

Julia, 47 38 byte

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

Đây là một hàm ẩn danh chấp nhận một Charmảng và trả về một boolean. Để gọi nó, gán nó cho một biến.

Điều này sử dụng thuật toán của Dennis, ngắn hơn giải pháp ngây thơ. Chúng tôi lấy phần còn lại của mỗi điểm mã chia cho 8, thêm vào đó để đảo ngược, lấy phần còn lại từ chia cho 5 và kiểm tra xem tất cả có bằng 0. Bước cuối cùng được thực hiện bằng cách sử dụng phiên bản infix của issubsetcả hai đối số Settrước khi kiểm tra Điều này có nghĩa [0,0,0]là được tuyên bố là một tập hợp con của 0, kể từ đó Set([0,0,0]) == Set(0). Điều này ngắn hơn một kiểm tra rõ ràng so với 0.

Hãy thử trực tuyến!

Đã lưu 9 byte nhờ Dennis!


4

Jolf, 15 byte

Thử nó!

=~A_iγ"AGCT"_γi

Giải trình:

   _i            Reverse the input
 ~A_iγ"AGCT"_γ   DNA swap the reversed input
=~A_iγ"AGCT"_γi  Check if the new string is the same as the original input


3

Trên thực tế, 19 byte

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

Điều này sử dụng thuật toán của Dennis .

Hãy thử trực tuyến!

Giải trình:

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 byte

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

2
Với SQL như vậy, tôi tin rằng bạn phải có báo cáo bằng văn bản cho một số dự án của tôi trước khi ...
corsiKa

3

Julia 0,4, 22 byte

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

Chuỗi chứa các ký tự điều khiển EOT (4) và NAK (21). Đầu vào phải ở dạng một mảng ký tự.

Cách tiếp cận này XOR các ký tự của đầu vào với các ký tự tương ứng trong đầu vào đảo ngược. Đối với các cặp hợp lệ, điều này dẫn đến các ký tự EOT hoặc NAK. Việc kiểm tra để đưa vào chuỗi các ký tự đó tạo ra Boolean mong muốn.

Hãy thử trực tuyến!


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 byte được lưu bởi Dennis. Thêm 2 byte được lưu bằng cách điều chỉnh cho đầu vào chữ thường: hằng số 3721được sửa đổi thành 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;}

Đã lưu một byte: Loại bỏ dấu ngoặc đơn bằng cách lấy sản phẩm của hai mã ASCII mod 37. Các cặp hợp lệ ước tính thành 21. Giả sử đầu vào chữ hoa.

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;}

Sử dụng thực tế là mã ASCII của các cặp hợp lệ có tổng bằng 138 hoặc 149. Khi lấy mod 11, đây là các cặp duy nhất có tổng bằng 6. Giả sử đầu vào chữ hoa.

vô dụng trong chương trình thử nghiệm

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;}tiết kiệm một vài byte.
Dennis

@Dennis cảm ơn, tôi thực sự không có tâm trạng sửa đổi con trỏ, nhưng nó đã vắt kiệt một byte! Tôi nên nhìn thấy !=> ^bản thân mình. Tôi đã giảm thêm 2 bằng cách thay đổi thành đầu vào chữ thường: cả hai số ma thuật hiện là một chữ số.
Cấp sông St

3

Yếu tố , 72 byte

Thật không may regex không thể giúp tôi ở đây.

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

Đảo ngược, tra cứu bảng, so sánh bằng nhau.


Wow, đó là rất nhiều khoảng trắng !!! Có phải tất cả đều cần thiết? Ngoài ra, một liên kết đến trang chủ ngôn ngữ sẽ hữu ích.
Cấp sông St

@LevelRiverSt Thật không may, mỗi bit của nó là cần thiết. Tôi sẽ thêm một liên kết đến tiêu đề.
mèo

3

Bash + coreutils, 43 32 byte

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

Các xét nghiệm:

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 byte

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

Dựa trên phương pháp của Dennis

Sử dụng

   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

Giải trình

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

Mê cung , 42 byte

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

Chấm dứt với lỗi chia cho 0 (thông báo lỗi trên STDERR).

Hãy thử trực tuyến!

Bố cục cảm thấy thực sự không hiệu quả nhưng tôi không thấy cách nào để chơi nó ngay bây giờ.

Giải trình

Giải pháp này dựa trên thủ thuật số học của Dennis: lấy tất cả các mã ký tự modulo 8, thêm một cặp từ cả hai đầu và đảm bảo rằng nó chia hết cho5 .

Mê cung mồi:

  • Labyrinth có hai ngăn xếp các số nguyên tùy ý chính xác, chínhaux (iliary), được điền ban đầu với một (ngầm) số lượng vô hạn các số không.
  • Mã nguồn giống như một mê cung, trong đó con trỏ lệnh (IP) đi theo hành lang khi nó có thể (thậm chí quanh các góc). Mã bắt đầu ở ký tự hợp lệ đầu tiên theo thứ tự đọc, tức là ở góc trên cùng bên trái trong trường hợp này. Khi IP đến bất kỳ hình thức giao nhau nào (tức là một số ô liền kề ngoài một ô mà nó xuất phát), nó sẽ chọn một hướng dựa trên đỉnh của ngăn xếp chính. Các quy tắc cơ bản là: rẽ trái khi âm, tiếp tục đi về phía trước khi số 0, rẽ phải khi dương. Và khi một trong những điều này là không thể bởi vì có một bức tường, thì IP sẽ đi theo hướng ngược lại. IP cũng quay vòng khi nhấn vào ngõ cụt.
  • Các chữ số được xử lý bằng cách nhân đỉnh của ngăn xếp chính với 10 và sau đó thêm chữ số.

Mã bắt đầu bằng một vòng lặp 2x2 nhỏ, theo chiều kim đồng hồ, đọc tất cả các modulo đầu vào 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.

Bây giờ ;loại bỏ -1. Chúng ta nhập một vòng lặp theo chiều kim đồng hồ khác để di chuyển đỉnh của ngăn xếp chính (tức là ký tự cuối cùng) xuống phía dưới:

"   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.

Bây giờ có một bit tuyến tính ngắn:

{{  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 hiện đang ở một ngã ba hoạt động như một nhánh để kiểm tra khả năng chia hết cho 5. Nếu kết quả của modulo khác không, chúng ta biết rằng đầu vào không phải là một palindrom Watson-Crick và chúng ta quay về hướng đông:

_   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.

Mặt khác, chúng ta cần tiếp tục kiểm tra phần còn lại của đầu vào, để IP tiếp tục đi về phía nam. Các {kéo trên dưới cùng của đầu vào còn lại. Nếu chúng tôi đã kiệt sức đầu vào, thì đây sẽ là một 0(từ đáy aux ), và IP tiếp tục di chuyển về phía nam:

)   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.

Mặt khác, có nhiều ký tự trong chuỗi cần kiểm tra. IP quay về hướng tây và di chuyển vào vòng 2x2 tiếp theo (theo chiều kim đồng hồ), bao gồm phần lớn không có op:

"   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.

Sau vòng lặp này, chúng ta lại có đầu vào trên ngăn xếp chính, ngoại trừ ký tự đầu tiên và cuối cùng của nó và với số 0 ở trên cùng. Việc ;loại bỏ 0và sau đó =hoán đổi đỉnh của các ngăn xếp, nhưng đây chỉ là để hủy bỏ đầu tiên =trong vòng lặp, bởi vì chúng ta hiện đang đi vào vòng lặp ở một vị trí khác. Rửa sạch và lặp lại.


3

sed, 67 61 byte

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

(67 byte)

Kiểm tra

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

Đầu ra

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

Bằng cách sử dụng các biểu thức chính quy mở rộng, số byte có thể giảm xuống còn 61.

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

Nếu bạn có thể làm điều đó trong 61 byte, thì đó là điểm số của bạn - không có gì chống lại NFA hoặc chế độ hoàn lại đầy đủ cho thử thách cụ thể này. Một số thách thức không cho phép regex đầy đủ, nhưng thường thì chỉ có regex-golf sẽ không cho phép các biểu hiện không thường xuyên .
con mèo

3

C #, 65 byte

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

.NET có một số tên phương thức khung khá dài, đôi khi không nhất thiết phải tạo ra khung golf mã tốt nhất. Trong trường hợp này, tên phương thức khung tạo thành 33 ký tự trong số 90. :)

Dựa trên thủ thuật mô đun từ nơi khác trong luồng:

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

Bây giờ nặng 67 ký tự, trong đó 13 là tên phương thức.

Một tối ưu hóa nhỏ khác để loại bỏ 2 ký tự:

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

Vì vậy, 65 trong số đó là 13 tên khung.

Chỉnh sửa: Bỏ một số "bản tóm tắt" giới hạn khỏi giải pháp và thêm một vài điều kiện để lại cho chúng ta biểu thức

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

Trả về 0 khi và chỉ khi chuỗi s là câu trả lời hợp lệ. Như cat chỉ ra, "bool F (chuỗi s) =>" thực sự có thể thay thế bằng "s =>" nếu nó rõ ràng trong mã rằng biểu thức là a Func<string,bool>, tức là. ánh xạ một chuỗi đến một boolean.


1
Chào mừng bạn đến với PPCG, câu trả lời đầu tiên tốt đẹp! : D
mèo

@cat Cảm ơn vì điều đó! :)
robhol

1
Tôi không thực sự biết C #, nhưng nếu đây là một lambda, sau đó bạn có thể bỏ qua loại của nó và gán cho nó, như các chức năng ẩn danh cũng tốt miễn là họ đang assign thể .
con mèo

1
Ngoài ra, bạn không thể làm !s.Zip...thay vì s.Zip...==0? (Hoặc bạn không thể !ints trong C #?) Ngay cả khi bạn không thể phủ nhận nó, bạn có thể bỏ qua bất kỳ loại đảo ngược và nêu trong câu trả lời của bạn rằng điều này trả về <điều này> cho sai và <điều này xác định khác, điều rõ ràng rõ ràng> cho sự thật.
con mèo

1
@cat: Bạn nói đúng về việc bỏ loại. Tôi nghĩ rằng mã phải được thực thi trực tiếp, nhưng việc đưa ra các giả định đơn giản về đầu vào và đầu ra làm cho nó dễ dàng hơn một chút. Tuy nhiên, điều khác sẽ không hoạt động - đúng như vậy, theo tôi, vì một phép toán boolean không có cách logic (màu sắc) để áp dụng cho một số. Việc gán 0 và 1 các giá trị sai và đúng, xét cho cùng, chỉ là quy ước.
robhol

2

REXX 37

s='ATCGCGAT';say s=translate(reverse(s),'ATCG','TAGC')

2

R, 101 byte

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

Các trường hợp thử nghiệm

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]]ngắn hơn 3 byte so với unlist(strsplit(x,""))và, ở đây, tương đương vì xluôn là một chuỗi ký tự.
plannapus

2

Octave, 52 byte

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

Theo mánh khóe của Denis ... lấy các giá trị ASCII mod 8, lật và cộng lại với nhau; nếu mỗi tổng là bội số của năm, bạn là vàng.


Đó là một khoảng trắng có ý nghĩa? Thật ki quặc.
con mèo

Ngoài ra, bạn có thể rời khỏi f=nhiệm vụ; chức năng không tên là ổn.
con mèo

1

Clojure / ClojureScript, 49 ký tự

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

Hoạt động trên chuỗi. Nếu các yêu cầu được nới lỏng để cho phép danh sách, tôi có thể tắt (list* )và lưu 7 ký tự.


1

R, 70 byte

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

Sử dụng:

> 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 byte

Yêu cầu mã ASCII cho các ký tự có liên quan, nhưng chấp nhận đầu vào chữ hoa, chữ thường hoặc chữ thường.

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

Mã này duy trì hai con trỏ spđi qua chuỗi theo hướng ngược nhau. Ở mỗi bước, chúng tôi so sánh các ký tự tương ứng, đặt bđúng nếu chúng không khớp. Sự phù hợp dựa trên XOR của các giá trị ký tự:

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

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

Chúng ta có thể thấy trong bảng trên rằng chúng ta muốn ghi lại thành công xx10xvà thất bại cho bất cứ điều gì khác, vì vậy chúng ta XOR với 00100(bốn) và mặt nạ với 00110(sáu) để lấy số 0 cho AThoặc CGkhác không. Cuối cùng, chúng tôi trả về true nếu tất cả các cặp tích lũy kết quả bằng 0 trongb , sai khác.

Chương trình kiểm tra:

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

1

, 13 ký tự / 17 byte

⟮ïĪ`ACGT”⟯ᴙ≔Ⅰ

Try it here (Firefox only).

Giải trình

Chuyển ngữ đầu vào từ ACGTđến TGCAvà kiểm tra xem chuỗi kết quả có phải là một bảng màu hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.