10000:0000  2F 2F 20 43 72 65 61 74-65 64 20 62 79 20 4C 69   // Created by Li
20000:0010  6F 6E 65 6C 6C 6F 20 4C-75 6E 65 73 75 20 61 6E   onello Lunesu an
30000:0020  64 20 70 6C 61 63 65 64-20 69 6E 20 74 68 65 20   d placed in the
40000:0030  70 75 62 6C 69 63 20 64-6F 6D 61 69 6E 2E 0A 2F   public domain.◙/
50000:0040  2F 20 54 68 69 73 20 66-69 6C 65 20 68 61 73 20   / This file has
60000:0050  62 65 65 6E 20 6D 6F 64-69 66 69 65 64 20 66 72   been modified fr
70000:0060  6F 6D 20 69 74 73 20 6F-72 69 67 69 6E 61 6C 20   om its original
80000:0070  76 65 72 73 69 6F 6E 2E-0A 2F 2F 20 49 74 20 68   version.◙// It h
90000:0080  61 73 20 62 65 65 6E 20-66 6F 72 6D 61 74 74 65   as been formatte
100000:0090  64 20 74 6F 20 66 69 74-20 79 6F 75 72 20 73 63   d to fit your sc
110000:00A0  72 65 65 6E 2E 0A 6D 6F-64 75 6C 65 20 70 68 6F   reen.◙module pho
120000:00B0  6E 65 6E 6F 3B 20 20 20-20 20 2F 2F 20 6F 70 74   neno;     // opt
130000:00C0  69 6F 6E 61 6C 0A 69 6D-70 6F 72 74 20 73 74 64   ional◙import std
140000:00D0  2E 73 74 64 69 6F 3B 20-20 20 2F 2F 20 77 72 69   .stdio;   // wri
150000:00E0  74 65 66 6C 6E 20 20 20-20 20 0A 69 6D 70 6F 72   tefln     ◙impor
160000:00F0  74 20 73 74 64 2E 63 74-79 70 65 3B 20 20 20 2F   t std.ctype;   /
170000:0100  2F 20 69 73 64 69 67 69-74 20 20 20 20 20 0A 69   / isdigit     ◙i
180000:0110  6D 70 6F 72 74 20 73 74-64 2E 73 74 72 65 61 6D   mport std.stream
190000:0120  3B 20 20 2F 2F 20 42 75-66 66 65 72 65 64 46 69   ;  // BufferedFi
200000:0130  6C 65 0A 0A 2F 2F 20 4A-75 73 74 20 66 6F 72 20   le◙◙// Just for
210000:0140  72 65 61 64 61 62 69 6C-69 74 79 20 28 69 6D 61   readability (ima
220000:0150  67 69 6E 65 20 63 68 61-72 5B 5D 5B 5D 5B 63 68   gine char[][][ch
230000:0160  61 72 5B 5D 5D 29 20 20-20 20 0A 61 6C 69 61 73   ar[]])    ◙alias
240000:0170  20 63 68 61 72 5B 5D 20-73 74 72 69 6E 67 3B 0A    char[] string;◙
250000:0180  61 6C 69 61 73 20 73 74-72 69 6E 67 5B 5D 20 73   alias string[] s
260000:0190  74 72 69 6E 67 61 72 72-61 79 3B 0A 0A 2F 2F 2F   tringarray;◙◙///
270000:01A0  20 53 74 72 69 70 73 20-6E 6F 6E 2D 64 69 67 69    Strips non-digi
280000:01B0  74 20 63 68 61 72 61 63-74 65 72 73 20 66 72 6F   t characters fro
290000:01C0  6D 20 74 68 65 20 73 74-72 69 6E 67 20 28 43 4F   m the string (CO
300000:01D0  57 29 0A 73 74 72 69 6E-67 20 73 74 72 69 70 4E   W)◙string stripN
310000:01E0  6F 6E 44 69 67 69 74 28-20 69 6E 20 73 74 72 69   onDigit( in stri
320000:01F0  6E 67 20 6C 69 6E 65 20-29 20 0A 7B 0A 20 20 20   ng line ) ◙{◙
330000:0200  20 73 74 72 69 6E 67 20-72 65 74 3B 0A 20 20 20    string ret;◙
340000:0210  20 66 6F 72 65 61 63 68-28 75 69 6E 74 20 69 2C    foreach(uint i,
350000:0220  20 63 3B 20 6C 69 6E 65-29 20 7B 0A 20 20 20 20    c; line) {◙
360000:0230  20 20 20 20 2F 2F 20 45-72 72 6F 72 3A 20 73 74       // Error: st
370000:0240  64 2E 63 74 79 70 65 2E-69 73 64 69 67 69 74 20   d.ctype.isdigit
380000:0250  61 74 20 43 3A 5C 64 6D-64 5C 73 72 63 5C 70 68   at C:\dmd\src\ph
390000:0260  6F 62 6F 73 5C 73 74 64-5C 63 74 79 70 65 2E 64   obos\std\ctype.d
400000:0270  28 33 37 29 20 0A 20 20-20 20 20 20 20 20 2F 2F   (37) ◙        //
410000:0280  20 63 6F 6E 66 6C 69 63-74 73 20 77 69 74 68 20    conflicts with
420000:0290  73 74 64 2E 73 74 72 65-61 6D 2E 69 73 64 69 67   std.stream.isdig
430000:02A0  69 74 20 61 74 20 43 3A-5C 64 6D 64 5C 73 72 63   it at C:\dmd\src
440000:02B0  5C 70 68 6F 62 6F 73 5C-73 74 64 5C 73 74 72 65   \phobos\std\stre
450000:02C0  61 6D 2E 64 28 32 39 32-34 29 0A 20 20 20 20 20   am.d(2924)◙
460000:02D0  20 20 20 69 66 20 28 21-73 74 64 2E 63 74 79 70      if (!std.ctyp
470000:02E0  65 2E 69 73 64 69 67 69-74 28 63 29 29 20 7B 0A   e.isdigit(c)) {◙
480000:02F0  20 20 20 20 20 20 20 20-20 20 20 20 69 66 20 28               if (
490000:0300  21 72 65 74 29 0A 20 20-20 20 20 20 20 20 20 20   !ret)◙
500000:0310  20 20 20 20 20 20 72 65-74 20 3D 20 6C 69 6E 65         ret = line
510000:0320  5B 30 2E 2E 69 5D 3B 20-20 20 20 0A 20 20 20 20   [0..i];    ◙
520000:0330  20 20 20 20 7D 20 20 20-20 0A 20 20 20 20 20 20       }    ◙
530000:0340  20 20 65 6C 73 65 20 69-66 20 28 72 65 74 29 0A     else if (ret)◙
540000:0350  20 20 20 20 20 20 20 20-20 20 20 20 72 65 74 20               ret
550000:0360  7E 3D 20 63 3B 20 20 20-20 0A 20 20 20 20 7D 20   ~= c;    ◙    }
560000:0370  20 20 20 0A 20 20 20 20-72 65 74 75 72 6E 20 72      ◙    return r
570000:0380  65 74 3F 72 65 74 3A 6C-69 6E 65 3B 0A 7D 0A 0A   et?ret:line;◙}◙◙
580000:0390  75 6E 69 74 74 65 73 74-20 7B 0A 20 20 20 20 61   unittest {◙    a
590000:03A0  73 73 65 72 74 28 20 73-74 72 69 70 4E 6F 6E 44   ssert( stripNonD
600000:03B0  69 67 69 74 28 22 61 73-64 66 22 29 20 3D 3D 20   igit("asdf") ==
610000:03C0  22 22 20 20 29 3B 0A 20-20 20 20 61 73 73 65 72   ""  );◙    asser
620000:03D0  74 28 20 73 74 72 69 70-4E 6F 6E 44 69 67 69 74   t( stripNonDigit
630000:03E0  28 22 5C 27 31 33 2D 3D-32 20 34 6B 6F 70 22 29   ("\'13-=2 4kop")
640000:03F0  20 3D 3D 20 20 22 31 33-32 34 22 20 20 29 3B 0A    ==  "1324"  );◙
650000:0400  7D 0A 0A 2F 2F 2F 20 43-6F 6E 76 65 72 74 73 20   }◙◙/// Converts
660000:0410  61 20 77 6F 72 64 20 69-6E 74 6F 20 61 20 6E 75   a word into a nu
670000:0420  6D 62 65 72 2C 20 69 67-6E 6F 72 69 6E 67 20 61   mber, ignoring a
680000:0430  6C 6C 20 6E 6F 6E 20 61-6C 70 68 61 20 63 68 61   ll non alpha cha
690000:0440  72 61 63 74 65 72 73 20-20 0A 73 74 72 69 6E 67   racters  ◙string
700000:0450  20 77 6F 72 64 54 6F 4E-75 6D 28 20 69 6E 20 73    wordToNum( in s
710000:0460  74 72 69 6E 67 20 77 6F-72 64 20 29 0A 7B 0A 2F   tring word )◙{◙/
720000:0470  2F 20 74 72 61 6E 73 6C-61 74 69 6F 6E 20 74 61   / translation ta
730000:0480  62 6C 65 20 66 6F 72 20-74 68 65 20 74 61 73 6B   ble for the task
740000:0490  20 61 74 20 68 61 6E 64-0A 63 6F 6E 73 74 20 63    at hand◙const c
750000:04A0  68 61 72 5B 32 35 36 5D-20 54 52 41 4E 53 4C 41   har[256] TRANSLA
760000:04B0  54 45 20 3D 20 20 20 20-0A 20 20 20 20 22 20 20   TE =    ◙    "
770000:04C0  20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
780000:04D0  20 20 20 20 20 20 20 20-20 20 20 20 20 20 22 20                 "
790000:04E0  20 2F 2F 20 30 20 20 20-0A 20 20 20 20 22 20 20    // 0   ◙    "
800000:04F0  20 20 20 20 20 20 20 20-20 20 20 20 20 20 30 31                 01
810000:0500  32 33 34 35 36 37 38 39-20 20 20 20 20 20 22 20   23456789      "
820000:0510  20 2F 2F 20 33 32 20 20-20 20 20 0A 20 20 20 20    // 32     ◙
830000:0520  22 20 35 37 36 33 30 34-39 39 36 31 37 38 35 31   " 57630499617851
840000:0530  38 38 31 32 33 34 37 36-32 32 33 39 20 20 20 20   881234762239
850000:0540  20 22 20 20 2F 2F 20 36-34 20 20 20 0A 20 20 20    "  // 64   ◙
860000:0550  20 22 20 35 37 36 33 30-34 39 39 36 31 37 38 35    " 5763049961785
870000:0560  31 38 38 31 32 33 34 37-36 32 32 33 39 20 20 20   1881234762239
880000:0570  20 20 22 0A 20 20 20 20-22 20 20 20 20 20 20 20     "◙    "
890000:0580  20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
900000:0590  20 20 20 20 20 20 20 20-20 22 0A 20 20 20 20 22            "◙    "
910000:05A0  20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
920000:05B0  20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
930000:05C0  22 0A 20 20 20 20 22 20-20 20 20 20 20 20 20 20   "◙    "
940000:05D0  20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
950000:05E0  20 20 20 20 20 20 20 22-20 20 20 20 0A 20 20 20          "    ◙
960000:05F0  20 22 20 20 20 20 20 20-20 20 20 20 20 20 20 20    "
970000:0600  20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
980000:0610  20 20 22 3B 0A 20 20 20-20 73 74 72 69 6E 67 20     ";◙    string
990000:0620  72 65 74 3B 0A 20 20 20-20 66 6F 72 65 61 63 68   ret;◙    foreach
1000000:0630  28 63 3B 20 63 61 73 74-28 75 62 79 74 65 5B 5D   (c; cast(ubyte[]
1010000:0640  29 77 6F 72 64 29 0A 20-20 20 20 20 20 20 20 69   )word)◙        i
1020000:0650  66 20 28 54 52 41 4E 53-4C 41 54 45 5B 63 5D 20   f (TRANSLATE[c]
1030000:0660  21 3D 20 27 20 27 29 0A-20 20 20 20 20 20 20 20   != ' ')◙
1040000:0670  20 20 20 20 72 65 74 20-7E 3D 20 54 52 41 4E 53       ret ~= TRANS
1050000:0680  4C 41 54 45 5B 63 5D 3B-0A 20 20 20 20 72 65 74   LATE[c];◙    ret
1060000:0690  75 72 6E 20 72 65 74 3B-0A 7D 0A 0A 75 6E 69 74   urn ret;◙}◙◙unit
1070000:06A0  74 65 73 74 20 7B 0A 20-2F 2F 20 54 65 73 74 20   test {◙ // Test
1080000:06B0  77 6F 72 64 54 6F 4E 75-6D 20 75 73 69 6E 67 20   wordToNum using
1090000:06C0  74 68 65 20 74 61 62 6C-65 20 66 72 6F 6D 20 74   the table from t
1100000:06D0  68 65 20 74 61 73 6B 20-64 65 73 63 72 69 70 74   he task descript
1110000:06E0  69 6F 6E 2E 0A 20 61 73-73 65 72 74 28 20 22 30   ion.◙ assert( "0
1120000:06F0  31 31 31 32 32 32 33 33-33 34 34 35 35 36 36 36   1112223334455666
1130000:0700  37 37 37 38 38 38 39 39-39 22 20 3D 3D 0A 20 20   777888999" ==◙
1140000:0710  20 77 6F 72 64 54 6F 4E-75 6D 28 22 45 20 7C 20    wordToNum("E |
1150000:0720  4A 20 4E 20 51 20 7C 20-52 20 57 20 58 20 7C 20   J N Q | R W X |
1160000:0730  44 20 53 20 59 20 7C 20-46 20 54 20 7C 20 41 20   D S Y | F T | A
1170000:0740  4D 20 7C 20 43 20 49 20-56 20 7C 20 42 20 4B 20   M | C I V | B K
1180000:0750  55 20 7C 20 4C 20 4F 20-50 20 7C 20 47 20 48 20   U | L O P | G H
1190000:0760  5A 22 29 29 3B 0A 20 61-73 73 65 72 74 28 20 22   Z"));◙ assert( "
1200000:0770  30 31 31 31 32 32 32 33-33 33 34 34 35 35 36 36   0111222333445566
1210000:0780  36 37 37 37 38 38 38 39-39 39 22 20 3D 3D 20 0A   6777888999" == ◙
1220000:0790  20 20 20 77 6F 72 64 54-6F 4E 75 6D 28 22 65 20      wordToNum("e
1230000:07A0  7C 20 6A 20 6E 20 71 20-7C 20 72 20 77 20 78 20   | j n q | r w x
1240000:07B0  7C 20 64 20 73 20 79 20-7C 20 66 20 74 20 7C 20   | d s y | f t |
1250000:07C0  61 20 6D 20 7C 20 63 20-69 20 76 20 7C 20 62 20   a m | c i v | b
1260000:07D0  6B 20 75 20 7C 20 6C 20-6F 20 70 20 7C 20 67 20   k u | l o p | g
1270000:07E0  68 20 7A 22 29 29 3B 0A-20 61 73 73 65 72 74 28   h z"));◙ assert(
1280000:07F0  20 22 30 31 32 33 34 35-36 37 38 39 22 20 3D 3D    "0123456789" ==
1290000:0800  20 0A 20 20 20 77 6F 72-64 54 6F 4E 75 6D 28 22    ◙   wordToNum("
1300000:0810  30 20 7C 20 20 20 31 20-20 20 7C 20 20 20 32 20   0 |   1   |   2
1310000:0820  20 20 7C 20 20 20 33 20-20 20 7C 20 20 34 20 20     |   3   |  4
1320000:0830  7C 20 20 35 20 20 7C 20-20 20 36 20 20 20 7C 20   |  5  |   6   |
1330000:0840  20 20 37 20 20 20 7C 20-20 20 38 20 20 20 7C 20     7   |   8   |
1340000:0850  20 20 39 22 29 29 3B 0A-7D 0A 0A 76 6F 69 64 20     9"));◙}◙◙void
1350000:0860  6D 61 69 6E 28 20 73 74-72 69 6E 67 5B 5D 20 61   main( string[] a
1360000:0870  72 67 73 20 29 0A 7B 0A-20 20 20 20 2F 2F 20 54   rgs )◙{◙    // T
1370000:0880  68 69 73 20 61 73 73 6F-63 69 61 74 69 76 65 20   his associative
1380000:0890  61 72 72 61 79 20 6D 61-70 73 20 61 20 6E 75 6D   array maps a num
1390000:08A0  62 65 72 20 74 6F 20 61-6E 20 61 72 72 61 79 20   ber to an array
1400000:08B0  6F 66 20 77 6F 72 64 73-2E 20 20 20 20 0A 20 20   of words.    ◙
1410000:08C0  20 20 73 74 72 69 6E 67-61 72 72 61 79 5B 73 74     stringarray[st
1420000:08D0  72 69 6E 67 5D 20 20 20-20 6E 75 6D 32 77 6F 72   ring]    num2wor
1430000:08E0  64 73 3B 0A 0A 20 20 20-20 66 6F 72 65 61 63 68   ds;◙◙    foreach
1440000:08F0  28 73 74 72 69 6E 67 20-77 6F 72 64 3B 20 6E 65   (string word; ne
1450000:0900  77 20 42 75 66 66 65 72-65 64 46 69 6C 65 28 22   w BufferedFile("
1460000:0910  64 69 63 74 69 6F 6E 61-72 79 2E 74 78 74 22 20   dictionary.txt"
1470000:0920  29 20 29 0A 20 20 20 20-20 20 20 20 6E 75 6D 32   ) )◙        num2
1480000:0930  77 6F 72 64 73 5B 20 77-6F 72 64 54 6F 4E 75 6D   words[ wordToNum
1490000:0940  28 77 6F 72 64 29 20 5D-20 7E 3D 20 77 6F 72 64   (word) ] ~= word
1500000:0950  2E 64 75 70 3B 20 20 20-20 20 20 20 20 2F 2F 20   .dup;        //
1510000:0960  6D 75 73 74 20 64 75 70-0A 0A 20 20 20 20 2F 2F   must dup◙◙    //
1520000:0970  2F 20 46 69 6E 64 73 20-61 6C 6C 20 61 6C 74 65   / Finds all alte
1530000:0980  72 6E 61 74 69 76 65 73-20 66 6F 72 20 74 68 65   rnatives for the
1540000:0990  20 67 69 76 65 6E 20 6E-75 6D 62 65 72 0A 20 20    given number◙
1550000:09A0  20 20 2F 2F 2F 20 28 73-68 6F 75 6C 64 20 68 61     /// (should ha
1560000:09B0  76 65 20 62 65 65 6E 20-73 74 72 69 70 70 65 64   ve been stripped
1570000:09C0  20 66 72 6F 6D 20 6E 6F-6E 2D 64 69 67 69 74 20    from non-digit
1580000:09D0  63 68 61 72 61 63 74 65-72 73 29 0A 20 20 20 20   characters)◙
1590000:09E0  73 74 72 69 6E 67 61 72-72 61 79 20 5F 46 69 6E   stringarray _Fin
1600000:09F0  64 57 6F 72 64 73 28 20-73 74 72 69 6E 67 20 6E   dWords( string n
1610000:0A00  75 6D 62 65 72 73 2C 20-62 6F 6F 6C 20 64 69 67   umbers, bool dig
1620000:0A10  69 74 6F 6B 20 29 0A 20-20 20 20 69 6E 20 7B 0A   itok )◙    in {◙
1630000:0A20  20 20 20 20 20 20 20 20-61 73 73 65 72 74 28 6E           assert(n
1640000:0A30  75 6D 62 65 72 73 2E 6C-65 6E 67 74 68 20 3E 20   umbers.length >
1650000:0A40  20 30 29 3B 20 20 20 20-0A 20 20 20 20 7D 20 20    0);    ◙    }
1660000:0A50  20 20 0A 20 20 20 20 6F-75 74 28 72 65 73 75 6C     ◙    out(resul
1670000:0A60  74 29 20 7B 0A 20 20 20-20 20 20 20 20 66 6F 72   t) {◙        for
1680000:0A70  65 61 63 68 20 28 61 3B-20 72 65 73 75 6C 74 29   each (a; result)
1690000:0A80  0A 20 20 20 20 20 20 20-20 20 20 20 20 61 73 73   ◙            ass
1700000:0A90  65 72 74 28 20 77 6F 72-64 54 6F 4E 75 6D 28 61   ert( wordToNum(a
1710000:0AA0  29 20 3D 3D 20 6E 75 6D-62 65 72 73 20 29 3B 0A   ) == numbers );◙
1720000:0AB0  20 20 20 20 7D 20 20 20-20 0A 20 20 20 20 62 6F       }    ◙    bo
1730000:0AC0  64 79 20 7B 0A 20 20 20-20 20 20 20 20 73 74 72   dy {◙        str
1740000:0AD0  69 6E 67 61 72 72 61 79-20 72 65 74 3B 0A 20 20   ingarray ret;◙
1750000:0AE0  20 20 20 20 20 20 62 6F-6F 6C 20 66 6F 75 6E 64         bool found
1760000:0AF0  77 6F 72 64 20 3D 20 66-61 6C 73 65 3B 0A 20 20   word = false;◙
1770000:0B00  20 20 20 20 20 20 66 6F-72 20 28 75 69 6E 74 20         for (uint
1780000:0B10  74 3D 31 3B 20 74 3C 3D-6E 75 6D 62 65 72 73 2E   t=1; t<=numbers.
1790000:0B20  6C 65 6E 67 74 68 3B 20-2B 2B 74 29 20 7B 0A 20   length; ++t) {◙
1800000:0B30  20 20 20 20 20 20 20 20-20 20 20 61 75 74 6F 20              auto
1810000:0B40  61 6C 74 65 72 6E 61 74-69 76 65 73 20 3D 20 6E   alternatives = n
1820000:0B50  75 6D 62 65 72 73 5B 30-2E 2E 74 5D 20 69 6E 20   umbers[0..t] in
1830000:0B60  6E 75 6D 32 77 6F 72 64-73 3B 0A 20 20 20 20 20   num2words;◙
1840000:0B70  20 20 20 20 20 20 20 69-66 20 28 21 61 6C 74 65          if (!alte
1850000:0B80  72 6E 61 74 69 76 65 73-29 0A 20 20 20 20 20 20   rnatives)◙
1860000:0B90  20 20 20 20 20 20 20 20-20 20 63 6F 6E 74 69 6E             contin
1870000:0BA0  75 65 3B 0A 20 20 20 20-20 20 20 20 20 20 20 20   ue;◙
1880000:0BB0  66 6F 75 6E 64 77 6F 72-64 20 3D 20 74 72 75 65   foundword = true
1890000:0BC0  3B 0A 20 20 20 20 20 20-20 20 20 20 20 20 69 66   ;◙            if
1900000:0BD0  20 28 6E 75 6D 62 65 72-73 2E 6C 65 6E 67 74 68    (numbers.length
1910000:0BE0  20 3E 20 20 74 29 20 7B-0A 20 20 20 20 20 20 20    >  t) {◙
1920000:0BF0  20 20 20 20 20 20 20 20-20 2F 2F 20 43 6F 6D 62            // Comb
1930000:0C00  69 6E 65 20 61 6C 6C 20-63 75 72 72 65 6E 74 20   ine all current
1940000:0C10  61 6C 74 65 72 6E 61 74-69 76 65 73 20 77 69 74   alternatives wit
1950000:0C20  68 20 61 6C 6C 20 61 6C-74 65 72 6E 61 74 69 76   h all alternativ
1960000:0C30  65 73 20 20 20 20 20 0A-20 20 20 20 20 20 20 20   es     ◙
1970000:0C40  20 20 20 20 20 20 20 20-2F 2F 20 6F 66 20 74 68           // of th
1980000:0C50  65 20 72 65 73 74 20 28-6E 65 78 74 20 70 69 65   e rest (next pie
1990000:0C60  63 65 20 63 61 6E 20 73-74 61 72 74 20 77 69 74   ce can start wit
2000000:0C70  68 20 61 20 64 69 67 69-74 29 20 20 20 20 20 20   h a digit)
2010000:0C80  20 20 20 20 20 20 20 20-0A 20 20 20 20 20 20 20           ◙
2020000:0C90  20 20 20 20 20 20 20 20-20 66 6F 72 65 61 63 68            foreach
2030000:0CA0  20 28 61 32 3B 20 5F 46-69 6E 64 57 6F 72 64 73    (a2; _FindWords
2040000:0CB0  28 20 6E 75 6D 62 65 72-73 5B 74 2E 2E 24 5D 2C   ( numbers[t..$],
2050000:0CC0  20 74 72 75 65 20 20 20-20 20 29 20 29 0A 20 20    true     ) )◙
2060000:0CD0  20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
2070000:0CE0  20 20 66 6F 72 65 61 63-68 28 61 31 3B 20 2A 61     foreach(a1; *a
2080000:0CF0  6C 74 65 72 6E 61 74 69-76 65 73 29 0A 20 20 20   lternatives)◙
2090000:0D00  20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
2100000:0D10  20 20 20 20 72 65 74 20-7E 3D 20 61 31 20 7E 20       ret ~= a1 ~
2110000:0D20  22 20 22 20 7E 20 61 32-3B 0A 20 20 20 20 20 20   " " ~ a2;◙
2120000:0D30  20 20 20 20 20 20 7D 0A-20 20 20 20 20 20 20 20         }◙
2130000:0D40  20 20 20 20 65 6C 73 65-20 20 20 20 0A 20 20 20       else    ◙
2140000:0D50  20 20 20 20 20 20 20 20-20 20 20 20 20 72 65 74                ret
2150000:0D60  20 7E 3D 20 2A 61 6C 74-65 72 6E 61 74 69 76 65    ~= *alternative
2160000:0D70  73 3B 20 20 20 20 2F 2F-20 61 70 70 65 6E 64 20   s;    // append
2170000:0D80  74 68 65 73 65 20 61 6C-74 65 72 6E 61 74 69 76   these alternativ
2180000:0D90  65 73 0A 20 20 20 20 20-20 20 20 7D 0A 20 20 20   es◙        }◙
2190000:0DA0  20 20 20 20 20 2F 2F 20-54 72 79 20 74 6F 20 6B        // Try to k
2200000:0DB0  65 65 70 20 31 20 64 69-67 69 74 2C 20 6F 6E 6C   eep 1 digit, onl
2210000:0DC0  79 20 69 66 20 77 65 27-72 65 20 61 6C 6C 6F 77   y if we're allow
2220000:0DD0  65 64 20 61 6E 64 20 6E-6F 20 6F 74 68 65 72 0A   ed and no other◙
2230000:0DE0  20 20 20 20 20 20 20 20-2F 2F 20 61 6C 74 65 72           // alter
2240000:0DF0  6E 61 74 69 76 65 73 20-77 65 72 65 20 66 6F 75   natives were fou
2250000:0E00  6E 64 0A 20 20 20 20 20-20 20 20 2F 2F 20 54 65   nd◙        // Te
2260000:0E10  73 74 69 6E 67 20 22 72-65 74 2E 6C 65 6E 67 74   sting "ret.lengt
2270000:0E20  68 22 20 6D 61 6B 65 73-20 6D 6F 72 65 20 73 65   h" makes more se
2280000:0E30  6E 73 65 20 74 68 61 6E-20 74 65 73 74 69 6E 67   nse than testing
2290000:0E40  20 22 66 6F 75 6E 64 77-6F 72 64 22 2C 0A 20 20    "foundword",◙
2300000:0E50  20 20 20 20 20 20 2F 2F-20 62 75 74 20 74 68 65         // but the
2310000:0E60  20 6F 74 68 65 72 20 69-6D 70 6C 65 6D 65 6E 74    other implement
2320000:0E70  61 74 69 6F 6E 73 20 73-65 65 6D 20 74 6F 20 64   ations seem to d
2330000:0E80  6F 20 6A 75 73 74 20 74-68 69 73 2E 0A 20 20 20   o just this.◙
2340000:0E90  20 20 20 20 20 69 66 20-28 64 69 67 69 74 6F 6B        if (digitok
2350000:0EA0  20 26 26 20 21 66 6F 75-6E 64 77 6F 72 64 29 20    && !foundword)
2360000:0EB0  7B 20 2F 2F 72 65 74 2E-6C 65 6E 67 74 68 20 3D   { //ret.length =
2370000:0EC0  3D 20 30 20 20 0A 20 20-20 20 20 20 20 20 20 20   = 0  ◙
2380000:0ED0  20 20 69 66 28 6E 75 6D-62 65 72 73 2E 6C 65 6E     if(numbers.len
2390000:0EE0  67 74 68 20 3E 20 20 31-29 20 7B 0A 20 20 20 20   gth >  1) {◙
2400000:0EF0  20 20 20 20 20 20 20 20-20 20 20 20 2F 2F 20 43               // C
2410000:0F00  6F 6D 62 69 6E 65 20 31-20 64 69 67 69 74 20 77   ombine 1 digit w
2420000:0F10  69 74 68 20 61 6C 6C 20-61 6C 74 65 6E 61 74 69   ith all altenati
2430000:0F20  76 65 73 20 66 72 6F 6D-20 74 68 65 20 72 65 73   ves from the res
2440000:0F30  74 20 20 20 20 0A 20 20-20 20 20 20 20 20 20 20   t    ◙
2450000:0F40  20 20 20 20 20 20 2F 2F-20 28 6E 65 78 74 20 70         // (next p
2460000:0F50  69 65 63 65 20 63 61 6E-20 6E 6F 74 20 73 74 61   iece can not sta
2470000:0F60  72 74 20 77 69 74 68 20-61 20 64 69 67 69 74 29   rt with a digit)
2480000:0F70  20 20 20 20 20 20 20 20-20 20 0A 20 20 20 20 20             ◙
2490000:0F80  20 20 20 20 20 20 20 20-20 20 20 66 6F 72 65 61              forea
2500000:0F90  63 68 20 28 61 3B 20 5F-46 69 6E 64 57 6F 72 64   ch (a; _FindWord
2510000:0FA0  73 28 20 6E 75 6D 62 65-72 73 5B 31 2E 2E 24 5D   s( numbers[1..$]
2520000:0FB0  2C 20 66 61 6C 73 65 20-29 20 29 0A 20 20 20 20   , false ) )◙
2530000:0FC0  20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
2540000:0FD0  72 65 74 20 7E 3D 20 6E-75 6D 62 65 72 73 5B 30   ret ~= numbers[0
2550000:0FE0  2E 2E 31 5D 20 7E 20 22-20 22 20 7E 20 61 3B 0A   ..1] ~ " " ~ a;◙
2560000:0FF0  20 20 20 20 20 20 20 20-20 20 20 20 7D 20 20 20               }
2570000:1000  20 0A 20 20 20 20 20 20-20 20 20 20 20 20 65 6C    ◙            el
2580000:1010  73 65 20 20 20 20 0A 20-20 20 20 20 20 20 20 20   se    ◙
2590000:1020  20 20 20 20 20 20 20 72-65 74 20 7E 3D 20 6E 75          ret ~= nu
2600000:1030  6D 62 65 72 73 5B 30 2E-2E 31 5D 3B 20 20 20 20   mbers[0..1];
2610000:1040  2F 2F 20 6A 75 73 74 20-61 70 70 65 6E 64 20 74   // just append t
2620000:1050  68 69 73 20 64 69 67 69-74 20 20 20 20 20 20 20   his digit
2630000:1060  20 20 20 20 20 20 0A 20-20 20 20 20 20 20 20 7D         ◙        }
2640000:1070  20 20 20 20 0A 20 20 20-20 20 20 20 20 72 65 74       ◙        ret
2650000:1080  75 72 6E 20 72 65 74 3B-0A 20 20 20 20 7D 0A 0A   urn ret;◙    }◙◙
2660000:1090  20 20 20 20 2F 2F 2F 20-28 54 68 69 73 20 66 75       /// (This fu
2670000:10A0  6E 63 74 69 6F 6E 20 77-61 73 20 69 6E 6C 69 6E   nction was inlin
2680000:10B0  65 64 20 69 6E 20 74 68-65 20 6F 72 69 67 69 6E   ed in the origin
2690000:10C0  61 6C 20 70 72 6F 67 72-61 6D 29 20 0A 20 20 20   al program) ◙
2700000:10D0  20 2F 2F 2F 20 46 69 6E-64 73 20 61 6C 6C 20 61    /// Finds all a
2710000:10E0  6C 74 65 72 6E 61 74 69-76 65 73 20 66 6F 72 20   lternatives for
2720000:10F0  74 68 65 20 67 69 76 65-6E 20 70 68 6F 6E 65 20   the given phone
2730000:1100  6E 75 6D 62 65 72 20 0A-20 20 20 20 2F 2F 2F 20   number ◙    ///
2740000:1110  52 65 74 75 72 6E 73 3A-20 61 72 72 61 79 20 6F   Returns: array o
2750000:1120  66 20 73 74 72 69 6E 67-73 20 0A 20 20 20 20 73   f strings ◙    s
2760000:1130  74 72 69 6E 67 61 72 72-61 79 20 46 69 6E 64 57   tringarray FindW
2770000:1140  6F 72 64 73 28 20 73 74-72 69 6E 67 20 70 68 6F   ords( string pho
2780000:1150  6E 65 5F 6E 75 6D 62 65-72 20 29 0A 20 20 20 20   ne_number )◙
2790000:1160  7B 0A 20 20 20 20 20 20-20 20 69 66 20 28 21 70   {◙        if (!p
2800000:1170  68 6F 6E 65 5F 6E 75 6D-62 65 72 2E 6C 65 6E 67   hone_number.leng
2810000:1180  74 68 29 0A 20 20 20 20-20 20 20 20 20 20 20 20   th)◙
2820000:1190  72 65 74 75 72 6E 20 6E-75 6C 6C 3B 0A 20 20 20   return null;◙
2830000:11A0  20 20 20 20 20 2F 2F 20-53 74 72 69 70 20 74 68        // Strip th
2840000:11B0  65 20 6E 6F 6E 2D 64 69-67 69 74 20 63 68 61 72   e non-digit char
2850000:11C0  61 63 74 65 72 73 20 66-72 6F 6D 20 74 68 65 20   acters from the
2860000:11D0  70 68 6F 6E 65 20 6E 75-6D 62 65 72 2C 20 61 6E   phone number, an
2870000:11E0  64 0A 20 20 20 20 20 20-20 20 2F 2F 20 70 61 73   d◙        // pas
2880000:11F0  73 20 69 74 20 74 6F 20-74 68 65 20 72 65 63 75   s it to the recu
2890000:1200  72 73 69 76 65 20 66 75-6E 63 74 69 6F 6E 20 28   rsive function (
2900000:1210  6C 65 61 64 69 6E 67 20-64 69 67 69 74 20 69 73   leading digit is
2910000:1220  20 61 6C 6C 6F 77 65 64-29 0A 20 20 20 20 20 20    allowed)◙
2920000:1230  20 20 72 65 74 75 72 6E-20 5F 46 69 6E 64 57 6F     return _FindWo
2930000:1240  72 64 73 28 20 73 74 72-69 70 4E 6F 6E 44 69 67   rds( stripNonDig
2940000:1250  69 74 28 70 68 6F 6E 65-5F 6E 75 6D 62 65 72 29   it(phone_number)
2950000:1260  2C 20 74 72 75 65 20 29-3B 20 20 20 20 0A 20 20   , true );    ◙
2960000:1270  20 20 7D 20 20 20 20 0A-20 20 20 20 0A 20 20 20     }    ◙    ◙
2970000:1280  20 2F 2F 20 52 65 61 64-20 74 68 65 20 70 68 6F    // Read the pho
2980000:1290  6E 65 20 6E 75 6D 62 65-72 73 20 20 20 20 20 0A   ne numbers     ◙
2990000:12A0  20 20 20 20 66 6F 72 65-61 63 68 28 73 74 72 69       foreach(stri
3000000:12B0  6E 67 20 70 68 6F 6E 65-3B 20 6E 65 77 20 42 75   ng phone; new Bu
3010000:12C0  66 66 65 72 65 64 46 69-6C 65 28 22 69 6E 70 75   fferedFile("inpu
3020000:12D0  74 2E 74 78 74 22 20 20-20 29 20 29 0A 20 20 20   t.txt"   ) )◙
3030000:12E0  20 20 20 20 20 66 6F 72-65 61 63 68 28 61 6C 74        foreach(alt
3040000:12F0  65 72 6E 61 74 69 76 65-3B 20 46 69 6E 64 57 6F   ernative; FindWo
3050000:1300  72 64 73 28 20 70 68 6F-6E 65 20 29 20 29 0A 20   rds( phone ) )◙
3060000:1310  20 20 20 20 20 20 20 20-20 20 20 77 72 69 74 65              write
3070000:1320  66 6C 6E 28 70 68 6F 6E-65 2C 20 22 3A 20 22 2C   fln(phone, ": ",
3080000:1330  20 61 6C 74 65 72 6E 61-74 69 76 65 20 29 3B 0A    alternative );◙
3090000:1340  7D 0A 0A                                          }◙◙
310