On 12/15/2013 09:46 PM, Ali Çehreli wrote:

> On 12/15/2013 08:42 PM, John Carter wrote:

>  > Now I'm sure I can use std.algorithm map to convert say a string of
>  > characters "IVXLCDM" into an array [1,5,10,50,100,500,1000]

The following program works. Note that 'result' is a lazy range. You can apply .array to it to convert it to an array eagerly.

import std.stdio;
import std.algorithm;
import std.array;
import std.range;

struct romanSystemData {
   string digit;
   uint   value;
   ulong  regionIndex;
   ulong  previous;
};

immutable romanSystemData romanSystem[] = [
   {"" ,    0, 0, 0},//0
   {"I",    1, 0, 0},//1 8-7
   {"V",    5, 1, 1},//2 8-6
   {"X",   10, 1, 2},//3 8-5
   {"L",   50, 3, 3},//4 8-4
   {"C",  100, 3, 4},//5 8-3
   {"D",  500, 5, 5},//6 8-2
   {"M", 1000, 5, 6} //7 8-1
];

void main()
{
    auto result = "IVXLCDM"
                  .map!(a => romanSystem
                             .find!(data => data.digit.equal([ a ]))
                             .front.value);

    assert(result.equal([1, 5, 10, 50, 100, 500, 1000]));
}

The following code maintains the digits as chars (instead of strings), which simplified the code a little bit:

immutable romanSystemData romanSystem[] = [
   {'\0',   0, 0, 0},//0      // <-- digits are char
   {'I',    1, 0, 0},//1 8-7
   // ...
];

Simpler than data.digit.equal([ a ]):

    auto result = "IVXLCDM"
                  .map!(a => romanSystem
                             .find!(data => data.digit == a)
                             .front.value);

Ali

Reply via email to