On 5/9/22 20:38, rikki cattermole wrote:

> this is a super expensive
> method for doing something pretty simple.

Yes! :)

Assuming the data is indeed validated in some way, the following should be even faster. It validates the data after the fact:

import std.stdio;
import std.range;
import std.exception;
import std.algorithm;
import std.format;

const ulong[] alphabet = [ 'A', 'C', 'G', 'T' ];

void main() {
  string s = "ACGTACGT";

  auto counts = new ulong[char.max];

  foreach(char c; s) {
    counts[c]++;
  }

  validateCounts(counts);
  writeln(counts.indexed(alphabet));
}

void validateCounts(ulong[] counts) {
  // The other elements should all be zero.
  enforce(counts
          .enumerate
          .filter!(t => !alphabet.canFind(t.index))
          .map!(t => t.value)
          .sum == 0,
          format!"There were illegal letters in the data: %s"(counts));
}

Ali

Reply via email to