Verified equivalents
The same computation in BioLang, Python and R. Every trio on this page is run in all three languages by the correctness suite and compared — floats to 1e-9, integers and strings exactly — so these are checked translations rather than plausible ones.
48 cases. Only the BioLang tab has a Run button, because only
BioLang runs in the browser; every tab can be copied. Add a case by
adding one row to
benchmarks/correctness/oneliners/cases.tsv, and it appears
here once it passes.
Sequences
gc_content_even
println(gc_content(dna"ACGTACGT"))
from Bio.SeqUtils import gc_fraction
print(gc_fraction("ACGTACGT"))
print(sum(strsplit("ACGTACGT","")[[1]] %in% c("G","C"))/8)
Returns 0.5 in BioLang, 0.5 in Python, 0.5 in R.
gc_content_gc_rich
println(gc_content(dna"GGGGCCCC"))
from Bio.SeqUtils import gc_fraction
print(gc_fraction("GGGGCCCC"))
print(sum(strsplit("GGGGCCCC","")[[1]] %in% c("G","C"))/8)
Returns 1 in BioLang, 1 in Python, 1 in R.
gc_content_at_only
println(gc_content(dna"AAATTT"))
from Bio.SeqUtils import gc_fraction
print(gc_fraction("AAATTT"))
print(sum(strsplit("AAATTT","")[[1]] %in% c("G","C"))/6)
Returns 0 in BioLang, 0 in Python, 0 in R.
reverse_complement
println(str(reverse_complement(dna"ACGTACGT")))
from Bio.Seq import Seq
print(str(Seq("ACGTACGT").reverse_complement()))
library(Biostrings)
print(as.character(reverseComplement(DNAString("ACGTACGT"))))
Returns "ACGTACGT" in BioLang, "ACGTACGT" in Python, "ACGTACGT" in R.
reverse_complement_palindrome
println(str(reverse_complement(dna"GAATTC")))
from Bio.Seq import Seq
print(str(Seq("GAATTC").reverse_complement()))
library(Biostrings)
print(as.character(reverseComplement(DNAString("GAATTC"))))
Returns "GAATTC" in BioLang, "GAATTC" in Python, "GAATTC" in R.
complement
println(str(complement(dna"ACGTACGT")))
from Bio.Seq import Seq
print(str(Seq("ACGTACGT").complement()))
library(Biostrings)
print(as.character(complement(DNAString("ACGTACGT"))))
Returns "TGCATGCA" in BioLang, "TGCATGCA" in Python, "TGCATGCA" in R.
transcribe
println(str(transcribe(dna"ACGTACGT")))
from Bio.Seq import Seq
print(str(Seq("ACGTACGT").transcribe()))
print(gsub("T","U","ACGTACGT"))
Returns "ACGUACGU" in BioLang, "ACGUACGU" in Python, "ACGUACGU" in R.
translate_simple
println(str(translate(rna"AUGGCCAUUGUA")))
from Bio.Seq import Seq
print(str(Seq("AUGGCCAUUGUA").back_transcribe().translate()))
library(Biostrings)
print(as.character(translate(RNAString("AUGGCCAUUGUA"))))
Returns "MAIV" in BioLang, "MAIV" in Python, "MAIV" in R.
translate_start
println(str(translate(rna"AUGUUUUAA")))
from Bio.Seq import Seq
print(str(Seq("AUGUUUUAA").back_transcribe().translate(to_stop=True)))
library(Biostrings)
print(sub("[*].*$","",as.character(translate(RNAString("AUGUUUUAA")))))
Returns "MF" in BioLang, "MF" in Python, "MF" in R.
seq_len
println(seq_len(dna"ACGTACGTAA"))
print(len("ACGTACGTAA"))
print(nchar("ACGTACGTAA"))
Returns 10 in BioLang, 10 in Python, 10 in R.
hamming_zero
println(hamming_distance(dna"ACGT", dna"ACGT"))
print(sum(a != b for a, b in zip("ACGT", "ACGT")))
print(sum(strsplit("ACGT","")[[1]] != strsplit("ACGT","")[[1]]))
Returns 0 in BioLang, 0 in Python, 0 in R.
hamming_three
println(hamming_distance(dna"GAGCCTACTAACGGGAT", dna"CATCGTAATGACGGCCT"))
print(sum(a != b for a, b in zip("GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT")))
print(sum(strsplit("GAGCCTACTAACGGGAT","")[[1]] != strsplit("CATCGTAATGACGGCCT","")[[1]]))
Returns 7 in BioLang, 7 in Python, 7 in R.
edit_distance_classic
println(edit_distance("kitten", "sitting"))
def levenshtein(a, b):
prev = list(range(len(b) + 1))
for i, ca in enumerate(a, 1):
cur = [i]
for j, cb in enumerate(b, 1):
cur.append(min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + (ca != cb)))
prev = cur
return prev[-1]
print(levenshtein("kitten", "sitting"))
print(as.integer(adist("kitten","sitting")[1,1]))
Returns 3 in BioLang, 3 in Python, 3 in R.
edit_distance_identical
println(edit_distance("abcdef", "abcdef"))
def levenshtein(a, b):
prev = list(range(len(b) + 1))
for i, ca in enumerate(a, 1):
cur = [i]
for j, cb in enumerate(b, 1):
cur.append(min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + (ca != cb)))
prev = cur
return prev[-1]
print(levenshtein("abcdef", "abcdef"))
print(as.integer(adist("abcdef","abcdef")[1,1]))
Returns 0 in BioLang, 0 in Python, 0 in R.
edit_distance_empty
println(edit_distance("", "abc"))
def levenshtein(a, b):
prev = list(range(len(b) + 1))
for i, ca in enumerate(a, 1):
cur = [i]
for j, cb in enumerate(b, 1):
cur.append(min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + (ca != cb)))
prev = cur
return prev[-1]
print(levenshtein("", "abc"))
print(as.integer(adist("","abc")[1,1]))
Returns 3 in BioLang, 3 in Python, 3 in R.
melting_temp_wallace
println(round(tm(dna"ACGTACGTACGT"), 6))
print(round(2*("ACGTACGTACGT".count("A")+"ACGTACGTACGT".count("T")) + 4*("ACGTACGTACGT".count("G")+"ACGTACGTACGT".count("C")), 6))
Returns 36 in BioLang, 36 in Python.
Statistics
mean_ints
println(mean([1.0, 2.0, 3.0, 4.0]))
import statistics
print(statistics.mean([1,2,3,4]))
print(mean(c(1,2,3,4)))
Returns 2.5 in BioLang, 2.5 in Python, 2.5 in R.
mean_negative
println(mean([-5.0, 0.0, 5.0]))
import statistics
print(statistics.mean([-5,0,5]))
print(mean(c(-5,0,5)))
Returns 0 in BioLang, 0 in Python, 0 in R.
median_odd
println(median([3.0, 1.0, 2.0]))
import statistics
print(statistics.median([3,1,2]))
print(median(c(3,1,2)))
Returns 2 in BioLang, 2 in Python, 2 in R.
median_even
println(median([4.0, 1.0, 3.0, 2.0]))
import statistics
print(statistics.median([4,1,3,2]))
print(median(c(4,1,3,2)))
Returns 2.5 in BioLang, 2.5 in Python, 2.5 in R.
stdev_sample
println(round(stdev([2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0]), 9))
import statistics
print(round(statistics.stdev([2,4,4,4,5,5,7,9]), 9))
print(round(sd(c(2,4,4,4,5,5,7,9)), 9))
Returns 2.138089935 in BioLang, 2.138089935 in Python, 2.138089935 in R.
variance_sample
println(round(variance([2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0]), 9))
import statistics
print(round(statistics.variance([2,4,4,4,5,5,7,9]), 9))
print(round(var(c(2,4,4,4,5,5,7,9)), 9))
Returns 4.571428571 in BioLang, 4.571428571 in Python, 4.571428571 in R.
Maths
sum_floats
println(sum([1.5, 2.5, 3.0]))
print(sum([1.5,2.5,3.0]))
print(sum(c(1.5,2.5,3.0)))
Returns 7 in BioLang, 7 in Python, 7 in R.
min_list
println(min([4.0, 2.0, 9.0]))
print(min([4,2,9]))
print(min(c(4,2,9)))
Returns 2 in BioLang, 2 in Python, 2 in R.
max_list
println(max([4.0, 2.0, 9.0]))
print(max([4,2,9]))
print(max(c(4,2,9)))
Returns 9 in BioLang, 9 in Python, 9 in R.
abs_negative
println(abs(-7.5))
print(abs(-7.5))
print(abs(-7.5))
Returns 7.5 in BioLang, 7.5 in Python, 7.5 in R.
sqrt_two
println(round(sqrt(2.0), 9))
import math
print(round(math.sqrt(2), 9))
print(round(sqrt(2), 9))
Returns 1.414213562 in BioLang, 1.414213562 in Python, 1.414213562 in R.
log_natural
println(round(log(10.0), 9))
import math
print(round(math.log(10), 9))
print(round(log(10), 9))
Returns 2.302585093 in BioLang, 2.302585093 in Python, 2.302585093 in R.
pow_int
println(round(pow(2.0, 10.0), 6))
print(round(2**10, 6))
print(round(2^10, 6))
Returns 1024 in BioLang, 1024 in Python, 1024 in R.
round_half_tie
println(round(2.5, 0))
print(round(2.5))
print(round(2.5))
Returns 3 in BioLang, 2 in Python, 2 in R.
round_binary_repr
println(round(2.675, 2))
print(round(2.675, 2))
print(round(2.675, 2))
Returns 2.68 in BioLang, 2.67 in Python, 2.67 in R.
floor_value
println(floor(3.7))
import math
print(math.floor(3.7))
print(floor(3.7))
Returns 3 in BioLang, 3 in Python, 3 in R.
ceil_value
println(ceil(3.2))
import math
print(math.ceil(3.2))
print(ceiling(3.2))
Returns 4 in BioLang, 4 in Python, 4 in R.
Strings
upper_case
println(upper("acgt"))
print("acgt".upper())
print(toupper("acgt"))
Returns "ACGT" in BioLang, "ACGT" in Python, "ACGT" in R.
lower_case
println(lower("ACGT"))
print("ACGT".lower())
print(tolower("ACGT"))
Returns "acgt" in BioLang, "acgt" in Python, "acgt" in R.
trim_spaces
println(trim(" hello "))
print(" hello ".strip())
print(trimws(" hello "))
Returns "hello" in BioLang, "hello" in Python, "hello" in R.
substr_mid
println(substr("ABCDEFGH", 2, 3))
print("ABCDEFGH"[2:5])
print(substr("ABCDEFGH", 3, 5))
Returns "CDE" in BioLang, "CDE" in Python, "CDE" in R.
starts_with_true
println(starts_with("ACGTACGT", "ACG"))
print("ACGTACGT".startswith("ACG"))
print(startsWith("ACGTACGT", "ACG"))
Returns true in BioLang, true in Python, true in R.
contains_substr
println(contains("ACGTACGT", "GTA"))
print("GTA" in "ACGTACGT")
print(grepl("GTA", "ACGTACGT", fixed=TRUE))
Returns true in BioLang, true in Python, true in R.
split_count
println(len(split("a,b,c,d", ",")))
print(len("a,b,c,d".split(",")))
print(length(strsplit("a,b,c,d", ",", fixed=TRUE)[[1]]))
Returns 4 in BioLang, 4 in Python, 4 in R.
join_strings
println(join(["a", "b", "c"], "-"))
print("-".join(["a","b","c"]))
print(paste(c("a","b","c"), collapse="-"))
Returns "a-b-c" in BioLang, "a-b-c" in Python, "a-b-c" in R.
replace_all
println(replace("banana", "a", "o"))
print("banana".replace("a","o"))
print(gsub("a","o","banana",fixed=TRUE))
Returns "bonono" in BioLang, "bonono" in Python, "bonono" in R.
Lists
list_len
println(len([1, 2, 3, 4, 5]))
print(len([1,2,3,4,5]))
print(length(c(1,2,3,4,5)))
Returns 5 in BioLang, 5 in Python, 5 in R.
list_sorted
println(sort([3, 1, 2]))
print(sorted([3,1,2]))
print(sort(c(3,1,2)))
Returns [1,2,3] in BioLang, [1,2,3] in Python, [1,2,3] in R.
list_reversed
println(reverse([1, 2, 3]))
print(list(reversed([1,2,3])))
print(rev(c(1,2,3)))
Returns [3,2,1] in BioLang, [3,2,1] in Python, [3,2,1] in R.
list_unique
println(len(unique([1, 1, 2, 2, 3])))
print(len(set([1,1,2,2,3])))
print(length(unique(c(1,1,2,2,3))))
Returns 3 in BioLang, 3 in Python, 3 in R.
K-mers
kmers_count
println(len(kmers(dna"ACGTACGT", 3)))
print(len([("ACGTACGT")[i:i+3] for i in range(len("ACGTACGT")-3+1)]))
print(length(substring("ACGTACGT", 1:(nchar("ACGTACGT")-3+1), 3:nchar("ACGTACGT"))))
Returns 6 in BioLang, 6 in Python, 6 in R.
kmer_distinct_count
println(kmer_distinct(dna"AAAAAA", 3))
print(len(set("AAAAAA"[i:i+3] for i in range(len("AAAAAA")-2))))
print(length(unique(substring("AAAAAA", 1:4, 3:6))))
Returns 1 in BioLang, 1 in Python, 1 in R.
Where the conventions differ
These are recorded rather than hidden. Neither answer is wrong; the languages round ties in different directions. The correctness suite fails if one of these ever starts agreeing, so the note cannot go stale.
round(2.5, 0)— BioLang3, Python2, R2round(2.675, 2)— BioLang2.68, Python2.67, R2.67
BioLang rounds half away from zero. Python and R round half to even.