Thử thách Rosetta Stone: Lập bản đồ gen


11

Mục tiêu của Thử thách Rosetta Stone là viết các giải pháp bằng càng nhiều ngôn ngữ càng tốt. Thể hiện đa ngôn ngữ lập trình của bạn!

Các thách thức

Thách thức của bạn là triển khai một chương trình sẽ ánh xạ một số gen bằng cách sử dụng tần số chéo, bằng càng nhiều ngôn ngữ lập trình càng tốt . Bạn được phép sử dụng bất kỳ loại chức năng thư viện tiêu chuẩn nào mà ngôn ngữ của bạn có, vì đây chủ yếu là một ngôn ngữ giới thiệu.

"Lập bản đồ gen là gì?"

Ánh xạ gen là quá trình xác định vị trí tương đối của các gen trên nhiễm sắc thể. Điều này được thực hiện bằng cách đo tần số giao thoa của các cặp gen, bằng tỷ lệ phần trăm của con cái mà cặp này không được di truyền cùng nhau. Khoảng cách được đo bằng đơn vị bản đồ với một đơn vị bản đồ bằng một phần trăm vượt qua. Ví dụ: nếu gen C & D có tần số giao thoa là 11%, thì gen C là khoảng cách 11 đơn vị bản đồ so với gen D.

Ánh xạ gen được thực hiện với nhiều cặp gen để xác định thứ tự tương đối của chúng. Ví dụ: dữ liệu (A,B,12) (D,B,7) (A,D,5) (D,H,2) (H,B,9)tạo ra bản đồ sau:

A..H.D......B

Bạn có thể nhận thấy rằng đó B......D.H..Acũng là một bản đồ hợp lệ. Điều này là đúng, bởi vì không thể phân biệt giữa các gương đối lập. Chương trình của bạn có thể chọn cái nào để đầu ra. Mặc dù đầu vào có thể không bao gồm mọi cặp có thể, nhưng sẽ luôn có đủ thông tin để xây dựng lại toàn bộ bản đồ (vì vậy sẽ không bao giờ có nhiều hơn 2 đầu ra hợp lệ). Ngoài ra, các con số sẽ luôn hoạt động (không giống như sinh học thực tế), có nghĩa là bạn sẽ không có những thứ như thế (A,B,3) (B,C,4) (A,C,13).

Đầu vào

Đầu vào sẽ bắt đầu bằng một số ntheo sau là danh sách các gen (chữ in hoa). Sau đó sẽ có nbộ ba dữ liệu. Mỗi bộ sẽ bao gồm một cặp gen và sự vượt qua tần số (khoảng cách) của chúng.

3,P,H,I
P,H,3
H,I,1
P,I,4

7,A,B,G,Q,U
B,Q,4
A,B,10
G,U,13
Q,U,10
A,G,9
G,Q,3
A,Q,6

Đầu vào không được xác định một cách cứng nhắc, bởi vì các ngôn ngữ khác nhau có thể có những hạn chế về những gì khả thi. Ví dụ: bạn có thể thay đổi dấu phân cách thành thứ gì đó ngoài dấu phẩy và dòng mới. Định dạng đầu vào phần lớn là tùy thuộc vào bạn.

Đầu ra

Đầu ra sẽ là một biểu hiện của bản đồ gen. Nó sẽ bao gồm các gen (chữ in hoa) được đặt cách nhau bởi các khoảng thời gian sao cho khoảng cách được mô tả chính xác. Dưới đây là kết quả đầu ra cho các ví dụ trên.

P..HI  *or*  IH..P

BG..Q.....A...U  *or*  U...A.....Q..GB

Đây cũng không phải là một yêu cầu hoàn toàn cứng nhắc. Ví dụ: bạn có thể sử dụng một cái gì đó ngoài các dấu chấm, như dấu phẩy hoặc dấu cách.

Tiêu chí chiến thắng khách quan

Đối với một tiêu chí chiến thắng khách quan, đây là: Mỗi ngôn ngữ là một cuộc thi riêng biệt để ai có thể viết bài dự thi ngắn nhất, nhưng người chiến thắng chung cuộc sẽ là người chiến thắng hầu hết các cuộc thi phụ này. Điều này có nghĩa là một người trả lời bằng nhiều ngôn ngữ không phổ biến có thể đạt được lợi thế. Code-golf chủ yếu là một công cụ hòa nhập khi có nhiều hơn một giải pháp trong một ngôn ngữ: người có chương trình ngắn nhất được tín dụng cho ngôn ngữ đó.

Quy tắc, hạn chế và ghi chú

