科学家最近发现了一种新型细菌,这种细菌以奇怪的方式复制。为了繁殖,两种细菌各分裂成3种(总共6种)并结合在一起(产生3种细菌,两种亲本,一种孩子)。然而,这种细菌只有在有伴侣的情况下才能分裂。例如,两个细菌分裂并结合成3,3,4,6等等。另外,当细菌分裂时,只有一个子细胞与另一个母细胞的子细胞结合,反之亦然。换句话说,如果细菌A和B分裂,子代细胞将结合为AA,AB和BB。
挑战
你面临的挑战是制作一个接受或生成4种细菌DNA的程序,每个程序都带有10位第四纪格式中的一条链。例如DNA链可能是0123302012。当两个子细菌结合在一起时,DNA就会被合并成一种四方形的方式( DNA可以在每一对中合并,或者只有AB对,你的选择)。说明0是隐性性状,1是混合性状,2是显性性状。然而,当有一个3,它是一个突变的特点(更多的这一点稍后)。从这4种细菌开始,让你的程序运行20次试验(4次分裂为6次将是第一次试验)。一旦完成,让程序输出通过STDOUT (或等效)每个细胞的DNA分离线,但只有从第20次试验产生的细胞。
上传递
在平底洞式中,DNA从父母传给孩子,其中:
如果其中一个性状是3 (a突变),则结束性状是随机决定的,但如果两者都是3,则结束性状为3。父母可以随机或按顺序(A & B、C& D等)决定。
示例:
| DNA A | DNA B | DNA C (Child) |
| 0123311200 | 1203123213 | 0113012203 |这是密码高尔夫,所以最短的字符计数获胜!为了清晰起见,如果可能的话,请包含一个将代码分隔成多行的版本。如果挑战没有得到很好的解释,或者你有建议,发表评论!
下面是一个成功完成挑战的示例程序(在java中):Ideone链接。
发布于 2015-02-05 04:47:56
import Control.Monad
import System.Random
import Data.List
a=[0,1,2,3,3,1,1,2,0,0]
b=[a,a,a,a]
f 3 _=randomRIO(0,3)
f _ 3=randomRIO(0,3)
f x y=return$div(x+y)2
z::[Integer]->[Integer]->IO[Integer]
z x y=zipWithM f x y
c=filter(\x->length x==2).subsequences
r=sequence.map(\x->z(x!!0)(x!!1)).c
y=foldr(<=<)return.replicate 20
main=y r b>>=mapM_ print用更好看的源代码:http://ideone.com/9FUMLd在线试用
由于时间的限制,网上的例子只能持续到2,而不是20。
https://codegolf.stackexchange.com/questions/45375
复制相似问题