罗塞塔石挑战的目标是用尽可能多的语言编写解决方案。炫耀你的编程多种语言!
挑战
你面临的挑战是用尽可能多的编程语言实现一个使用交叉频率绘制一些基因图谱的程序。您可以使用您的语言所拥有的任何类型的标准库函数,因为这主要是语言展示。
?
基因定位是在染色体上定位基因的相对位置的过程。这是通过测量基因对的杂交频率来实现的,这相当于一对基因不能一起遗传的后代的百分比。距离是以地图单位来测量的,一个地图单位等于交叉的百分之一。例如,如果C& D基因的杂交频率为11%,则C基因与D基因之间的距离为11个map单位。
基因作图是用多对基因来确定它们的相对顺序。例如,数据(A,B,12) (D,B,7) (A,D,5) (D,H,2) (H,B,9)生成以下映射:
A..H.D......B您可能已经注意到,B......D.H..A也是一个有效的映射。这是真的,因为不可能区分镜像对立面。你的程序可以选择输出哪一个。虽然输入可能不包括每个可能的对,但始终有足够的信息来重建整个映射(因此不会有超过2个有效的输出)。此外,数字总是可以计算出来的(不像实际的生物学),这意味着你不会有像(A,B,3) (B,C,4) (A,C,13)这样的东西。
输入将从一个数字n开始,然后是一个基因列表(大写字母)。然后将有n三胞胎的数据。每组将包括一对基因和他们的杂交频率(距离)。
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输入不是严格定义的,因为不同的语言可能对哪些是可行的有限制。例如,可以将分隔符更改为逗号和换行符以外的其他内容。输入格式很大程度上取决于您。
输出将是基因图谱的再现。它将由基因(大写字母)组成,这些基因由时间间隔而成,这样距离就能被准确地描绘出来。以下是上述示例的输出。
P..HI *or* IH..P
BG..Q.....A...U *or* U...A.....Q..GB这也不是一个完全僵化的要求。例如,您可以使用句点以外的其他东西,如逗号或空格。
至于一个客观的获胜标准,这里是:每种语言都是一个独立的竞赛,谁能写出最短的条目,但总体的赢家将是谁赢得了这些子竞赛中的大多数。这意味着一个用许多不寻常的语言回答问题的人可以获得优势。代码-当一种语言中有不止一种解决方案时,高尔夫主要是一种平局者:程序最短的人因该语言而获得学分。
你的程序可以用2013年12月20日之前的任何语言编写。我还必须依靠社区来验证用一些不常见/深奥的语言编写的一些响应,因为我不太可能对它们进行测试。
本节将定期更新,以显示语言的数量和谁在每一种语言中处于领先地位。
发布于 2015-02-06 23:14:03
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(".")(我不确定计数,我只是把它放在网上的字符计数)
这个算法的思想很糟糕,但很短。随机地尝试符号的所有位置,直到它们满足所有约束。例如,输入带有空格。
3 P H I
P H 3
H I 1
P I 4点击控制台中的CTRL+D结束读取。
这里是原代码,它仍然使用',‘作为分隔符。
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发布于 2015-02-06 13:41:11
#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" ) ;
}https://codegolf.stackexchange.com/questions/16885
复制相似问题