On Tuesday, 14 January 2020 at 16:39:16 UTC, mark wrote:
I can't help feeling that the foreach loop's block is rather more verbose than it could be?


    WordSet words;
    auto rx = ctRegex!(r"^[a-z]+", "i");
    auto file = File(filename);
    foreach (line; file.byLine) {
        auto match = matchFirst(line, rx);
        if (!match.empty()) {
auto word = match.hit().to!string; // I hope this assumes UTF-8?
            if (word.length == wordsize) {
                words[word.toUpper] = 0;
            }
        }
    }
    return words;
}
----

One thing I picked up during Advent of Code last year was
std.file.slurp, which was great for reading 90% of the input
files from that contest. With that, I'd do this more like

  int[string] words;
  slurp!string("input.txt", "%s").each!(w => words[w] = 0);

Where "%s" is what slurp() expects to find on each line, and
'string' is the type it returns from that. With just a list of
words this isn't very interesting. Some of my uses from the
contest are:

auto input = slurp!(int, int, int)(args[1], "<x=%d, y=%d, z=%d>")
      .map!(p => Moon([p[0], p[1], p[2]])).array;

  Tuple!(string, string)[] input =
      slurp!(string, string)("input.txt", "%s)%s");

Of course if you want to validate the input as you're reading
it, you still have to do extra work, but it could be in a
.filter!

Reply via email to