Bioinformatics/Sequence mutation: Difference between revisions

Content added Content deleted
(Promote to full task status.)
(Add Swift)
Line 1,012: Line 1,012:
T: 72
T: 72
TOT= 251</pre>
TOT= 251</pre>

=={{header|Swift}}==

<lang swift>let bases: [Character] = ["A", "C", "G", "T"]

enum Action: CaseIterable {
case swap, delete, insert
}

@discardableResult
func mutate(dna: inout String) -> Action {
guard let i = dna.indices.shuffled().first(where: { $0 != dna.endIndex }) else {
fatalError()
}

let action = Action.allCases.randomElement()!

switch action {
case .swap:
dna.replaceSubrange(i..<i, with: [bases.randomElement()!])
case .delete:
dna.remove(at: i)
case .insert:
dna.insert(bases.randomElement()!, at: i)
}

return action
}

var d = ""

for _ in 0..<200 {
d.append(bases.randomElement()!)
}

func printSeq(_ dna: String) {
for startI in stride(from: 0, to: dna.count, by: 50) {
print("\(startI): \(dna.dropFirst(startI).prefix(50))")
}

print()
print("Size: \(dna.count)")
print()

let counts = dna.reduce(into: [:], { $0[$1, default: 0] += 1 })

for (char, count) in counts.sorted(by: { $0.key < $1.key }) {
print("\(char): \(count)")
}
}

printSeq(d)

print()

for _ in 0..<20 {
mutate(dna: &d)
}

printSeq(d)</lang>

{{out}}

<pre>0: CCCTGTTACCCTTAAGTCACAAATCATGATAAGCAGCCTTCGAGCACTTC
50: GTGTCAAGCCTGATTCGAGCGCGCCGGTCATCCTCCGATAGAGCACGGGG
100: ACGCCCGCACTACCCCACTGGCGCTTGGTCGCTGAATAGGGCGCCCTTGG
150: TGGTGGATGGTCTTAAGCTGTCGCAAATCTAGCCCCGACCAAGAGAAGGC

Size: 200

A: 43
C: 62
G: 54
T: 41

0: CCCTGTTACCCTTAAGTCACAAATCATGTATAAAGCAGCCTTCGAGCACT
50: TCGTGTCAAGCCTGATTCGAGCGCGCTAGGGCATCCTCCGTATAAGAGCA
100: CCGGGGACGCCCGCACTTACCACCACTGGCGCTTGGTCGCGAATAGGGGC
150: GCCCTTTGGTGGTGGATTGGTCTTAAGTGTCGCAAATCTAGCCCCCGACC
200: AAGAGAAGGC

Size: 210

A: 47
C: 62
G: 56
T: 45</pre>


=={{header|zkl}}==
=={{header|zkl}}==