Code: Alles auswählen
#!/usr/bin/env io
Regex
dnaToRna := Map with("T", "A", "A", "U", "C", "G", "G", "C")
rnaToAminoAcid := Map with(
"AAA", "Lys", "AAC", "Asn", "AAG", "Lys", "AAU", "Asn", "ACA", "Thr",
"ACC", "Thr", "ACG", "Thr", "ACU", "Thr", "AGA", "Arg", "AGC", "Ser",
"AGG", "Arg", "AGU", "Ser", "AUA", "Ile", "AUC", "Ile", "AUG", "Met",
"AUU", "Ile", "CAA", "Gln", "CAC", "His", "CAG", "Gln", "CAU", "His",
"CCA", "Pro", "CCC", "Pro", "CCG", "Pro", "CCU", "Pro", "CGA", "Arg",
"CGC", "Arg", "CGG", "Arg", "CGU", "Arg", "CUA", "Leu", "CUC", "Leu",
"CUG", "Leu", "CUU", "Leu", "GAA", "Glu", "GAC", "Asp", "GAG", "Glu",
"GAU", "Asp", "GCA", "Ala", "GCC", "Ala", "GCG", "Ala", "GCU", "Ala",
"GGA", "Gly", "GGC", "Gly", "GGG", "Gly", "GGU", "Gly", "GUA", "Val",
"GUC", "Val", "GUG", "Val", "GUU", "Val", "UAA", "STOP", "UAC", "Tyr",
"UAG", "STOP", "UAU", "Tyr", "UCA", "Ser", "UCC", "Ser", "UCG", "Ser",
"UCU", "Ser", "UGA", "STOP", "UGC", "Cys", "UGG", "Trp", "UGU", "Cys",
"UUA", "Leu", "UUC", "Phe", "UUG", "Leu", "UUU", "Phe"
)
MappingException := Exception clone
getKeyLength := method(mapping, mapping detect(true) at(0) size)
checkMapping := method(mapping,
keyLength := getKeyLength(mapping)
keyCharacters := Map clone
mapping keys foreach(key, (key size != keyLength) ifTrue(
MappingException raise(
"all keys must have the same length (#{keyLength}), found: #{key serialized}" interpolate
)
)
key foreach(value, keyCharacters atPut(value asCharacter, true))
)
expectedSize := keyCharacters size pow(keyLength)
(expectedSize == mapping size) ifFalse(
MappingException raise(
"expected #{expectedSize} entries, got #{mapping size}" interpolate
)
)
)
Sequence mappedReplace := method(mapping, separator,
checkMapping(mapping)
pattern := "." repeated(getKeyLength(mapping))
self matchesOfRegex(pattern) map(match, mapping at(match at(0)) ifNil(
MappingException raise(
"unknown old value #{match at(0) serialized} found" interpolate
)
)
) join(separator)
)
main := method(
dna := "GTACTCTTA"
" DNA: #{dna}" interpolate println
mRna := dna mappedReplace(dnaToRna, "")
" mRNA: #{mRna}" interpolate println
aminoAcids := mRna mappedReplace(rnaToAminoAcid, " ")
"aminos: #{aminoAcids}" interpolate println
)
isLaunchScript ifTrue(main)
Hier sieht man, dass die beiden Ersetzungsschritte — DNA → mRNA und mRNA → Aminosäuren im Grund das gleiche sind, nur mit anderen Abbildungen (und damit Ersetzungslängen) und anderen Trennzeichen beim Ergebnis. Beides kann aber mit der gleichen Methode erledigt werden.
In Python könnte man auch reguläre Ausdrücke verwenden, aber da würde ich wie schon angesprochen eher „slicing“ verwenden, weil das in Python IMHO leichter anzuwenden ist. Zum einen weil es dafür Syntax gibt, und weil man in einer „list comprehension“ oder einem Generatorausdruck den Sonderfall eines nicht vollständigen Endes leichter abfragen kann. Wobei man natürlich auch vorher schon ein korrektes Ende für diesen Fall berechnen könnte. Mal schauen, vielleicht schreibe ich die `Sequence mappedReplace`-Methode noch mal mit Slicing um.