রোসটা স্টোন চ্যালেঞ্জ: জিন ম্যাপিং


11

রোজটা স্টোন চ্যালেঞ্জের লক্ষ্য হ'ল যতটা সম্ভব ভাষায় সমাধান লিখুন। আপনার প্রোগ্রামিং বহুভাষিকতা দেখান!

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি এমন একটি প্রোগ্রাম বাস্তবায়ন করা যা যতটা সম্ভব প্রোগ্রামিং ভাষায় যতটা সম্ভব ক্রস-ওভার ফ্রিকোয়েন্সি ব্যবহার করে কিছু জিনের মানচিত্র তৈরি করে । আপনার ভাষাতে যে কোনও প্রকারের স্ট্যান্ডার্ড লাইব্রেরি ফাংশন ব্যবহার করার অনুমতি রয়েছে, কারণ এটি বেশিরভাগই একটি ভাষা শোকেস।

"জিন ম্যাপিং" কী?

জিন ম্যাপিং ক্রোমোজোমে জিনের আপেক্ষিক অবস্থান চিহ্নিতকরণ প্রক্রিয়া ating এটি যুগের জিনের ক্রসিং-ওভার ফ্রিকোয়েন্সি পরিমাপের মাধ্যমে সম্পন্ন করা হয়, বংশের শতকরা ভাগের সমান যে জুটি একসাথে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না । ওপারের এক শতাংশের সমান এক মানচিত্রের ইউনিট সহ মানচিত্র ইউনিটগুলিতে দূরত্ব পরিমাপ করা হয় । উদাহরণস্বরূপ, জিন সি ও ডি যদি 11% এর ক্রসিং-ওভার ফ্রিকোয়েন্সি করে তবে জিন সি জিন ডি থেকে 11 ম্যাপ ইউনিটের দূরত্ব is

জিন ম্যাপিং তাদের আপেক্ষিক ক্রম নির্ধারণ করতে একাধিক জোড়া জিনের সাথে সঞ্চালিত হয়। উদাহরণস্বরূপ, ডেটা (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

এটিও সম্পূর্ণ অনড় প্রয়োজন নয়। উদাহরণস্বরূপ আপনি পিরিয়ড ব্যতীত অন্য কিছু ব্যবহার করতে পারেন যেমন কমা বা স্পেস।

উদ্দেশ্য বিজয়ী মানদণ্ড

একটি উদ্দেশ্যমূলক বিজয়ী মানদণ্ড হিসাবে, এখানে: প্রত্যেকটি ভাষা স্বল্পতম এন্ট্রি লিখতে পারে সে সম্পর্কে পৃথক প্রতিযোগিতা, তবে সামগ্রিক বিজয়ী ব্যক্তি এই উপ-প্রতিযোগিতাগুলির মধ্যে সবচেয়ে বেশি জয়ী হবেন। এর অর্থ হ'ল যে ব্যক্তি বহু অস্বাভাবিক ভাষায় উত্তর দেন সে সুবিধা পেতে পারে। কোড-গল্ফ বেশিরভাগ ক্ষেত্রেই যখন একটি ভাষায় একাধিক সমাধান থাকে তখন একটি টাইব্রেকার: সংক্ষিপ্ততম প্রোগ্রাম সহ ব্যক্তি সেই ভাষার জন্য কৃতিত্ব পান।

বিধি, বিধিনিষেধ এবং নোটস

আপনার প্রোগ্রামটি ২০ শে ডিসেম্বর, ২০১৩ এর আগে বিদ্যমান যে কোনও ভাষায় লেখা যেতে পারে I আরও কিছু অস্বাভাবিক / রহস্যময় ভাষায় রচিত কিছু প্রতিক্রিয়া যাচাই করতে আমাকে সম্প্রদায়ের উপরও নির্ভর করতে হবে, যেহেতু আমার পরীক্ষা করার সম্ভাবনা নেই am তাদের।


বর্তমান লিডারবোর্ড

ভাষার সংখ্যা এবং প্রত্যেকটিতে কে নেতৃত্ব দিচ্ছেন তা প্রদর্শনের জন্য এই বিভাগটি পর্যায়ক্রমে আপডেট করা হবে।

  • অটোহটকি (632) - আভি
  • ডিজে (579) - রুবিক

বর্তমান ব্যবহারকারী র‌্যাঙ্কিং

  1. আভি (1): অটোহটকি (632)
  2. রুবিক (1): ডিজে (579)

ইনপুট পড়ার জন্য আমাদের কি কোড অন্তর্ভুক্ত করা উচিত? বা আমরা কি কেবল অনুমান করি যে ইনপুটটি ফাংশনের প্রথম যুক্তি হিসাবে পাস হয়েছে?
জুতো

@ জেফফ্রে আমি মনে করি উভয়ই ভাল আছেন।
PhiNotPi

.. লিডারবোর্ড? :-)
আভি

1
ইনপুট সীমা কি? এত বেশি নয় n, তবে প্রাথমিকভাবে ক্রসিং ওভার ফ্রিকোয়েন্সি (দূরত্ব) এর সীমা। আমরা কি ধরে নিতে পারি যে এটি সর্বদা থাকবে, বলুন, এর চেয়ে কম 1000?
রুবিক

@ ফিলনটপি: আপনি আরও কয়েকটি পরীক্ষার মামলা সরবরাহ করতে পারেন? আমি প্রায় আমার শেষ করেছি এবং আমি এটি আরও পরীক্ষা করতে চাই।
রুবিক

উত্তর:


2

অটোহটকি (2৩২)

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,".")
}

কোডটি সমস্ত বর্ণকে 1 টি বর্ণের নাম দিয়ে আরও সংক্ষিপ্ত করা যেতে পারে .. এটি তখন প্রায় 610 টি অক্ষর হওয়া উচিত।

পরীক্ষার কেস

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

পাইথন 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(".")

আমার প্রথম কোড-গল্ফ: ডি

(গণনার সাথে আমি নিশ্চিত নই, আমি কেবল একটি চরিত্রের গণনায় এটি অনলাইনে পোস্ট করেছি)

অ্যালগরিদমের ধারণাটি বেশ খারাপ, তবে এটি সংক্ষিপ্ত। প্রতীকগুলির জন্য সমস্ত অবস্থান সীমাবদ্ধ না করা অবধি অবধি চেষ্টা করুন। ইনপুট উদাহরণস্বরূপ সাদা স্থানের সাথে রয়েছে

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

রিডিং শেষ করতে কনসোলে সেই সিটিআরএল + ডি এর পরে হিট করুন।

এখানে মূল কোড যা এখনও ',' ডিলিমিটার হিসাবে ব্যবহার করে।

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

ডিজি - 717 579 বাইট

একটি পাইথন আসন্ন।

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!

উদাহরণ:

$ 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
পিপিসিজিতে আপনাকে স্বাগতম! এটি কোড গল্ফ, সুতরাং কোডের ন্যূনতম পরিমাণে সমস্যাটি সমাধান করার জন্য দয়া করে কিছু প্রচেষ্টা দেখান। শুরু করার জন্য আপনি সমস্ত অপ্রয়োজনীয় সাদা স্থান সরিয়ে ফেলতে এবং একক-বর্ণের ভেরিয়েবল, স্ট্রাক্ট এবং ফাংশন নাম ব্যবহার করতে পারেন। আপনার উত্তরের শীর্ষে ভাষা এবং মোট বাইট-গণনাটিও অন্তর্ভুক্ত করুন।
মার্টিন ইন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.