Chương trình của bạn có thể được viết bằng bất kỳ ngôn ngữ nào tồn tại trước ngày 20 tháng 12 năm 2013. Tôi cũng sẽ phải dựa vào cộng đồng để xác thực một số câu trả lời được viết bằng một số ngôn ngữ không phổ biến / bí truyền hơn, vì tôi không thể kiểm tra họ


Bảng xếp hạng hiện tại

Phần này sẽ được cập nhật định kỳ để hiển thị số lượng ngôn ngữ và những người đang dẫn đầu trong mỗi ngôn ngữ.

  • AutoHotkey (632) - Avi
  • dj (579) - rubik

Xếp hạng người dùng hiện tại

  1. Avi (1): AutoHotkey (632)
  2. rubik (1): dj (579)

Chúng ta nên bao gồm mã để đọc đầu vào? Hoặc chúng ta chỉ nên giả sử đầu vào được thông qua như là đối số đầu tiên của hàm?
Giày

@Jefffrey Tôi cho rằng một trong hai là tốt.
PhiNotPi

.. bảng xếp hạng? :-)
Avi

1
Giới hạn đầu vào là gì? Không quá nhiều n, nhưng chủ yếu là giới hạn cho việc vượt qua tần số (khoảng cách). Chúng ta có thể cho rằng nó sẽ luôn luôn, nói, ít hơn 1000?
rubik

@PhiNotPi: bạn có thể cung cấp thêm một vài trường hợp thử nghiệm không? Tôi gần như đã hoàn thành của tôi và tôi muốn kiểm tra nó nhiều hơn nữa.
rubik

Câu trả lời:


2

Tự động làm nóng (632)

