diff options
author | Matth?us G. Chajdas <dev@anteru.net> | 2019-11-10 13:56:53 +0100 |
---|---|---|
committer | Matth?us G. Chajdas <dev@anteru.net> | 2019-11-10 13:56:53 +0100 |
commit | 1dd3124a9770e11b6684e5dd1e6bc15a0aa3bc67 (patch) | |
tree | 87a171383266dd1f64196589af081bc2f8e497c3 /tests/examplefiles/test.d | |
parent | f1c080e184dc1bbc36eaa7cd729ff3a499de568a (diff) | |
download | pygments-master.tar.gz |
Diffstat (limited to 'tests/examplefiles/test.d')
-rw-r--r-- | tests/examplefiles/test.d | 135 |
1 files changed, 0 insertions, 135 deletions
diff --git a/tests/examplefiles/test.d b/tests/examplefiles/test.d deleted file mode 100644 index 02fe8f73..00000000 --- a/tests/examplefiles/test.d +++ /dev/null @@ -1,135 +0,0 @@ -// Created by Lionello Lunesu and placed in the public domain. -// This file has been modified from its original version. -// It has been formatted to fit your screen. -module phoneno; // optional -import std.stdio; // writefln -import std.ctype; // isdigit -import std.stream; // BufferedFile - -// Just for readability (imagine char[][][char[]]) -alias char[] string; -alias string[] stringarray; - -/// Strips non-digit characters from the string (COW) -string stripNonDigit( in string line ) -{ - string ret; - foreach(uint i, c; line) { - // Error: std.ctype.isdigit at C:\dmd\src\phobos\std\ctype.d(37) - // conflicts with std.stream.isdigit at C:\dmd\src\phobos\std\stream.d(2924) - if (!std.ctype.isdigit(c)) { - if (!ret) - ret = line[0..i]; - } - else if (ret) - ret ~= c; - } - return ret?ret:line; -} - -unittest { - assert( stripNonDigit("asdf") == "" ); - assert( stripNonDigit("\'13-=2 4kop") == "1324" ); -} - -/// Converts a word into a number, ignoring all non alpha characters -string wordToNum( in string word ) -{ -// translation table for the task at hand -const char[256] TRANSLATE = - " " // 0 - " 0123456789 " // 32 - " 57630499617851881234762239 " // 64 - " 57630499617851881234762239 " - " " - " " - " " - " "; - string ret; - foreach(c; cast(ubyte[])word) - if (TRANSLATE[c] != ' ') - ret ~= TRANSLATE[c]; - return ret; -} - -unittest { - // Test wordToNum using the table from the task description. - assert( "01112223334455666777888999" == - wordToNum("E | J N Q | R W X | D S Y | F T | A M | C I V | B K U | L O P | G H Z")); - assert( "01112223334455666777888999" == - wordToNum("e | j n q | r w x | d s y | f t | a m | c i v | b k u | l o p | g h z")); - assert( "0123456789" == - wordToNum("0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9")); -} - -void main( string[] args ) -{ - // This associative array maps a number to an array of words. - stringarray[string] num2words; - - foreach(string word; new BufferedFile("dictionary.txt" ) ) - num2words[ wordToNum(word) ] ~= word.dup; // must dup - - /// Finds all alternatives for the given number - /// (should have been stripped from non-digit characters) - stringarray _FindWords( string numbers, bool digitok ) - in { - assert(numbers.length > 0); - } - out(result) { - foreach (a; result) - assert( wordToNum(a) == numbers ); - } - body { - stringarray ret; - bool foundword = false; - for (uint t=1; t<=numbers.length; ++t) { - auto alternatives = numbers[0..t] in num2words; - if (!alternatives) - continue; - foundword = true; - if (numbers.length > t) { - // Combine all current alternatives with all alternatives - // of the rest (next piece can start with a digit) - foreach (a2; _FindWords( numbers[t..$], true ) ) - foreach(a1; *alternatives) - ret ~= a1 ~ " " ~ a2; - } - else - ret ~= *alternatives; // append these alternatives - } - // Try to keep 1 digit, only if we're allowed and no other - // alternatives were found - // Testing "ret.length" makes more sense than testing "foundword", - // but the other implementations seem to do just this. - if (digitok && !foundword) { //ret.length == 0 - if(numbers.length > 1) { - // Combine 1 digit with all altenatives from the rest - // (next piece can not start with a digit) - foreach (a; _FindWords( numbers[1..$], false ) ) - ret ~= numbers[0..1] ~ " " ~ a; - } - else - ret ~= numbers[0..1]; // just append this digit - } - return ret; - } - - /// (This function was inlined in the original program) - /// Finds all alternatives for the given phone number - /// Returns: array of strings - stringarray FindWords( string phone_number ) - { - if (!phone_number.length) - return null; - // Strip the non-digit characters from the phone number, and - // pass it to the recursive function (leading digit is allowed) - return _FindWords( stripNonDigit(phone_number), true ); - } - - // Read the phone numbers - foreach(string phone; new BufferedFile("input.txt" ) ) - foreach(alternative; FindWords( phone ) ) - writefln(phone, ": ", alternative ); -} - |