Verified equivalents
The same computation in BioLang, JavaScript, Python and R. Every case on this page is run and compared rather than eyeballed — floats to 1e-9, integers and strings exactly — so these are checked translations rather than plausible ones.
48 cases. The Python and R panes are written by hand and checked
by the correctness suite. The JavaScript panes are not written at all:
the shipped transpiler generates each one from the BioLang beside it, and
a pane only appears if running it through the
JavaScript SDK
returns the same decoded value BioLang returns — 48
of 48 do.
Only the BioLang tab has a Run button, because only BioLang runs in this
page; 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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.gcContent(bl.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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.gcContent(bl.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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.gcContent(bl.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")))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.str(bl.reverseComplement(bl.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")))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.str(bl.reverseComplement(bl.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")))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.str(bl.complement(bl.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")))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.str(bl.transcribe(bl.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")))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.str(bl.translate(bl.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")))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.str(bl.translate(bl.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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.seqLen(bl.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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.hammingDistance(bl.dna("ACGT"), bl.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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.hammingDistance(bl.dna("GAGCCTACTAACGGGAT"), bl.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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.editDistance("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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.editDistance("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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.editDistance("", "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))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.round(bl.tm(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.round(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.round(bl.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]))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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]))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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]))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.round(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.round(bl.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))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.round(bl.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))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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 { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.upper("acgt"));
print("acgt".upper())
print(toupper("acgt"))
Returns "ACGT" in BioLang, "ACGT" in Python, "ACGT" in R.
lower_case
println(lower("ACGT"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.lower("ACGT"));
print("ACGT".lower())
print(tolower("ACGT"))
Returns "acgt" in BioLang, "acgt" in Python, "acgt" in R.
trim_spaces
println(trim(" hello "))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.startsWith("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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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", ",")))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.len(bl.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"], "-"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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"))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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]))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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]))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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]))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.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])))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.len(bl.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)))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.len(bl.kmers(bl.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))
import { BioLang } from "biolang";
const bl = await BioLang.create();
bl.println(bl.kmerDistinct(bl.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.