0000000: 2f2f 2043 7265 6174 6564 2062 7920 4c69  // Created by Li
0000010: 6f6e 656c 6c6f 204c 756e 6573 7520 616e  onello Lunesu an
0000020: 6420 706c 6163 6564 2069 6e20 7468 6520  d placed in the 
0000030: 7075 626c 6963 2064 6f6d 6169 6e2e 0a2f  public domain../
0000040: 2f20 5468 6973 2066 696c 6520 6861 7320  / This file has 
0000050: 6265 656e 206d 6f64 6966 6965 6420 6672  been modified fr
0000060: 6f6d 2069 7473 206f 7269 6769 6e61 6c20  om its original 
0000070: 7665 7273 696f 6e2e 0a2f 2f20 4974 2068  version..// It h
0000080: 6173 2062 6565 6e20 666f 726d 6174 7465  as been formatte
0000090: 6420 746f 2066 6974 2079 6f75 7220 7363  d to fit your sc
00000a0: 7265 656e 2e0a 6d6f 6475 6c65 2070 686f  reen..module pho
00000b0: 6e65 6e6f 3b20 2020 2020 2f2f 206f 7074  neno;     // opt
00000c0: 696f 6e61 6c0a 696d 706f 7274 2073 7464  ional.import std
00000d0: 2e73 7464 696f 3b20 2020 2f2f 2077 7269  .stdio;   // wri
00000e0: 7465 666c 6e20 2020 2020 0a69 6d70 6f72  tefln     .impor
00000f0: 7420 7374 642e 6374 7970 653b 2020 202f  t std.ctype;   /
0000100: 2f20 6973 6469 6769 7420 2020 2020 0a69  / isdigit     .i
0000110: 6d70 6f72 7420 7374 642e 7374 7265 616d  mport std.stream
0000120: 3b20 202f 2f20 4275 6666 6572 6564 4669  ;  // BufferedFi
0000130: 6c65 0a0a 2f2f 204a 7573 7420 666f 7220  le..// Just for 
0000140: 7265 6164 6162 696c 6974 7920 2869 6d61  readability (ima
0000150: 6769 6e65 2063 6861 725b 5d5b 5d5b 6368  gine char[][][ch
0000160: 6172 5b5d 5d29 2020 2020 0a61 6c69 6173  ar[]])    .alias
0000170: 2063 6861 725b 5d20 7374 7269 6e67 3b0a   char[] string;.
0000180: 616c 6961 7320 7374 7269 6e67 5b5d 2073  alias string[] s
0000190: 7472 696e 6761 7272 6179 3b0a 0a2f 2f2f  tringarray;..///
00001a0: 2053 7472 6970 7320 6e6f 6e2d 6469 6769   Strips non-digi
00001b0: 7420 6368 6172 6163 7465 7273 2066 726f  t characters fro
00001c0: 6d20 7468 6520 7374 7269 6e67 2028 434f  m the string (CO
00001d0: 5729 0a73 7472 696e 6720 7374 7269 704e  W).string stripN
00001e0: 6f6e 4469 6769 7428 2069 6e20 7374 7269  onDigit( in stri
00001f0: 6e67 206c 696e 6520 2920 0a7b 0a20 2020  ng line ) .{.   
0000200: 2073 7472 696e 6720 7265 743b 0a20 2020   string ret;.   
0000210: 2066 6f72 6561 6368 2875 696e 7420 692c   foreach(uint i,
0000220: 2063 3b20 6c69 6e65 2920 7b0a 2020 2020   c; line) {.    
0000230: 2020 2020 2f2f 2045 7272 6f72 3a20 7374      // Error: st
0000240: 642e 6374 7970 652e 6973 6469 6769 7420  d.ctype.isdigit 
0000250: 6174 2043 3a5c 646d 645c 7372 635c 7068  at C:\dmd\src\ph
0000260: 6f62 6f73 5c73 7464 5c63 7479 7065 2e64  obos\std\ctype.d
0000270: 2833 3729 200a 2020 2020 2020 2020 2f2f  (37) .        //
0000280: 2063 6f6e 666c 6963 7473 2077 6974 6820   conflicts with 
0000290: 7374 642e 7374 7265 616d 2e69 7364 6967  std.stream.isdig
00002a0: 6974 2061 7420 433a 5c64 6d64 5c73 7263  it at C:\dmd\src
00002b0: 5c70 686f 626f 735c 7374 645c 7374 7265  \phobos\std\stre
00002c0: 616d 2e64 2832 3932 3429 0a20 2020 2020  am.d(2924).     
00002d0: 2020 2069 6620 2821 7374 642e 6374 7970     if (!std.ctyp
00002e0: 652e 6973 6469 6769 7428 6329 2920 7b0a  e.isdigit(c)) {.
00002f0: 2020 2020 2020 2020 2020 2020 6966 2028              if (
0000300: 2172 6574 290a 2020 2020 2020 2020 2020  !ret).          
0000310: 2020 2020 2020 7265 7420 3d20 6c69 6e65        ret = line
0000320: 5b30 2e2e 695d 3b20 2020 200a 2020 2020  [0..i];    .    
0000330: 2020 2020 7d20 2020 200a 2020 2020 2020      }    .      
0000340: 2020 656c 7365 2069 6620 2872 6574 290a    else if (ret).
0000350: 2020 2020 2020 2020 2020 2020 7265 7420              ret 
0000360: 7e3d 2063 3b20 2020 200a 2020 2020 7d20  ~= c;    .    } 
0000370: 2020 200a 2020 2020 7265 7475 726e 2072     .    return r
0000380: 6574 3f72 6574 3a6c 696e 653b 0a7d 0a0a  et?ret:line;.}..
0000390: 756e 6974 7465 7374 207b 0a20 2020 2061  unittest {.    a
00003a0: 7373 6572 7428 2073 7472 6970 4e6f 6e44  ssert( stripNonD
00003b0: 6967 6974 2822 6173 6466 2229 203d 3d20  igit("asdf") == 
00003c0: 2222 2020 293b 0a20 2020 2061 7373 6572  ""  );.    asser
00003d0: 7428 2073 7472 6970 4e6f 6e44 6967 6974  t( stripNonDigit
00003e0: 2822 5c27 3133 2d3d 3220 346b 6f70 2229  ("\'13-=2 4kop")
00003f0: 203d 3d20 2022 3133 3234 2220 2029 3b0a   ==  "1324"  );.
0000400: 7d0a 0a2f 2f2f 2043 6f6e 7665 7274 7320  }../// Converts 
0000410: 6120 776f 7264 2069 6e74 6f20 6120 6e75  a word into a nu
0000420: 6d62 6572 2c20 6967 6e6f 7269 6e67 2061  mber, ignoring a
0000430: 6c6c 206e 6f6e 2061 6c70 6861 2063 6861  ll non alpha cha
0000440: 7261 6374 6572 7320 200a 7374 7269 6e67  racters  .string
0000450: 2077 6f72 6454 6f4e 756d 2820 696e 2073   wordToNum( in s
0000460: 7472 696e 6720 776f 7264 2029 0a7b 0a2f  tring word ).{./
0000470: 2f20 7472 616e 736c 6174 696f 6e20 7461  / translation ta
0000480: 626c 6520 666f 7220 7468 6520 7461 736b  ble for the task
0000490: 2061 7420 6861 6e64 0a63 6f6e 7374 2063   at hand.const c
00004a0: 6861 725b 3235 365d 2054 5241 4e53 4c41  har[256] TRANSLA
00004b0: 5445 203d 2020 2020 0a20 2020 2022 2020  TE =    .    "  
00004c0: 2020 2020 2020 2020 2020 2020 2020 2020                  
00004d0: 2020 2020 2020 2020 2020 2020 2020 2220                " 
00004e0: 202f 2f20 3020 2020 0a20 2020 2022 2020   // 0   .    "  
00004f0: 2020 2020 2020 2020 2020 2020 2020 3031                01
0000500: 3233 3435 3637 3839 2020 2020 2020 2220  23456789      " 
0000510: 202f 2f20 3332 2020 2020 200a 2020 2020   // 32     .    
0000520: 2220 3537 3633 3034 3939 3631 3738 3531  " 57630499617851
0000530: 3838 3132 3334 3736 3232 3339 2020 2020  881234762239    
0000540: 2022 2020 2f2f 2036 3420 2020 0a20 2020   "  // 64   .   
0000550: 2022 2035 3736 3330 3439 3936 3137 3835   " 5763049961785
0000560: 3138 3831 3233 3437 3632 3233 3920 2020  1881234762239   
0000570: 2020 220a 2020 2020 2220 2020 2020 2020    ".    "       
0000580: 2020 2020 2020 2020 2020 2020 2020 2020                  
0000590: 2020 2020 2020 2020 2022 0a20 2020 2022           ".    "
00005a0: 2020 2020 2020 2020 2020 2020 2020 2020                  
00005b0: 2020 2020 2020 2020 2020 2020 2020 2020                  
00005c0: 220a 2020 2020 2220 2020 2020 2020 2020  ".    "         
00005d0: 2020 2020 2020 2020 2020 2020 2020 2020                  
00005e0: 2020 2020 2020 2022 2020 2020 0a20 2020         "    .   
00005f0: 2022 2020 2020 2020 2020 2020 2020 2020   "              
0000600: 2020 2020 2020 2020 2020 2020 2020 2020                  
0000610: 2020 223b 0a20 2020 2073 7472 696e 6720    ";.    string 
0000620: 7265 743b 0a20 2020 2066 6f72 6561 6368  ret;.    foreach
0000630: 2863 3b20 6361 7374 2875 6279 7465 5b5d  (c; cast(ubyte[]
0000640: 2977 6f72 6429 0a20 2020 2020 2020 2069  )word).        i
0000650: 6620 2854 5241 4e53 4c41 5445 5b63 5d20  f (TRANSLATE[c] 
0000660: 213d 2027 2027 290a 2020 2020 2020 2020  != ' ').        
0000670: 2020 2020 7265 7420 7e3d 2054 5241 4e53      ret ~= TRANS
0000680: 4c41 5445 5b63 5d3b 0a20 2020 2072 6574  LATE[c];.    ret
0000690: 7572 6e20 7265 743b 0a7d 0a0a 756e 6974  urn ret;.}..unit
00006a0: 7465 7374 207b 0a20 2f2f 2054 6573 7420  test {. // Test 
00006b0: 776f 7264 546f 4e75 6d20 7573 696e 6720  wordToNum using 
00006c0: 7468 6520 7461 626c 6520 6672 6f6d 2074  the table from t
00006d0: 6865 2074 6173 6b20 6465 7363 7269 7074  he task descript
00006e0: 696f 6e2e 0a20 6173 7365 7274 2820 2230  ion.. assert( "0
00006f0: 3131 3132 3232 3333 3334 3435 3536 3636  1112223334455666
0000700: 3737 3738 3838 3939 3922 203d 3d0a 2020  777888999" ==.  
0000710: 2077 6f72 6454 6f4e 756d 2822 4520 7c20   wordToNum("E | 
0000720: 4a20 4e20 5120 7c20 5220 5720 5820 7c20  J N Q | R W X | 
0000730: 4420 5320 5920 7c20 4620 5420 7c20 4120  D S Y | F T | A 
0000740: 4d20 7c20 4320 4920 5620 7c20 4220 4b20  M | C I V | B K 
0000750: 5520 7c20 4c20 4f20 5020 7c20 4720 4820  U | L O P | G H 
0000760: 5a22 2929 3b0a 2061 7373 6572 7428 2022  Z"));. assert( "
0000770: 3031 3131 3232 3233 3333 3434 3535 3636  0111222333445566
0000780: 3637 3737 3838 3839 3939 2220 3d3d 200a  6777888999" == .
0000790: 2020 2077 6f72 6454 6f4e 756d 2822 6520     wordToNum("e 
00007a0: 7c20 6a20 6e20 7120 7c20 7220 7720 7820  | j n q | r w x 
00007b0: 7c20 6420 7320 7920 7c20 6620 7420 7c20  | d s y | f t | 
00007c0: 6120 6d20 7c20 6320 6920 7620 7c20 6220  a m | c i v | b 
00007d0: 6b20 7520 7c20 6c20 6f20 7020 7c20 6720  k u | l o p | g 
00007e0: 6820 7a22 2929 3b0a 2061 7373 6572 7428  h z"));. assert(
00007f0: 2022 3031 3233 3435 3637 3839 2220 3d3d   "0123456789" ==
0000800: 200a 2020 2077 6f72 6454 6f4e 756d 2822   .   wordToNum("
0000810: 3020 7c20 2020 3120 2020 7c20 2020 3220  0 |   1   |   2 
0000820: 2020 7c20 2020 3320 2020 7c20 2034 2020    |   3   |  4  
0000830: 7c20 2035 2020 7c20 2020 3620 2020 7c20  |  5  |   6   | 
0000840: 2020 3720 2020 7c20 2020 3820 2020 7c20    7   |   8   | 
0000850: 2020 3922 2929 3b0a 7d0a 0a76 6f69 6420    9"));.}..void 
0000860: 6d61 696e 2820 7374 7269 6e67 5b5d 2061  main( string[] a
0000870: 7267 7320 290a 7b0a 2020 2020 2f2f 2054  rgs ).{.    // T
0000880: 6869 7320 6173 736f 6369 6174 6976 6520  his associative 
0000890: 6172 7261 7920 6d61 7073 2061 206e 756d  array maps a num
00008a0: 6265 7220 746f 2061 6e20 6172 7261 7920  ber to an array 
00008b0: 6f66 2077 6f72 6473 2e20 2020 200a 2020  of words.    .  
00008c0: 2020 7374 7269 6e67 6172 7261 795b 7374    stringarray[st
00008d0: 7269 6e67 5d20 2020 206e 756d 3277 6f72  ring]    num2wor
00008e0: 6473 3b0a 0a20 2020 2066 6f72 6561 6368  ds;..    foreach
00008f0: 2873 7472 696e 6720 776f 7264 3b20 6e65  (string word; ne
0000900: 7720 4275 6666 6572 6564 4669 6c65 2822  w BufferedFile("
0000910: 6469 6374 696f 6e61 7279 2e74 7874 2220  dictionary.txt" 
0000920: 2920 290a 2020 2020 2020 2020 6e75 6d32  ) ).        num2
0000930: 776f 7264 735b 2077 6f72 6454 6f4e 756d  words[ wordToNum
0000940: 2877 6f72 6429 205d 207e 3d20 776f 7264  (word) ] ~= word
0000950: 2e64 7570 3b20 2020 2020 2020 202f 2f20  .dup;        // 
0000960: 6d75 7374 2064 7570 0a0a 2020 2020 2f2f  must dup..    //
0000970: 2f20 4669 6e64 7320 616c 6c20 616c 7465  / Finds all alte
0000980: 726e 6174 6976 6573 2066 6f72 2074 6865  rnatives for the
0000990: 2067 6976 656e 206e 756d 6265 720a 2020   given number.  
00009a0: 2020 2f2f 2f20 2873 686f 756c 6420 6861    /// (should ha
00009b0: 7665 2062 6565 6e20 7374 7269 7070 6564  ve been stripped
00009c0: 2066 726f 6d20 6e6f 6e2d 6469 6769 7420   from non-digit 
00009d0: 6368 6172 6163 7465 7273 290a 2020 2020  characters).    
00009e0: 7374 7269 6e67 6172 7261 7920 5f46 696e  stringarray _Fin
00009f0: 6457 6f72 6473 2820 7374 7269 6e67 206e  dWords( string n
0000a00: 756d 6265 7273 2c20 626f 6f6c 2064 6967  umbers, bool dig
0000a10: 6974 6f6b 2029 0a20 2020 2069 6e20 7b0a  itok ).    in {.
0000a20: 2020 2020 2020 2020 6173 7365 7274 286e          assert(n
0000a30: 756d 6265 7273 2e6c 656e 6774 6820 3e20  umbers.length > 
0000a40: 2030 293b 2020 2020 0a20 2020 207d 2020   0);    .    }  
0000a50: 2020 0a20 2020 206f 7574 2872 6573 756c    .    out(resul
0000a60: 7429 207b 0a20 2020 2020 2020 2066 6f72  t) {.        for
0000a70: 6561 6368 2028 613b 2072 6573 756c 7429  each (a; result)
0000a80: 0a20 2020 2020 2020 2020 2020 2061 7373  .            ass
0000a90: 6572 7428 2077 6f72 6454 6f4e 756d 2861  ert( wordToNum(a
0000aa0: 2920 3d3d 206e 756d 6265 7273 2029 3b0a  ) == numbers );.
0000ab0: 2020 2020 7d20 2020 200a 2020 2020 626f      }    .    bo
0000ac0: 6479 207b 0a20 2020 2020 2020 2073 7472  dy {.        str
0000ad0: 696e 6761 7272 6179 2072 6574 3b0a 2020  ingarray ret;.  
0000ae0: 2020 2020 2020 626f 6f6c 2066 6f75 6e64        bool found
0000af0: 776f 7264 203d 2066 616c 7365 3b0a 2020  word = false;.  
0000b00: 2020 2020 2020 666f 7220 2875 696e 7420        for (uint 
0000b10: 743d 313b 2074 3c3d 6e75 6d62 6572 732e  t=1; t<=numbers.
0000b20: 6c65 6e67 7468 3b20 2b2b 7429 207b 0a20  length; ++t) {. 
0000b30: 2020 2020 2020 2020 2020 2061 7574 6f20             auto 
0000b40: 616c 7465 726e 6174 6976 6573 203d 206e  alternatives = n
0000b50: 756d 6265 7273 5b30 2e2e 745d 2069 6e20  umbers[0..t] in 
0000b60: 6e75 6d32 776f 7264 733b 0a20 2020 2020  num2words;.     
0000b70: 2020 2020 2020 2069 6620 2821 616c 7465         if (!alte
0000b80: 726e 6174 6976 6573 290a 2020 2020 2020  rnatives).      
0000b90: 2020 2020 2020 2020 2020 636f 6e74 696e            contin
0000ba0: 7565 3b0a 2020 2020 2020 2020 2020 2020  ue;.            
0000bb0: 666f 756e 6477 6f72 6420 3d20 7472 7565  foundword = true
0000bc0: 3b0a 2020 2020 2020 2020 2020 2020 6966  ;.            if
0000bd0: 2028 6e75 6d62 6572 732e 6c65 6e67 7468   (numbers.length
0000be0: 203e 2020 7429 207b 0a20 2020 2020 2020   >  t) {.       
0000bf0: 2020 2020 2020 2020 202f 2f20 436f 6d62           // Comb
0000c00: 696e 6520 616c 6c20 6375 7272 656e 7420  ine all current 
0000c10: 616c 7465 726e 6174 6976 6573 2077 6974  alternatives wit
0000c20: 6820 616c 6c20 616c 7465 726e 6174 6976  h all alternativ
0000c30: 6573 2020 2020 200a 2020 2020 2020 2020  es     .        
0000c40: 2020 2020 2020 2020 2f2f 206f 6620 7468          // of th
0000c50: 6520 7265 7374 2028 6e65 7874 2070 6965  e rest (next pie
0000c60: 6365 2063 616e 2073 7461 7274 2077 6974  ce can start wit
0000c70: 6820 6120 6469 6769 7429 2020 2020 2020  h a digit)      
0000c80: 2020 2020 2020 2020 0a20 2020 2020 2020          .       
0000c90: 2020 2020 2020 2020 2066 6f72 6561 6368           foreach
0000ca0: 2028 6132 3b20 5f46 696e 6457 6f72 6473   (a2; _FindWords
0000cb0: 2820 6e75 6d62 6572 735b 742e 2e24 5d2c  ( numbers[t..$],
0000cc0: 2074 7275 6520 2020 2020 2920 290a 2020   true     ) ).  
0000cd0: 2020 2020 2020 2020 2020 2020 2020 2020                  
0000ce0: 2020 666f 7265 6163 6828 6131 3b20 2a61    foreach(a1; *a
0000cf0: 6c74 6572 6e61 7469 7665 7329 0a20 2020  lternatives).   
0000d00: 2020 2020 2020 2020 2020 2020 2020 2020                  
0000d10: 2020 2020 7265 7420 7e3d 2061 3120 7e20      ret ~= a1 ~ 
0000d20: 2220 2220 7e20 6132 3b0a 2020 2020 2020  " " ~ a2;.      
0000d30: 2020 2020 2020 7d0a 2020 2020 2020 2020        }.        
0000d40: 2020 2020 656c 7365 2020 2020 0a20 2020      else    .   
0000d50: 2020 2020 2020 2020 2020 2020 2072 6574               ret
0000d60: 207e 3d20 2a61 6c74 6572 6e61 7469 7665   ~= *alternative
0000d70: 733b 2020 2020 2f2f 2061 7070 656e 6420  s;    // append 
0000d80: 7468 6573 6520 616c 7465 726e 6174 6976  these alternativ
0000d90: 6573 0a20 2020 2020 2020 207d 0a20 2020  es.        }.   
0000da0: 2020 2020 202f 2f20 5472 7920 746f 206b       // Try to k
0000db0: 6565 7020 3120 6469 6769 742c 206f 6e6c  eep 1 digit, onl
0000dc0: 7920 6966 2077 6527 7265 2061 6c6c 6f77  y if we're allow
0000dd0: 6564 2061 6e64 206e 6f20 6f74 6865 720a  ed and no other.
0000de0: 2020 2020 2020 2020 2f2f 2061 6c74 6572          // alter
0000df0: 6e61 7469 7665 7320 7765 7265 2066 6f75  natives were fou
0000e00: 6e64 0a20 2020 2020 2020 202f 2f20 5465  nd.        // Te
0000e10: 7374 696e 6720 2272 6574 2e6c 656e 6774  sting "ret.lengt
0000e20: 6822 206d 616b 6573 206d 6f72 6520 7365  h" makes more se
0000e30: 6e73 6520 7468 616e 2074 6573 7469 6e67  nse than testing
0000e40: 2022 666f 756e 6477 6f72 6422 2c0a 2020   "foundword",.  
0000e50: 2020 2020 2020 2f2f 2062 7574 2074 6865        // but the
0000e60: 206f 7468 6572 2069 6d70 6c65 6d65 6e74   other implement
0000e70: 6174 696f 6e73 2073 6565 6d20 746f 2064  ations seem to d
0000e80: 6f20 6a75 7374 2074 6869 732e 0a20 2020  o just this..   
0000e90: 2020 2020 2069 6620 2864 6967 6974 6f6b       if (digitok
0000ea0: 2026 2620 2166 6f75 6e64 776f 7264 2920   && !foundword) 
0000eb0: 7b20 2f2f 7265 742e 6c65 6e67 7468 203d  { //ret.length =
0000ec0: 3d20 3020 200a 2020 2020 2020 2020 2020  = 0  .          
0000ed0: 2020 6966 286e 756d 6265 7273 2e6c 656e    if(numbers.len
0000ee0: 6774 6820 3e20 2031 2920 7b0a 2020 2020  gth >  1) {.    
0000ef0: 2020 2020 2020 2020 2020 2020 2f2f 2043              // C
0000f00: 6f6d 6269 6e65 2031 2064 6967 6974 2077  ombine 1 digit w
0000f10: 6974 6820 616c 6c20 616c 7465 6e61 7469  ith all altenati
0000f20: 7665 7320 6672 6f6d 2074 6865 2072 6573  ves from the res
0000f30: 7420 2020 200a 2020 2020 2020 2020 2020  t    .          
0000f40: 2020 2020 2020 2f2f 2028 6e65 7874 2070        // (next p
0000f50: 6965 6365 2063 616e 206e 6f74 2073 7461  iece can not sta
0000f60: 7274 2077 6974 6820 6120 6469 6769 7429  rt with a digit)
0000f70: 2020 2020 2020 2020 2020 0a20 2020 2020            .     
0000f80: 2020 2020 2020 2020 2020 2066 6f72 6561             forea
0000f90: 6368 2028 613b 205f 4669 6e64 576f 7264  ch (a; _FindWord
0000fa0: 7328 206e 756d 6265 7273 5b31 2e2e 245d  s( numbers[1..$]
0000fb0: 2c20 6661 6c73 6520 2920 290a 2020 2020  , false ) ).    
0000fc0: 2020 2020 2020 2020 2020 2020 2020 2020                  
0000fd0: 7265 7420 7e3d 206e 756d 6265 7273 5b30  ret ~= numbers[0
0000fe0: 2e2e 315d 207e 2022 2022 207e 2061 3b0a  ..1] ~ " " ~ a;.
0000ff0: 2020 2020 2020 2020 2020 2020 7d20 2020              }   
0001000: 200a 2020 2020 2020 2020 2020 2020 656c   .            el
0001010: 7365 2020 2020 0a20 2020 2020 2020 2020  se    .         
0001020: 2020 2020 2020 2072 6574 207e 3d20 6e75         ret ~= nu
0001030: 6d62 6572 735b 302e 2e31 5d3b 2020 2020  mbers[0..1];    
0001040: 2f2f 206a 7573 7420 6170 7065 6e64 2074  // just append t
0001050: 6869 7320 6469 6769 7420 2020 2020 2020  his digit       
0001060: 2020 2020 2020 0a20 2020 2020 2020 207d        .        }
0001070: 2020 2020 0a20 2020 2020 2020 2072 6574      .        ret
0001080: 7572 6e20 7265 743b 0a20 2020 207d 0a0a  urn ret;.    }..
0001090: 2020 2020 2f2f 2f20 2854 6869 7320 6675      /// (This fu
00010a0: 6e63 7469 6f6e 2077 6173 2069 6e6c 696e  nction was inlin
00010b0: 6564 2069 6e20 7468 6520 6f72 6967 696e  ed in the origin
00010c0: 616c 2070 726f 6772 616d 2920 0a20 2020  al program) .   
00010d0: 202f 2f2f 2046 696e 6473 2061 6c6c 2061   /// Finds all a
00010e0: 6c74 6572 6e61 7469 7665 7320 666f 7220  lternatives for 
00010f0: 7468 6520 6769 7665 6e20 7068 6f6e 6520  the given phone 
0001100: 6e75 6d62 6572 200a 2020 2020 2f2f 2f20  number .    /// 
0001110: 5265 7475 726e 733a 2061 7272 6179 206f  Returns: array o
0001120: 6620 7374 7269 6e67 7320 0a20 2020 2073  f strings .    s
0001130: 7472 696e 6761 7272 6179 2046 696e 6457  tringarray FindW
0001140: 6f72 6473 2820 7374 7269 6e67 2070 686f  ords( string pho
0001150: 6e65 5f6e 756d 6265 7220 290a 2020 2020  ne_number ).    
0001160: 7b0a 2020 2020 2020 2020 6966 2028 2170  {.        if (!p
0001170: 686f 6e65 5f6e 756d 6265 722e 6c65 6e67  hone_number.leng
0001180: 7468 290a 2020 2020 2020 2020 2020 2020  th).            
0001190: 7265 7475 726e 206e 756c 6c3b 0a20 2020  return null;.   
00011a0: 2020 2020 202f 2f20 5374 7269 7020 7468       // Strip th
00011b0: 6520 6e6f 6e2d 6469 6769 7420 6368 6172  e non-digit char
00011c0: 6163 7465 7273 2066 726f 6d20 7468 6520  acters from the 
00011d0: 7068 6f6e 6520 6e75 6d62 6572 2c20 616e  phone number, an
00011e0: 640a 2020 2020 2020 2020 2f2f 2070 6173  d.        // pas
00011f0: 7320 6974 2074 6f20 7468 6520 7265 6375  s it to the recu
0001200: 7273 6976 6520 6675 6e63 7469 6f6e 2028  rsive function (
0001210: 6c65 6164 696e 6720 6469 6769 7420 6973  leading digit is
0001220: 2061 6c6c 6f77 6564 290a 2020 2020 2020   allowed).      
0001230: 2020 7265 7475 726e 205f 4669 6e64 576f    return _FindWo
0001240: 7264 7328 2073 7472 6970 4e6f 6e44 6967  rds( stripNonDig
0001250: 6974 2870 686f 6e65 5f6e 756d 6265 7229  it(phone_number)
0001260: 2c20 7472 7565 2029 3b20 2020 200a 2020  , true );    .  
0001270: 2020 7d20 2020 200a 2020 2020 0a20 2020    }    .    .   
0001280: 202f 2f20 5265 6164 2074 6865 2070 686f   // Read the pho
0001290: 6e65 206e 756d 6265 7273 2020 2020 200a  ne numbers     .
00012a0: 2020 2020 666f 7265 6163 6828 7374 7269      foreach(stri
00012b0: 6e67 2070 686f 6e65 3b20 6e65 7720 4275  ng phone; new Bu
00012c0: 6666 6572 6564 4669 6c65 2822 696e 7075  fferedFile("inpu
00012d0: 742e 7478 7422 2020 2029 2029 0a20 2020  t.txt"   ) ).   
00012e0: 2020 2020 2066 6f72 6561 6368 2861 6c74       foreach(alt
00012f0: 6572 6e61 7469 7665 3b20 4669 6e64 576f  ernative; FindWo
0001300: 7264 7328 2070 686f 6e65 2029 2029 0a20  rds( phone ) ). 
0001310: 2020 2020 2020 2020 2020 2077 7269 7465             write
0001320: 666c 6e28 7068 6f6e 652c 2022 3a20 222c  fln(phone, ": ",
0001330: 2061 6c74 6572 6e61 7469 7665 2029 3b0a   alternative );.
0001340: 7d0a 0a                                  }..