f(i){
o:={},f:={},n:=0
loop,parse,i,`n
{
a:=A_LoopField
if A_index!=1
{
@:=Substr(a,1,1),#:=Substr(a,3,1),n+=($:=Substr(a,5))
if !IsObject(o[@])
o[@]:={}
if !IsObject(o[#])
o[#]:={}
o[@][#]:=o[#][@]:=$
}
}
f[n+1]:=@,f[@]:=n+1,a:=""
while !a
{
a:=0
for k,v in o
{
if !f[k]
{
c1:=c2:=s:=0
for k1,v1 in v
{
if f[k1]
if s
{
if (r1==f[k1]-v1)or(r1==f[k1]+v1)
c1:=r1
else r1:=c1:=""
if (r2==f[k1]-v1)or(r2==f[k1]+v1)
c2:=r2
else r2:=c2:=""
}
else
c1:=r1:=f[k1]+v1,c2:=r2:=f[k1]-v1,s:=1
}
if c1
f[c1]:=k,f[k]:=c1,a:=1
else if c2
f[c2]:=k,f[k]:=c2,a:=1
}
} 
}
loop % 2*n+1
{
v:=f[A_index]
if v
z:=1
r.=z?(!v?".":v):v
}
return Rtrim(r,".")
}

Mã có thể được rút ngắn hơn bằng cách đổi tên tất cả các vars thành 1 ký tự .. Sau đó sẽ có khoảng 610 ký tự.

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

v := "
(7,A,B,G,Q,U
B,Q,4
A,B,10
G,U,13
Q,U,10
A,G,9
G,Q,3
A,Q,6 
)"

msgbox % f(v)
msgbox % f("3,P,H,I`nP,H,3`nH,I,1`nP,I,4")

1

Con trăn 311

import sys,random
d=sys.stdin.readlines()
u=[]
r=g=0
m={}
l=d[0].split()[1:]
for a in l:m[a]=g;g+=1
for v in d[1:]:i=v.split();u+=[i];r+=int(i[2])
j=len(l)
y=range(j)
while any(abs(y[m[t]]-y[m[w]])!=int(p) for t,w,p in u):y=random.sample(range(r),j)
o=["."]*r
for a in m:o[y[m[a]]]=a
print "".join(o).strip(".")

Mã golf đầu tiên của tôi: D

(Tôi không chắc chắn với việc đếm, tôi chỉ đăng nó trực tuyến trong một số lượng ký tự)

Ý tưởng của thuật toán là khá xấu, nhưng nó ngắn. Hãy thử ngẫu nhiên tất cả các vị trí cho các Biểu tượng cho đến khi chúng thỏa mãn tất cả các ràng buộc. Đầu vào là với khoảng trắng chẳng hạn

3 P H I
P H 3
H I 1
P I 4

Nhấn sau đó CTRL + D trong bảng điều khiển để kết thúc việc đọc.

Đây là mã gốc vẫn sử dụng ',' làm dấu phân cách.

import sys, random
#data = sys.stdin.readlines()
data = [
"3,P,H,I",
"P,H,3",
"H,I,1",
"P,I,4"
]
container = []
max_range = 0
map = {}
map_counter = 0

line_split = data[0].split(',')[1:]
count = len(line_split) # Number of genes
for symbol in line_split:
    map[symbol] = map_counter
    map_counter += 1

for line in data[1:]:
    line_split = line.split(',')
    container.append(line.split(','))
    max_range += int(line_split[2])

restart = True
while restart == True:
    positions = random.sample(range(max_range), count) # Since this loop will take like forever, but some day it will produce the correct positions
    restart = False
    for symbol1, symbol2, distance in container:
        if abs(positions[map[symbol1]] - positions[map[symbol2]]) != int(distance):
            restart = True
            break

output = ["."] * max_range
for symbol in map:
    output[positions[map[symbol]]] = symbol
print "".join(output).strip(".") # Strip . to make it more pretty

0

dg - 717 579 byte

Một Python đang đến.

import '/sys'
w,o=list,tuple
p=g a b m->
 b in g=>a,b=b,a
 i,l,k=g.index a,w$g,w$g
 l!!(i+m),k!!(i-m)=b,b
 g!!(i+m)=='.'=>yield$o$l
 g!!(i-m)=='.'=>yield$o$k
g=t->
 d=sorted key:(i->snd i)$map((a,b,i)->((a,b),int i))$filter fst$map(i->i.split ',')$t.split '\n'
 (a,b),i=d.pop!
 g=w$('.',)*i*4
 g!!i,g!!(i+i)=a,b
 s=set'$o g
 while d=>
  d.sort key:((k,v)->set k&(set$fst$w s))
  n,(a,b),i=set! :+d.pop!
  for r in s=>
   if(a in r and b in r=>i==abs(r.index a-r.index b)=>n.add r)(1=>n.update$p r a b i)
   s = n
 '\n'.join$map(l->(''.join l).strip '.')s
print$g sys.stdin.read!

Ví dụ:

$ echo """P,H,3
H,I,1
P,I,4""" | dg dna.dg
P..HI
$ echo """B,Q,4
A,B,10
G,U,13              
Q,U,10
A,G,9
G,Q,3
A,Q,6""" | dg dna.dg
BG..Q.....A...U

0
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <malloc.h>

struct Gene
{
    char a1 , a2 ;
    int d ;
};
typedef struct Gene gene ;

struct Set
{
    int appr_id ;
    char CMN_char ;
};
typedef struct Set set ;

gene *stack;
int cp_id1 , cp_id2 , N=0 , cid , *used , n ;
char ucmn_char , *cmp1 , *cmp2 , *base , ep[15] ;                       
set ap_set ;


void randomize(void)
{   int i;
    Set temp;
    for(i=0;i<(n-1);i++)
    {
        temp=stack[i];
        stack[i]=stack[i+1];
        stack[i+1]=temp;
    }

    return;

}
void populate_ep ( char ucmn_char )
{
    int i;
    for ( i=0 ; ep[i] != '\0' ; i ++ );
        ep[ i ] = ucmn_char ;
}

set find_appr ( void )
{
    int i , j ;
    set s ;
    for ( i = 0 ; i < n ; i++ )
    {
        if ( used[ i ] == 1 )
            continue ;
        else
        {
            for ( j = 0 ; ep[ j ] != '\0' ; j++ )
            {
                if ( ep[ j ] == stack[ i ].a1 || ep[ j ] == stack[ i ].a2 )
                {
                    s.appr_id = i ;
                    s.CMN_char = ep[ j ] ;
                    return s ;
                }
            }
        }
    }
}

void destroy ( int id )
{
    used[ id ] = 1 ;
}

int get_center_id ( char a )
{
    int i ;
    for ( i = 0 ; i < N * 2 ; i++ )
        if ( base[ i ] == a )
            return i ;
}

int get_comparer ( void )
{
    int i , j , k ;
    for ( i = 0 ; i < n ; i ++ )
    {
        if ( used[ i ] == 0 )
        for ( j = 0 ; ep[ j ] != '\0' ; j ++ )
            if ( stack[ i ].a1 == ep[ j ])
                for ( k = 0 ; k < 15 ; k ++ )
                    if ( stack[ i ].a2 == ep[ k ] )
                        return i ;
    }
    printf ( "\nWrong set of genes....\n" ) ;
    exit ( 0 ) ;
}

void compare_and_merge ( int cid, int cp_id1, int cp_id2 )
{
    int base_cp_id , i ;
    char temp = ( ucmn_char == stack[ cid ].a1 ) ? stack[ cid ].a2 : stack[ cid ].a1 ;
    for ( i = 0 ; i < N * 2 ; i ++ )
        if ( base[ i ] == temp )
            base_cp_id = i ;
    if ( stack[ cid ].d == ( sqrt ( pow ( ( cp_id1 - base_cp_id ) , 2 ) ) ) )
    {   
        base[ cp_id1 ] = cmp1[ cp_id1 ] ;
        return ;
    }
    else
    {
        base[ cp_id2 ] = cmp2[ cp_id2 ] ;
        return ;
    }
}

void show_stack ( void )
{
    int i ;
    printf ( "The gene sets you entered are: \n" ) ;
    printf ( "____________\n" ) ;
    for ( i = 0 ; i < n ; i ++ )
        if ( used[ i ] == 0 )
            printf ( "%c %c %d\n" , stack[i].a1, stack[i].a2, stack[i].d ) ;
    printf ( "____________\n" ) ;
}

int main ( void )
{
    printf ( "Enter number of gene sets: " ) ;
    scanf ( "%d" , &n ) ;
    stack = ( gene* ) calloc ( n , sizeof ( gene ) ) ;
    used = ( int* ) calloc ( n , sizeof ( int ) ) ;
    int i ;
    N = 0 ;
    for ( i = 0 ; i < n ; i ++ )
    {
        char y[ 2 ] ;
        scanf ( "%s" , y ) ;
        stack[ i ].a1 = y[ 0 ] ;
        scanf ( "%s" , y ) ;
        stack[ i ].a2 = y[ 0 ] ;
        scanf ( "%d" , &stack[ i ].d ) ;
        N += stack[ i ].d ;
        used[ i ] = 0 ;
        fflush ( stdin ) ;
    }   
    randomize();
    show_stack ( ) ;
    int ff ;
    strcpy ( ep , " " ) ;
    cmp1 = ( char* ) calloc ( N * 2 , sizeof ( char ) ) ;
    cmp2 = ( char* ) calloc ( N * 2 , sizeof ( char ) ) ;
    base = ( char* ) calloc ( N * 2 , sizeof ( char ) ) ;
    for ( i = 0 ; i < N * 2 ; i ++ )
        base[ i ] = cmp1[ i ] = cmp2[ i ] = '=' ;
    base[ N ] = stack[ 0 ].a1 ;
    base[ N + stack[ 0 ].d ] = stack[ 0 ].a2 ;
    destroy ( 0 ) ;
    ep[ 0 ] = stack[ 0 ].a1 ;
    ep[ 1 ] = stack[ 0 ].a2 ;
    for ( ff = 0 ; ff < n / 2  ; ff ++ )
    {
        ap_set = find_appr ( ) ;
        cmp1[ get_center_id ( ap_set.CMN_char ) ] = ap_set.CMN_char ;
        cmp2[ get_center_id ( ap_set.CMN_char ) ] = ap_set.CMN_char ;
        ucmn_char = ( stack[ ap_set.appr_id ].a1 == ap_set.CMN_char ) ? stack[ ap_set.appr_id ].a2 : stack[ ap_set.appr_id ].a1;
        cmp1[ cp_id1 = get_center_id ( ap_set.CMN_char ) + stack[ ap_set.appr_id ].d ] = ucmn_char ;
        cmp2[ cp_id2 = get_center_id ( ap_set.CMN_char ) - stack[ ap_set.appr_id ].d ] = ucmn_char ;
        populate_ep ( ucmn_char ) ;
        destroy ( ap_set.appr_id ) ;
        cid = get_comparer ( ) ;
        compare_and_merge ( cid , cp_id1 , cp_id2 ) ;
        destroy ( cid ) ;
    }
    int start , end ;
    for ( i = 0 ; i < N * 2 ; i ++ )
        if ( base[ i ] != '=' )
        {
            start = i ;
            break ;
        }
    for ( i = N * 2 - 1 ; i >= 0 ; i -- )
        if ( base[ i ] != '=' )
        {
            end = i ;
            break ;
        }
        for ( i = start ; i <= end ; i ++ )
            printf( "%c" , base[ i ] ) ;
    printf( "\n\n" ) ;
}

3
Chào mừng đến với PPCG! Đây là mã golf, vì vậy vui lòng cho thấy một số nỗ lực để giải quyết vấn đề với số lượng mã tối thiểu. Để bắt đầu, bạn có thể loại bỏ tất cả các khoảng trắng không cần thiết và sử dụng tên biến, tên cấu trúc và hàm đơn. Ngoài ra, vui lòng bao gồm ngôn ngữ và tổng số byte ở đầu câu trả lời của bạn.
Martin Ender
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.