0000000 2f 2f 20 43 72 65 61 74 65 64 20 62 79 20 4c 69  >// Created by Li<
0000020 6f 6e 65 6c 6c 6f 20 4c 75 6e 65 73 75 20 61 6e  >onello Lunesu an<
0000040 64 20 70 6c 61 63 65 64 20 69 6e 20 74 68 65 20  >d placed in the <
0000060 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2e 0a 2f  >public domain../<
0000100 2f 20 54 68 69 73 20 66 69 6c 65 20 68 61 73 20  >/ This file has <
0000120 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 66 72  >been modified fr<
0000140 6f 6d 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  >om its original <
0000160 76 65 72 73 69 6f 6e 2e 0a 2f 2f 20 49 74 20 68  >version..// It h<
0000200 61 73 20 62 65 65 6e 20 66 6f 72 6d 61 74 74 65  >as been formatte<
0000220 64 20 74 6f 20 66 69 74 20 79 6f 75 72 20 73 63  >d to fit your sc<
0000240 72 65 65 6e 2e 0a 6d 6f 64 75 6c 65 20 70 68 6f  >reen..module pho<
0000260 6e 65 6e 6f 3b 20 20 20 20 20 2f 2f 20 6f 70 74  >neno;     // opt<
0000300 69 6f 6e 61 6c 0a 69 6d 70 6f 72 74 20 73 74 64  >ional.import std<
0000320 2e 73 74 64 69 6f 3b 20 20 20 2f 2f 20 77 72 69  >.stdio;   // wri<
0000340 74 65 66 6c 6e 20 20 20 20 20 0a 69 6d 70 6f 72  >tefln     .impor<
0000360 74 20 73 74 64 2e 63 74 79 70 65 3b 20 20 20 2f  >t std.ctype;   /<
0000400 2f 20 69 73 64 69 67 69 74 20 20 20 20 20 0a 69  >/ isdigit     .i<
0000420 6d 70 6f 72 74 20 73 74 64 2e 73 74 72 65 61 6d  >mport std.stream<
0000440 3b 20 20 2f 2f 20 42 75 66 66 65 72 65 64 46 69  >;  // BufferedFi<
0000460 6c 65 0a 0a 2f 2f 20 4a 75 73 74 20 66 6f 72 20  >le..// Just for <
0000500 72 65 61 64 61 62 69 6c 69 74 79 20 28 69 6d 61  >readability (ima<
0000520 67 69 6e 65 20 63 68 61 72 5b 5d 5b 5d 5b 63 68  >gine char[][][ch<
0000540 61 72 5b 5d 5d 29 20 20 20 20 0a 61 6c 69 61 73  >ar[]])    .alias<
0000560 20 63 68 61 72 5b 5d 20 73 74 72 69 6e 67 3b 0a  > char[] string;.<
0000600 61 6c 69 61 73 20 73 74 72 69 6e 67 5b 5d 20 73  >alias string[] s<
0000620 74 72 69 6e 67 61 72 72 61 79 3b 0a 0a 2f 2f 2f  >tringarray;..///<
0000640 20 53 74 72 69 70 73 20 6e 6f 6e 2d 64 69 67 69  > Strips non-digi<
0000660 74 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f  >t characters fro<
0000700 6d 20 74 68 65 20 73 74 72 69 6e 67 20 28 43 4f  >m the string (CO<
0000720 57 29 0a 73 74 72 69 6e 67 20 73 74 72 69 70 4e  >W).string stripN<
0000740 6f 6e 44 69 67 69 74 28 20 69 6e 20 73 74 72 69  >onDigit( in stri<
0000760 6e 67 20 6c 69 6e 65 20 29 20 0a 7b 0a 20 20 20  >ng line ) .{.   <
0001000 20 73 74 72 69 6e 67 20 72 65 74 3b 0a 20 20 20  > string ret;.   <
0001020 20 66 6f 72 65 61 63 68 28 75 69 6e 74 20 69 2c  > foreach(uint i,<
0001040 20 63 3b 20 6c 69 6e 65 29 20 7b 0a 20 20 20 20  > c; line) {.    <
0001060 20 20 20 20 2f 2f 20 45 72 72 6f 72 3a 20 73 74  >    // Error: st<
0001100 64 2e 63 74 79 70 65 2e 69 73 64 69 67 69 74 20  >d.ctype.isdigit <
0001120 61 74 20 43 3a 5c 64 6d 64 5c 73 72 63 5c 70 68  >at C:\dmd\src\ph<
0001140 6f 62 6f 73 5c 73 74 64 5c 63 74 79 70 65 2e 64  >obos\std\ctype.d<
0001160 28 33 37 29 20 0a 20 20 20 20 20 20 20 20 2f 2f  >(37) .        //<
0001200 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20  > conflicts with <
0001220 73 74 64 2e 73 74 72 65 61 6d 2e 69 73 64 69 67  >std.stream.isdig<
0001240 69 74 20 61 74 20 43 3a 5c 64 6d 64 5c 73 72 63  >it at C:\dmd\src<
0001260 5c 70 68 6f 62 6f 73 5c 73 74 64 5c 73 74 72 65  >\phobos\std\stre<
0001300 61 6d 2e 64 28 32 39 32 34 29 0a 20 20 20 20 20  >am.d(2924).     <
0001320 20 20 20 69 66 20 28 21 73 74 64 2e 63 74 79 70  >   if (!std.ctyp<
0001340 65 2e 69 73 64 69 67 69 74 28 63 29 29 20 7b 0a  >e.isdigit(c)) {.<
0001360 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28  >            if (<
0001400 21 72 65 74 29 0a 20 20 20 20 20 20 20 20 20 20  >!ret).          <
0001420 20 20 20 20 20 20 72 65 74 20 3d 20 6c 69 6e 65  >      ret = line<
0001440 5b 30 2e 2e 69 5d 3b 20 20 20 20 0a 20 20 20 20  >[0..i];    .    <
0001460 20 20 20 20 7d 20 20 20 20 0a 20 20 20 20 20 20  >    }    .      <
0001500 20 20 65 6c 73 65 20 69 66 20 28 72 65 74 29 0a  >  else if (ret).<
0001520 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 20  >            ret <
0001540 7e 3d 20 63 3b 20 20 20 20 0a 20 20 20 20 7d 20  >~= c;    .    } <
0001560 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72  >   .    return r<
0001600 65 74 3f 72 65 74 3a 6c 69 6e 65 3b 0a 7d 0a 0a  >et?ret:line;.}..<
0001620 75 6e 69 74 74 65 73 74 20 7b 0a 20 20 20 20 61  >unittest {.    a<
0001640 73 73 65 72 74 28 20 73 74 72 69 70 4e 6f 6e 44  >ssert( stripNonD<
0001660 69 67 69 74 28 22 61 73 64 66 22 29 20 3d 3d 20  >igit("asdf") == <
0001700 22 22 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >""  );.    asser<
0001720 74 28 20 73 74 72 69 70 4e 6f 6e 44 69 67 69 74  >t( stripNonDigit<
0001740 28 22 5c 27 31 33 2d 3d 32 20 34 6b 6f 70 22 29  >("\'13-=2 4kop")<
0001760 20 3d 3d 20 20 22 31 33 32 34 22 20 20 29 3b 0a  > ==  "1324"  );.<
0002000 7d 0a 0a 2f 2f 2f 20 43 6f 6e 76 65 72 74 73 20  >}../// Converts <
0002020 61 20 77 6f 72 64 20 69 6e 74 6f 20 61 20 6e 75  >a word into a nu<
0002040 6d 62 65 72 2c 20 69 67 6e 6f 72 69 6e 67 20 61  >mber, ignoring a<
0002060 6c 6c 20 6e 6f 6e 20 61 6c 70 68 61 20 63 68 61  >ll non alpha cha<
0002100 72 61 63 74 65 72 73 20 20 0a 73 74 72 69 6e 67  >racters  .string<
0002120 20 77 6f 72 64 54 6f 4e 75 6d 28 20 69 6e 20 73  > wordToNum( in s<
0002140 74 72 69 6e 67 20 77 6f 72 64 20 29 0a 7b 0a 2f  >tring word ).{./<
0002160 2f 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 61  >/ translation ta<
0002200 62 6c 65 20 66 6f 72 20 74 68 65 20 74 61 73 6b  >ble for the task<
0002220 20 61 74 20 68 61 6e 64 0a 63 6f 6e 73 74 20 63  > at hand.const c<
0002240 68 61 72 5b 32 35 36 5d 20 54 52 41 4e 53 4c 41  >har[256] TRANSLA<
0002260 54 45 20 3d 20 20 20 20 0a 20 20 20 20 22 20 20  >TE =    .    "  <
0002300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >                <
0002320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  >              " <
0002340 20 2f 2f 20 30 20 20 20 0a 20 20 20 20 22 20 20  > // 0   .    "  <
0002360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 31  >              01<
0002400 32 33 34 35 36 37 38 39 20 20 20 20 20 20 22 20  >23456789      " <
0002420 20 2f 2f 20 33 32 20 20 20 20 20 0a 20 20 20 20  > // 32     .    <
0002440 22 20 35 37 36 33 30 34 39 39 36 31 37 38 35 31  >" 57630499617851<
0002460 38 38 31 32 33 34 37 36 32 32 33 39 20 20 20 20  >881234762239    <
0002500 20 22 20 20 2f 2f 20 36 34 20 20 20 0a 20 20 20  > "  // 64   .   <
0002520 20 22 20 35 37 36 33 30 34 39 39 36 31 37 38 35  > " 5763049961785<
0002540 31 38 38 31 32 33 34 37 36 32 32 33 39 20 20 20  >1881234762239   <
0002560 20 20 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  >  ".    "       <
0002600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >                <
0002620 20 20 20 20 20 20 20 20 20 22 0a 20 20 20 20 22  >         ".    "<
0002640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >                <
*
0002700 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20  >".    "         <
0002720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >                <
0002740 20 20 20 20 20 20 20 22 20 20 20 20 0a 20 20 20  >       "    .   <
0002760 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  > "              <
0003000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >                <
0003020 20 20 22 3b 0a 20 20 20 20 73 74 72 69 6e 67 20  >  ";.    string <
0003040 72 65 74 3b 0a 20 20 20 20 66 6f 72 65 61 63 68  >ret;.    foreach<
0003060 28 63 3b 20 63 61 73 74 28 75 62 79 74 65 5b 5d  >(c; cast(ubyte[]<
0003100 29 77 6f 72 64 29 0a 20 20 20 20 20 20 20 20 69  >)word).        i<
0003120 66 20 28 54 52 41 4e 53 4c 41 54 45 5b 63 5d 20  >f (TRANSLATE[c] <
0003140 21 3d 20 27 20 27 29 0a 20 20 20 20 20 20 20 20  >!= ' ').        <
0003160 20 20 20 20 72 65 74 20 7e 3d 20 54 52 41 4e 53  >    ret ~= TRANS<
0003200 4c 41 54 45 5b 63 5d 3b 0a 20 20 20 20 72 65 74  >LATE[c];.    ret<
0003220 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 75 6e 69 74  >urn ret;.}..unit<
0003240 74 65 73 74 20 7b 0a 20 2f 2f 20 54 65 73 74 20  >test {. // Test <
0003260 77 6f 72 64 54 6f 4e 75 6d 20 75 73 69 6e 67 20  >wordToNum using <
0003300 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  >the table from t<
0003320 68 65 20 74 61 73 6b 20 64 65 73 63 72 69 70 74  >he task descript<
0003340 69 6f 6e 2e 0a 20 61 73 73 65 72 74 28 20 22 30  >ion.. assert( "0<
0003360 31 31 31 32 32 32 33 33 33 34 34 35 35 36 36 36  >1112223334455666<
0003400 37 37 37 38 38 38 39 39 39 22 20 3d 3d 0a 20 20  >777888999" ==.  <
0003420 20 77 6f 72 64 54 6f 4e 75 6d 28 22 45 20 7c 20  > wordToNum("E | <
0003440 4a 20 4e 20 51 20 7c 20 52 20 57 20 58 20 7c 20  >J N Q | R W X | <
0003460 44 20 53 20 59 20 7c 20 46 20 54 20 7c 20 41 20  >D S Y | F T | A <
0003500 4d 20 7c 20 43 20 49 20 56 20 7c 20 42 20 4b 20  >M | C I V | B K <
0003520 55 20 7c 20 4c 20 4f 20 50 20 7c 20 47 20 48 20  >U | L O P | G H <
0003540 5a 22 29 29 3b 0a 20 61 73 73 65 72 74 28 20 22  >Z"));. assert( "<
0003560 30 31 31 31 32 32 32 33 33 33 34 34 35 35 36 36  >0111222333445566<
0003600 36 37 37 37 38 38 38 39 39 39 22 20 3d 3d 20 0a  >6777888999" == .<
0003620 20 20 20 77 6f 72 64 54 6f 4e 75 6d 28 22 65 20  >   wordToNum("e <
0003640 7c 20 6a 20 6e 20 71 20 7c 20 72 20 77 20 78 20  >| j n q | r w x <
0003660 7c 20 64 20 73 20 79 20 7c 20 66 20 74 20 7c 20  >| d s y | f t | <
0003700 61 20 6d 20 7c 20 63 20 69 20 76 20 7c 20 62 20  >a m | c i v | b <
0003720 6b 20 75 20 7c 20 6c 20 6f 20 70 20 7c 20 67 20  >k u | l o p | g <
0003740 68 20 7a 22 29 29 3b 0a 20 61 73 73 65 72 74 28  >h z"));. assert(<
0003760 20 22 30 31 32 33 34 35 36 37 38 39 22 20 3d 3d  > "0123456789" ==<
0004000 20 0a 20 20 20 77 6f 72 64 54 6f 4e 75 6d 28 22  > .   wordToNum("<
0004020 30 20 7c 20 20 20 31 20 20 20 7c 20 20 20 32 20  >0 |   1   |   2 <
0004040 20 20 7c 20 20 20 33 20 20 20 7c 20 20 34 20 20  >  |   3   |  4  <
0004060 7c 20 20 35 20 20 7c 20 20 20 36 20 20 20 7c 20  >|  5  |   6   | <
0004100 20 20 37 20 20 20 7c 20 20 20 38 20 20 20 7c 20  >  7   |   8   | <
0004120 20 20 39 22 29 29 3b 0a 7d 0a 0a 76 6f 69 64 20  >  9"));.}..void <
0004140 6d 61 69 6e 28 20 73 74 72 69 6e 67 5b 5d 20 61  >main( string[] a<
0004160 72 67 73 20 29 0a 7b 0a 20 20 20 20 2f 2f 20 54  >rgs ).{.    // T<
0004200 68 69 73 20 61 73 73 6f 63 69 61 74 69 76 65 20  >his associative <
0004220 61 72 72 61 79 20 6d 61 70 73 20 61 20 6e 75 6d  >array maps a num<
0004240 62 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  >ber to an array <
0004260 6f 66 20 77 6f 72 64 73 2e 20 20 20 20 0a 20 20  >of words.    .  <
0004300 20 20 73 74 72 69 6e 67 61 72 72 61 79 5b 73 74  >  stringarray[st<
0004320 72 69 6e 67 5d 20 20 20 20 6e 75 6d 32 77 6f 72  >ring]    num2wor<
0004340 64 73 3b 0a 0a 20 20 20 20 66 6f 72 65 61 63 68  >ds;..    foreach<
0004360 28 73 74 72 69 6e 67 20 77 6f 72 64 3b 20 6e 65  >(string word; ne<
0004400 77 20 42 75 66 66 65 72 65 64 46 69 6c 65 28 22  >w BufferedFile("<
0004420 64 69 63 74 69 6f 6e 61 72 79 2e 74 78 74 22 20  >dictionary.txt" <
0004440 29 20 29 0a 20 20 20 20 20 20 20 20 6e 75 6d 32  >) ).        num2<
0004460 77 6f 72 64 73 5b 20 77 6f 72 64 54 6f 4e 75 6d  >words[ wordToNum<
0004500 28 77 6f 72 64 29 20 5d 20 7e 3d 20 77 6f 72 64  >(word) ] ~= word<
0004520 2e 64 75 70 3b 20 20 20 20 20 20 20 20 2f 2f 20  >.dup;        // <
0004540 6d 75 73 74 20 64 75 70 0a 0a 20 20 20 20 2f 2f  >must dup..    //<
0004560 2f 20 46 69 6e 64 73 20 61 6c 6c 20 61 6c 74 65  >/ Finds all alte<
0004600 72 6e 61 74 69 76 65 73 20 66 6f 72 20 74 68 65  >rnatives for the<
0004620 20 67 69 76 65 6e 20 6e 75 6d 62 65 72 0a 20 20  > given number.  <
0004640 20 20 2f 2f 2f 20 28 73 68 6f 75 6c 64 20 68 61  >  /// (should ha<
0004660 76 65 20 62 65 65 6e 20 73 74 72 69 70 70 65 64  >ve been stripped<
0004700 20 66 72 6f 6d 20 6e 6f 6e 2d 64 69 67 69 74 20  > from non-digit <
0004720 63 68 61 72 61 63 74 65 72 73 29 0a 20 20 20 20  >characters).    <
0004740 73 74 72 69 6e 67 61 72 72 61 79 20 5f 46 69 6e  >stringarray _Fin<
0004760 64 57 6f 72 64 73 28 20 73 74 72 69 6e 67 20 6e  >dWords( string n<
0005000 75 6d 62 65 72 73 2c 20 62 6f 6f 6c 20 64 69 67  >umbers, bool dig<
0005020 69 74 6f 6b 20 29 0a 20 20 20 20 69 6e 20 7b 0a  >itok ).    in {.<
0005040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  >        assert(n<
0005060 75 6d 62 65 72 73 2e 6c 65 6e 67 74 68 20 3e 20  >umbers.length > <
0005100 20 30 29 3b 20 20 20 20 0a 20 20 20 20 7d 20 20  > 0);    .    }  <
0005120 20 20 0a 20 20 20 20 6f 75 74 28 72 65 73 75 6c  >  .    out(resul<
0005140 74 29 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  >t) {.        for<
0005160 65 61 63 68 20 28 61 3b 20 72 65 73 75 6c 74 29  >each (a; result)<
0005200 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  >.            ass<
0005220 65 72 74 28 20 77 6f 72 64 54 6f 4e 75 6d 28 61  >ert( wordToNum(a<
0005240 29 20 3d 3d 20 6e 75 6d 62 65 72 73 20 29 3b 0a  >) == numbers );.<
0005260 20 20 20 20 7d 20 20 20 20 0a 20 20 20 20 62 6f  >    }    .    bo<
0005300 64 79 20 7b 0a 20 20 20 20 20 20 20 20 73 74 72  >dy {.        str<
0005320 69 6e 67 61 72 72 61 79 20 72 65 74 3b 0a 20 20  >ingarray ret;.  <
0005340 20 20 20 20 20 20 62 6f 6f 6c 20 66 6f 75 6e 64  >      bool found<
0005360 77 6f 72 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20  >word = false;.  <
0005400 20 20 20 20 20 20 66 6f 72 20 28 75 69 6e 74 20  >      for (uint <
0005420 74 3d 31 3b 20 74 3c 3d 6e 75 6d 62 65 72 73 2e  >t=1; t<=numbers.<
0005440 6c 65 6e 67 74 68 3b 20 2b 2b 74 29 20 7b 0a 20  >length; ++t) {. <
0005460 20 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 20  >           auto <
0005500 61 6c 74 65 72 6e 61 74 69 76 65 73 20 3d 20 6e  >alternatives = n<
0005520 75 6d 62 65 72 73 5b 30 2e 2e 74 5d 20 69 6e 20  >umbers[0..t] in <
0005540 6e 75 6d 32 77 6f 72 64 73 3b 0a 20 20 20 20 20  >num2words;.     <
0005560 20 20 20 20 20 20 20 69 66 20 28 21 61 6c 74 65  >       if (!alte<
0005600 72 6e 61 74 69 76 65 73 29 0a 20 20 20 20 20 20  >rnatives).      <
0005620 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  >          contin<
0005640 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >ue;.            <
0005660 66 6f 75 6e 64 77 6f 72 64 20 3d 20 74 72 75 65  >foundword = true<
0005700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  >;.            if<
0005720 20 28 6e 75 6d 62 65 72 73 2e 6c 65 6e 67 74 68  > (numbers.length<
0005740 20 3e 20 20 74 29 20 7b 0a 20 20 20 20 20 20 20  > >  t) {.       <
0005760 20 20 20 20 20 20 20 20 20 2f 2f 20 43 6f 6d 62  >         // Comb<
0006000 69 6e 65 20 61 6c 6c 20 63 75 72 72 65 6e 74 20  >ine all current <
0006020 61 6c 74 65 72 6e 61 74 69 76 65 73 20 77 69 74  >alternatives wit<
0006040 68 20 61 6c 6c 20 61 6c 74 65 72 6e 61 74 69 76  >h all alternativ<
0006060 65 73 20 20 20 20 20 0a 20 20 20 20 20 20 20 20  >es     .        <
0006100 20 20 20 20 20 20 20 20 2f 2f 20 6f 66 20 74 68  >        // of th<
0006120 65 20 72 65 73 74 20 28 6e 65 78 74 20 70 69 65  >e rest (next pie<
0006140 63 65 20 63 61 6e 20 73 74 61 72 74 20 77 69 74  >ce can start wit<
0006160 68 20 61 20 64 69 67 69 74 29 20 20 20 20 20 20  >h a digit)      <
0006200 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20  >        .       <
0006220 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  >         foreach<
0006240 20 28 61 32 3b 20 5f 46 69 6e 64 57 6f 72 64 73  > (a2; _FindWords<
0006260 28 20 6e 75 6d 62 65 72 73 5b 74 2e 2e 24 5d 2c  >( numbers[t..$],<
0006300 20 74 72 75 65 20 20 20 20 20 29 20 29 0a 20 20  > true     ) ).  <
0006320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >                <
0006340 20 20 66 6f 72 65 61 63 68 28 61 31 3b 20 2a 61  >  foreach(a1; *a<
0006360 6c 74 65 72 6e 61 74 69 76 65 73 29 0a 20 20 20  >lternatives).   <
0006400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >                <
0006420 20 20 20 20 72 65 74 20 7e 3d 20 61 31 20 7e 20  >    ret ~= a1 ~ <
0006440 22 20 22 20 7e 20 61 32 3b 0a 20 20 20 20 20 20  >" " ~ a2;.      <
0006460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20  >      }.        <
0006500 20 20 20 20 65 6c 73 65 20 20 20 20 0a 20 20 20  >    else    .   <
0006520 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  >             ret<
0006540 20 7e 3d 20 2a 61 6c 74 65 72 6e 61 74 69 76 65  > ~= *alternative<
0006560 73 3b 20 20 20 20 2f 2f 20 61 70 70 65 6e 64 20  >s;    // append <
0006600 74 68 65 73 65 20 61 6c 74 65 72 6e 61 74 69 76  >these alternativ<
0006620 65 73 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  >es.        }.   <
0006640 20 20 20 20 20 2f 2f 20 54 72 79 20 74 6f 20 6b  >     // Try to k<
0006660 65 65 70 20 31 20 64 69 67 69 74 2c 20 6f 6e 6c  >eep 1 digit, onl<
0006700 79 20 69 66 20 77 65 27 72 65 20 61 6c 6c 6f 77  >y if we're allow<
0006720 65 64 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 0a  >ed and no other.<
0006740 20 20 20 20 20 20 20 20 2f 2f 20 61 6c 74 65 72  >        // alter<
0006760 6e 61 74 69 76 65 73 20 77 65 72 65 20 66 6f 75  >natives were fou<
0007000 6e 64 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 65  >nd.        // Te<
0007020 73 74 69 6e 67 20 22 72 65 74 2e 6c 65 6e 67 74  >sting "ret.lengt<
0007040 68 22 20 6d 61 6b 65 73 20 6d 6f 72 65 20 73 65  >h" makes more se<
0007060 6e 73 65 20 74 68 61 6e 20 74 65 73 74 69 6e 67  >nse than testing<
0007100 20 22 66 6f 75 6e 64 77 6f 72 64 22 2c 0a 20 20  > "foundword",.  <
0007120 20 20 20 20 20 20 2f 2f 20 62 75 74 20 74 68 65  >      // but the<
0007140 20 6f 74 68 65 72 20 69 6d 70 6c 65 6d 65 6e 74  > other implement<
0007160 61 74 69 6f 6e 73 20 73 65 65 6d 20 74 6f 20 64  >ations seem to d<
0007200 6f 20 6a 75 73 74 20 74 68 69 73 2e 0a 20 20 20  >o just this..   <
0007220 20 20 20 20 20 69 66 20 28 64 69 67 69 74 6f 6b  >     if (digitok<
0007240 20 26 26 20 21 66 6f 75 6e 64 77 6f 72 64 29 20  > && !foundword) <
0007260 7b 20 2f 2f 72 65 74 2e 6c 65 6e 67 74 68 20 3d  >{ //ret.length =<
0007300 3d 20 30 20 20 0a 20 20 20 20 20 20 20 20 20 20  >= 0  .          <
0007320 20 20 69 66 28 6e 75 6d 62 65 72 73 2e 6c 65 6e  >  if(numbers.len<
0007340 67 74 68 20 3e 20 20 31 29 20 7b 0a 20 20 20 20  >gth >  1) {.    <
0007360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43  >            // C<
0007400 6f 6d 62 69 6e 65 20 31 20 64 69 67 69 74 20 77  >ombine 1 digit w<
0007420 69 74 68 20 61 6c 6c 20 61 6c 74 65 6e 61 74 69  >ith all altenati<
0007440 76 65 73 20 66 72 6f 6d 20 74 68 65 20 72 65 73  >ves from the res<
0007460 74 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20  >t    .          <
0007500 20 20 20 20 20 20 2f 2f 20 28 6e 65 78 74 20 70  >      // (next p<
0007520 69 65 63 65 20 63 61 6e 20 6e 6f 74 20 73 74 61  >iece can not sta<
0007540 72 74 20 77 69 74 68 20 61 20 64 69 67 69 74 29  >rt with a digit)<
0007560 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  >          .     <
0007600 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  >           forea<
0007620 63 68 20 28 61 3b 20 5f 46 69 6e 64 57 6f 72 64  >ch (a; _FindWord<
0007640 73 28 20 6e 75 6d 62 65 72 73 5b 31 2e 2e 24 5d  >s( numbers[1..$]<
0007660 2c 20 66 61 6c 73 65 20 29 20 29 0a 20 20 20 20  >, false ) ).    <
0007700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >                <
0007720 72 65 74 20 7e 3d 20 6e 75 6d 62 65 72 73 5b 30  >ret ~= numbers[0<
0007740 2e 2e 31 5d 20 7e 20 22 20 22 20 7e 20 61 3b 0a  >..1] ~ " " ~ a;.<
0007760 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 20 20  >            }   <
0010000 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  > .            el<
0010020 73 65 20 20 20 20 0a 20 20 20 20 20 20 20 20 20  >se    .         <
0010040 20 20 20 20 20 20 20 72 65 74 20 7e 3d 20 6e 75  >       ret ~= nu<
0010060 6d 62 65 72 73 5b 30 2e 2e 31 5d 3b 20 20 20 20  >mbers[0..1];    <
0010100 2f 2f 20 6a 75 73 74 20 61 70 70 65 6e 64 20 74  >// just append t<
0010120 68 69 73 20 64 69 67 69 74 20 20 20 20 20 20 20  >his digit       <
0010140 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d  >      .        }<
0010160 20 20 20 20 0a 20 20 20 20 20 20 20 20 72 65 74  >    .        ret<
0010200 75 72 6e 20 72 65 74 3b 0a 20 20 20 20 7d 0a 0a  >urn ret;.    }..<
0010220 20 20 20 20 2f 2f 2f 20 28 54 68 69 73 20 66 75  >    /// (This fu<
0010240 6e 63 74 69 6f 6e 20 77 61 73 20 69 6e 6c 69 6e  >nction was inlin<
0010260 65 64 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  >ed in the origin<
0010300 61 6c 20 70 72 6f 67 72 61 6d 29 20 0a 20 20 20  >al program) .   <
0010320 20 2f 2f 2f 20 46 69 6e 64 73 20 61 6c 6c 20 61  > /// Finds all a<
0010340 6c 74 65 72 6e 61 74 69 76 65 73 20 66 6f 72 20  >lternatives for <
0010360 74 68 65 20 67 69 76 65 6e 20 70 68 6f 6e 65 20  >the given phone <
0010400 6e 75 6d 62 65 72 20 0a 20 20 20 20 2f 2f 2f 20  >number .    /// <
0010420 52 65 74 75 72 6e 73 3a 20 61 72 72 61 79 20 6f  >Returns: array o<
0010440 66 20 73 74 72 69 6e 67 73 20 0a 20 20 20 20 73  >f strings .    s<
0010460 74 72 69 6e 67 61 72 72 61 79 20 46 69 6e 64 57  >tringarray FindW<
0010500 6f 72 64 73 28 20 73 74 72 69 6e 67 20 70 68 6f  >ords( string pho<
0010520 6e 65 5f 6e 75 6d 62 65 72 20 29 0a 20 20 20 20  >ne_number ).    <
0010540 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 70  >{.        if (!p<
0010560 68 6f 6e 65 5f 6e 75 6d 62 65 72 2e 6c 65 6e 67  >hone_number.leng<
0010600 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  >th).            <
0010620 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20  >return null;.   <
0010640 20 20 20 20 20 2f 2f 20 53 74 72 69 70 20 74 68  >     // Strip th<
0010660 65 20 6e 6f 6e 2d 64 69 67 69 74 20 63 68 61 72  >e non-digit char<
0010700 61 63 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20  >acters from the <
0010720 70 68 6f 6e 65 20 6e 75 6d 62 65 72 2c 20 61 6e  >phone number, an<
0010740 64 0a 20 20 20 20 20 20 20 20 2f 2f 20 70 61 73  >d.        // pas<
0010760 73 20 69 74 20 74 6f 20 74 68 65 20 72 65 63 75  >s it to the recu<
0011000 72 73 69 76 65 20 66 75 6e 63 74 69 6f 6e 20 28  >rsive function (<
0011020 6c 65 61 64 69 6e 67 20 64 69 67 69 74 20 69 73  >leading digit is<
0011040 20 61 6c 6c 6f 77 65 64 29 0a 20 20 20 20 20 20  > allowed).      <
0011060 20 20 72 65 74 75 72 6e 20 5f 46 69 6e 64 57 6f  >  return _FindWo<
0011100 72 64 73 28 20 73 74 72 69 70 4e 6f 6e 44 69 67  >rds( stripNonDig<
0011120 69 74 28 70 68 6f 6e 65 5f 6e 75 6d 62 65 72 29  >it(phone_number)<
0011140 2c 20 74 72 75 65 20 29 3b 20 20 20 20 0a 20 20  >, true );    .  <
0011160 20 20 7d 20 20 20 20 0a 20 20 20 20 0a 20 20 20  >  }    .    .   <
0011200 20 2f 2f 20 52 65 61 64 20 74 68 65 20 70 68 6f  > // Read the pho<
0011220 6e 65 20 6e 75 6d 62 65 72 73 20 20 20 20 20 0a  >ne numbers     .<
0011240 20 20 20 20 66 6f 72 65 61 63 68 28 73 74 72 69  >    foreach(stri<
0011260 6e 67 20 70 68 6f 6e 65 3b 20 6e 65 77 20 42 75  >ng phone; new Bu<
0011300 66 66 65 72 65 64 46 69 6c 65 28 22 69 6e 70 75  >fferedFile("inpu<
0011320 74 2e 74 78 74 22 20 20 20 29 20 29 0a 20 20 20  >t.txt"   ) ).   <
0011340 20 20 20 20 20 66 6f 72 65 61 63 68 28 61 6c 74  >     foreach(alt<
0011360 65 72 6e 61 74 69 76 65 3b 20 46 69 6e 64 57 6f  >ernative; FindWo<
0011400 72 64 73 28 20 70 68 6f 6e 65 20 29 20 29 0a 20  >rds( phone ) ). <
0011420 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65  >           write<
0011440 66 6c 6e 28 70 68 6f 6e 65 2c 20 22 3a 20 22 2c  >fln(phone, ": ",<
0011460 20 61 6c 74 65 72 6e 61 74 69 76 65 20 29 3b 0a  > alternative );.<
0011500 7d 0a 0a                                         >}..<
0011503
