Небольшой урок генетики
Когда у вас есть доступ только к чьим-то видимым чертам или фенотипу , родословная их семейной истории часто используется для выяснения фактической генетической информации или генотипа каждого члена семьи.
Когда мы будем иметь дело с простым доминированием , простой диаграммы родословной будет достаточно, чтобы выяснить аллели или версию генов каждого человека. При простом доминировании человек с доминантным аллелем (обозначаемый заглавной буквой) всегда будет иметь черту, которую представляет эта версия, независимо от другого аллеля. Требуется два рецессивных аллеля (обозначенных строчной буквой), чтобы выразить эту версию. Другими словами, доминантный аллель всегда маскирует рецессивную версию этого гена. Вот пример родословной:
Каждый ряд здесь - это поколение. Круги женские, мужские квадраты, горизонтальные линии - брак, вертикальные линии - дети. Довольно просто Черный означает рецессивный фенотип, белый - доминантный. Начиная сверху (предположим, что аллели A
и a
), мы знаем, что у человека 2 aa
гомозиготный рецессивный, потому что это единственный возможный вариант рецессивного фенотипа. Теперь, даже если человек один может быть Aa
или AA
доминирующим фенотипом, потому что у него рецессивный ребенок, он должен быть Aa
или гетерозиготным. Вы можете сделать это для всех других людей. В случае , если у вас нет никакой информации , которая позволяет выяснить вторую аллель, это может быть сделано следующим образом: A_
.
Твое задание
- Вы получите родословную в виде списка поколений, как
[GenI, GenII, etc.]
в любом нормальном формате. - Каждое поколение будет списком строк, каждая строка представляет человека.
- Люди состоят из трех частей - удостоверения личности, их фенотипа и их «связей».
- Их идентификатор - это один печатный символ ascii, который уникален во всем дереве, кроме
A
илиa
. (Нет, на графике будет не более 95 человек). - Их фенотип один из
A
илиa
,A
будучи доминантный аллель, иa
будучи рецессивным. - Их соединения представляют собой последовательность идентификаторов других людей, с которыми они связаны.
- Связь в одном поколении - это брак, в разных поколениях - ребенок и родитель.
- Связи повторяются с обеих сторон (то есть муж говорит, что он муж жены, а жена говорит, что она муж жены).
- Вы должны выяснить генотипы каждого как можно больше.
- Верните тот же список, за исключением того, что вместо людей поместите их генотипы в ту же позицию.
- Генотип должен быть выведен по порядку,
Aa
а неaA
. - Небольшая свобода в формате ввода в порядке.
- Это код-гольф, поэтому выигрывает самый короткий ответ в байтах .
Примеры
[["0A1234", "1a0234"], ["2A01", "3a01", "4A015678",
"5a4678"], ["6a45", "7A45","8A45"]] (The one above) ->
[["Aa", "aa"], ["Aa", "aa", "Aa", "aa"], ["aa", "Aa", "Aa"]]
[["0A12", "1A02"], ["2A301", "3a2"]] ->
[["A_", "A_"], ["A_", "aa"]]
бонус
- -30 байт, если вы имеете дело с неполным и совместное доминирование также. При обнаружении трех фенотипов вместо двух во всей диаграмме примените к вашему алгоритму неполное / совместное доминирование.
источник
A
иa
и оставлять идентификаторы и соединения как есть (то есть[["0A12","1A02"],["2A301","3a2"]]
становится[["0A_12","1A_02"],["2A_301","3aa2"]]
вместо[["A_","A_"],["A_","aa"]]
)?Ответы:
05AB1E , 39 байт
Порт моего Java ответа .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Java 10,
356349340 байтПопробуйте онлайн.
Общее объяснение:
1) Любой
a
всегда будетaa
2a) Если у ребенка
A
есть родители,aa
иA
он станетAa
2b) Если у ребенка
A
есть родители,A
иA
он станетA_
2c) (Ребенок не
A
может иметь родителейaa
иaa
)3a) Если у родителя
A
есть хотя бы один ребенокa
, он станетAa
3b) Если у родителя
A
есть только детиA
, он станетA_
Объяснение кода:
источник