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) — BioLang 3, Python 2, R 2
  • round(2.675, 2) — BioLang 2.68, Python 2.67, R 2.67

BioLang rounds half away from zero. Python and R round half to even.