On Wednesday, 26 January 2022 at 18:00:41 UTC, Ali Çehreli wrote:


For completeness (and noise :/) here is the final version of the program:


Could you also try the following code with the same configurations?

```d
struct LongScale {
  struct ShortStack {
    short[] stack;
    size_t index;

    @property back() {
      return this.stack[0];
    }

    @property push(short data) {
      this.stack ~= data;
      this.index++;
    }

    @property pop() {
     return this.stack[--this.index];
    }
  }

  ShortStack stack;

  this(long i) {
    long s, t = i;
    for(long e = 3; e <= 18; e += 3) {
      s = 10^^e;
      stack.push = cast(short)((t % s) / (s/1000L));
      t -= t % s;
    }
    stack.push = cast(short)(t / s);
  }

  string toString() {
    string[] scale = [" zero", "thousand", "million",
    "billion", "trillion", "quadrillion", "quintillion"];
    string r;
    for(long e = 6; e > 0; e--) {
      auto t = stack.pop;
      r ~= t > 1 ? " " ~to!string(t) : t ? " one" : "";
      r ~= t ? " " ~scale[e] : "";
    }
    r ~= stack.back ? " " ~to!string(stack.back) : "";
    return r.length ? r : scale[0];
  }
}

import std.conv, std.stdio;
void main()
{
  long[] inputs = [ 741, 1_500, 2_001,
  5_005, 1_250_000, 3_000_042, 10_000_000,
  1_000_000, 2_000_000, 100_000, 200_000,
  10_000, 20_000, 1_000, 2_000, 74, 7, 0,
  1_999_999_999_999];

  foreach(long i; inputs) {
    auto OUT = LongScale(i);
    auto STR = OUT.toString[1..$];
    writefln!"%s"(STR);
  }
}
```

Reply via email to