# Child Genotypes

The Challenge

Everybody loves genetics, right? In this challenge, you will be given the genotypes of two parents. You must find each possible genotype of a child produced by the parents. You must account for dominant and recessive alleles as well as incomplete dominance and codominance.

An example input for the parents could be:

R'RxRr


Parent one (on the left) has a incompletely dominant R allele and a dominant R allele. Parent two (on the right) has a dominant R allele and a recessive allele.

Each parent is separated from the other by an x. The input will not contain an x allele.

An incompletely dominant allele will be followed by an apostrophe ('). Codominant alleles just refers to multiple different types of alleles combined together (A and W for example).

Rules

• Shortest code wins (measured in bytes).
• Each possibly genotype must be separated from the other genotypes by a comma.
• Phenotypes don't matter.
• Any letter can be used in the input except for x (which differentiates the parents).
• Duplicate genotypes should only be printed once.
• Duplicates contain the exact same letters of the same case and type of allele. IF you have WY and YW in your answer, they are considered duplicates.
• No more than three different letters will be used in one input.
• The order of the letters in the output does not matter.
• Answer can be in the form of a string or an array.

Examples

Input 1 (the previous example):

R'RxRr


Output 1:

R'R,R'r,RR,Rr


Alternate output 1 (array):

{R'R,R'r,RR,Rr}


Input 2:

RWxRR


Output 2:

RR,WR
//Or an array, whichever you want


Input 3:

WYxY'y


Output 3:

WY',Wy,YY',Yy
//Once again, an array is fine

• Can the output be an array? – Doorknob Mar 31 '16 at 1:11
• Sure. I'll add that to the rules. – NuffsaidM8 Mar 31 '16 at 1:13
• codegolf.stackexchange.com/questions/76428/… duplicate, flagged as – Leaky Nun Mar 31 '16 at 1:26
• @KennyLau Are you sure? I don't see how they're all that similar. – Alex A. Mar 31 '16 at 1:53
• @NuffsaidM8 Can you add some examples of dominant/recessive allele test cases which can demonstrate that it's not just a simple case of "removing duplicates" as Kenny alludes to? It would also allow people to more easily verify that their code meets all the corner cases. – Chris Jester-Young Mar 31 '16 at 1:58

## Pyth, 20 18 bytes

{msSd*Fc:z".'?"1\x


Test suite.

         z          get input
: ".'?"1    regex match for any character followed by an optional '
c        \x  chop on the element "x", resulting in [["R'","R"],["R","r"]]
*F             splat over Cartesian product, resulting in pairs of "genes"
from the first "parent" and from the second
m  d               map over each resulting pair...
S                sort (so that we can dedup later)
s                 concatenate
{                   remove duplicates


# JavaScript (ES6), 11411210490 88 bytes

f=>(c=new Set,[z,y]=f.splitx.map(b=>b.match(/.'?/g)),z.map(e=>y.map(g=>c.add(e+g))),c)


Thanks to Doorknob, Downgoat, Kenny Lau and Neil for helping me golf this down a bit :)

• The \w can be replaced by . (because there will not be ψ') – Leaky Nun Mar 31 '16 at 2:10
• ... which means you can shorten the regex to /.'?/g (note the removed i flag, which was unnecessary in the first place), the one I used in my answer. – Doorknob Mar 31 '16 at 2:11
• The i (case-insensitive) tag can be removed as well (as well as the g global tag?). – Leaky Nun Mar 31 '16 at 2:11
• Thanks guys! @KennyLau, you can't take the g flag off, otherwise it results in undefined – Quill Mar 31 '16 at 2:21
• This fails for ABxAB, since AB and BA are identical.for the purposes of the challenge. – Doorknob Mar 31 '16 at 2:26

# Ruby, 82 77 bytes

Anonymous function, takes the input string as its argument.

Edited to properly account for ABxAB.

-5 bytes from @Doorknob.

->g{a,b=g.split(?x).map{|s|s.scan /.'?/}
a.product(b).map{|s|s.sort*""}.uniq}

• .map(&:sort).uniq.map &:join is shorter as .map{|x|x.sort*''}.uniq. – Doorknob Mar 31 '16 at 2:31
• Nice! I learned a new Ruby shorthand today! – Value Ink Mar 31 '16 at 2:40

# Python 3.5 - 196 bytes:

def b(r):import itertools,re;r=[];[r.append(h)for h in itertools.permutations(re.sub("(?<=[a-zA-Z'])(?=[a-zA-Z])",' ',r.replace('x','')).split(' '),2)if h[::-1]not in r and h not in r];return r


A nice one liner, using some regular expressions.

Note: Around each letter with an apostrophe are double quotes, and I hope that's okay (e.g., in the output, R' would come out as "R'"). Also, for the last test case, it returns [('W', "Y'"), ('W', 'y'), ('Y', 'W'), ('Y', "Y'"), ('Y', 'y'), ('y', "Y'")] instead of just WY',Wy,YY',Yy. I also hope that is okay. If any of these conditions are an issue, just let me know, and I will fix them.

• YW and WY are considered duplicates for this challenge, and it is therefor against the rules to print both of them. I have added a bit of clarification to the rules to avoid this in the future. – NuffsaidM8 Apr 1 '16 at 12:25
• @NuffsaidM8 Actually. If you look closer, one of them is W,"Y'", whereas the other is just Y,W. Like I said in my answer, those letters with an apostrophe in front of them will have a pair of quotes around them, so the "duplicates" you are talking about are not really duplicates. One of them is incomplete dominance, whereas the other signifies codominance. – R. Kap Apr 1 '16 at 17:04
• I apologize, I was looking at the second and third output yet completely ignored the fact that one is a dominant y and one is recessive! – NuffsaidM8 Apr 1 '16 at 18:41