Re: css3-lists: Coptic and Ionic Greek

Ian Hickson wrote:
> On Mon, 16 Dec 2002, Christos Cheretakis wrote:
> 
>>As promised, attaching a simple java class that demonstrates the three
>>algorithm variations. I double-checked the arrays, but if there's any
>>inconsintency, please consider the names of the characters to be
>>correct.
> 
> 
> We need to have the spec very clear in English. It would be useful to use
> this program, e.g., to generate the tests for the Lists module test suite,
> but we can't really use it for the spec.
> 

   Using phrasing from the description of the other systems, here you 
go. The steps do not follow my previous implementation. I'm trying to be 
as close to the WD's phrasing.

greek-style(s):

   This is a simple additive system defined for the range 1 to 999999. 
The digits are split into two groups of three (if there are less than 
six digits, the least significant group is filled first). Within each 
group, appropriate digits are picked from the following list (at most 
one per column) and written in descending order by value. Zeros are ignored.

or:

0. If the number is greater than 999999, fallback to decimal

1. Split the decimal number into groups of three digits, starting with 
the least significant digit.

2. For each three-digit group, map the digits, depending on their 
position, according to the following tables. Zero is ignored.

2.1 If there is no mapping for current digit, fallback to decimal

2.5 For readability, include space between groups.

3. If number contains a thousands group, then prepend lower numeral sign.

4. Always append numeral sign.

Please note that steps 2.1 is only valid for modern greek.
Also note that step 2.5 is my addition. Modern greek uses sigma+tau to 
represent 6, but sigma and tau are also used to represent 200 and 300 
respectively. Space does not mean U+0020, as the numbers are written as 
single words. It just means ...space.

Here are the tables:

ancient-greek:

  Ones         Tens         Hundreds
  1   U+03B1 | 10  U+03B9 | 100  U+03C1
  2   U+03B2 | 20  U+03BA | 200  U+03C3
  3   U+03B3 | 30  U+03BB | 300  U+03C4
  4   U+03B4 | 40  U+03BC | 400  U+03C5
  5   U+03B5 | 50  U+03BD | 500  U+03C6
  6   U+03DB | 60  U+03BE | 600  U+03C7
  7   U+03B6 | 70  U+03BF | 700  U+03C8
  8   U+03B7 | 80  U+03C0 | 800  U+03C9
  9   U+03B8 | 90  U+03DF | 900  U+03E1

lower-modern-greek:

  Ones                Tens         Hundreds
  1   U+03B1        | 10  U+03B9 | 100  U+03C1
  2   U+03B2        | 20  U+03BA | 200  U+03C3
  3   U+03B3        | 30  U+03BB | 300  U+03C4
  4   U+03B4        | 40  U+03BC | 400  U+03C5
  5   U+03B5        | 50  U+03BD | 500  U+03C6
  6   U+03C3 U+03C4 | 60  U+03BE | 600  U+03C7
  7   U+03B6        | 70  U+03BF | 700  U+03C8
  8   U+03B7        | 80  U+03C0 | 800  U+03C9
  9   U+03B8        | 90  ------ | 900  ------

upper-modern-greek:

  Ones                Tens         Hundreds
  1   U+0391        | 10  U+0399 | 100  U+03A1
  2   U+0392        | 20  U+039A | 200  U+03A3
  3   U+0393        | 30  U+039B | 300  U+03A4
  4   U+0394        | 40  U+039C | 400  U+03A5
  5   U+0395        | 50  U+039D | 500  U+03A6
  6   U+03A3 U+03A4 | 60  U+039E | 600  U+03A7
  7   U+0396        | 70  U+039F | 700  U+03A8
  8   U+0397        | 80  U+03A0 | 800  U+03A9
  9   U+0398        | 90  ------ | 900  ------

numeral-sign is U+0374
lower-numeral-sign is U+0375

   And some examples, with some, well, well-known numbers. The first 
column contains the names of the digits, the second their unicode 
position and the third an iso-8859-7 representation, but only when *all* 
of the required letters are present in the modern greek alphabet. I use 
"," for the lower-numeral-sign and "'" for the numeral-sign. Oh, and a 
space for "space".


70 would be:
ancient-greek:      omicron' / U+03BF U+0374 / Ο'
lower-modern-greek: omicron' / U+03BF U+0374 / ο'
upper-modern-greek: OMICRON' / U+039F U+0374 / ο'

--------

the number of the beast would be:
ancient-greek:      chi xi stigma'    / U+03C8 U+03BE U+03DB U+0374
lower-modern-greek: chi xi sigma+tau' / U+03C8 U+03BE U+03C3 U+03C4 
U+0374 / χξστ'
upper-modern-greek: CHI XI SIGMA+TAU' / U+03A7 U+039E U+03A3 U+03A4 
U+0374 / ΧΞΣΤ'

(The chi-xi-stigma form is actually feared of in the Apocalypse, so 
don't be fooled by any other representation ;-)

--------

1000 would be:
ancient-greek:      ,alpha' / U+0375 U+03B1 U+0374 / ,α'
lower-modern-greek: ,alpha' / U+0375 U+03B1 U+0374 / ,α'
upper-modern-greek: ,ALPHA' / U+0375 U+0391 U+0374 / ,Α'

--------

6 would be:
ancient-greek:      stigma'    / U+03DB U+0374        /
lower-modern-greek: sigma tau' / U+03C3 U+03C4 U+0374 / στ'
upper-modern-greek: SIGMA TAU' / U+03A3 U+03A4 U+0374 / ΣΤ'

--------

200300 would be:
ancient-greek:      ,sigma tau'       / U+0375 U+03C3 U+03C4 U+0374 / ,στ'
lower-modern-greek: ,sigma space tau' / U+0375 U+03C3 space  U+03C4 
U+0374 / ,σ τ'
upper-modern-greek: ,SIGMA SPACE TAU' / U+0375 U+03A3 space  U+03A4 
U+0374 / ,Σ Τ'

Note: 6 & 200300 could be ambiguous in modern greek, without the space. 
200300 would be ambiguous with 6000 as well...

--------

200306 would be:
ancient-greek:      ,sigma tau stigma'          / U+0375 U+03C3 U+03C4 
U+03DB U+0374 /
lower-modern-greek: ,sigma space tau sigma+tau' / U+0375 U+03C3 space 
U+03C4 U+03C3 U+03C4 U+0374 / ,σ τστ'
upper-modern-greek: ,SIGMA SPACE TAU SIGMA+TAU' / U+0375 U+03A3 space 
U+03A4 U+03A3 U+03A4 U+0374 / ,Σ ΤΣΤ'

--------

6006 would be:
ancient-greek:      ,stigma stigma'             / U+0375 U+03DB U+03DB 
U+0374 /
lower-modern-greek: ,sigma+tau space sigma+tau' / U+0375 U+03C3 U+03C4 
space  U+03C3 U+03C4 U+0374 / ,στ στ'
upper-modern-greek: ,SIGMA+TAU SPACE SIGMA+TAU' / U+0375 U+03A3 U+03A4 
space  U+03A3 U+03A4 U+0374 / 'ΣΤ ΣΤ'

Note: 200306 & 6006 would be ambiguous in modern greek, without the space.

--------

and finally 1821 would be:
ancient-greek:      ,alpha omega kappa alpha'       / U+0375 U+03B1 
U+03C9 U+03BA U+03B1 U+0374 / ,αωκα'
lower-modern-greek: ,alpha space omega kappa alpha' / U+0375 U+03B1 
space  U+03C9 U+03BA U+03B1 U+0374 / ,α ωκα'
upper-modern-greek: ,ALPHA SPACE OMEGA KAPPA ALPHA' / U+0375 U+0391 
SPACE  U+03A9 U+039A U+0391 U+0374 / ,Α ΩΚΑ'

   I'm also attaching a slightly better (and more consistent with the 
above descriptions) version of the java code.

   Hope this helps, Ian. I'll be blaming you for this day of my diploma 
thesis anyways ;-)

	C/

-- 
   Λες κι η στάθμη της αγάπης πάει να βρει                          /"\
   Πόσοι κρύβονται στη λάσπη θησαυροί         ASCII Ribbon Campaign \ /
   Πως κοπήκανε στα δάχτυλα οι σταυροί           against HTML email  X
   Γι' ανθρώπων έργα...                     & microsoft attachments / \
/*
 * GreekNumberGenerator.java
 *
 * Created on 16 Δεκέμβριος 2002, 6:15 μμ
 */

/**
 *
 * @author  xalkina
 */
public class GreekNumberGenerator {

    static final String[] ONES_ANCIENT = {
        "alpha",    // U+03B1
        "beta",     // U+03B2
        "gamma",    // U+03B3
        "delta",    // U+03B4
        "epsilon",  // U+03B5
        "stigma",   // U+03DB
        "zeta",     // U+03B6
        "eta",      // U+03B7
        "theta"     // U+03B8
    };
    static final String[] TENS_ANCIENT = {
        "iota",    // U+03B9
        "kappa",   // U+03BA
        "lamda",   // U+03BB
        "mu",      // U+03BC
        "nu",      // U+03BD
        "xi",      // U+03BE
        "omicron", // U+03BF
        "pi",      // U+03C0
        "koppa"    // U+03DF
    };
    static final String[] HUNDREDS_ANCIENT = {
        "rho",     // U+03C1
        "sigma",   // U+03C3
        "tau",     // U+03C4
        "upsilon", // U+03C5
        "phi",     // U+03C6
        "chi",     // U+03C7
        "psi",     // U+03C8
        "omega",   // U+03C9
        "sampi"    // U+03E1
    };

    static final String[] ONES_LOWER_MODERN = {
        "alpha",       // U+03B1
        "beta",        // U+03B2
        "gamma",       // U+03B3
        "delta",       // U+03B4
        "epsilon",     // U+03B5
        "(sigma+tau)", // U+03C3 U+03C4
        "zeta",        // U+03B6
        "eta",         // U+03B7
        "theta"        // U+03B8
    };
    static final String[] TENS_LOWER_MODERN = {
        "iota",       // U+03B9
        "kappa",      // U+03BA
        "lamda",      // U+03BB
        "mu",         // U+03BC
        "nu",         // U+03BD
        "xi",         // U+03BE
        "omicron",    // U+03BF
        "pi",         // U+03C0
        null
    };
    static final String[] HUNDREDS_LOWER_MODERN = {
        "rho",        // U+03C1
        "sigma",      // U+03C3
        "tau",        // U+03C4
        "upsilon",    // U+03C5
        "phi",        // U+03C6
        "chi",        // U+03C7
        "psi",        // U+03C8
        "omega",      // U+03C9
        null
    };

    static final String[] ONES_UPPER_MODERN = {
        "ALPHA",       // U+0391
        "BETA",        // U+0392
        "GAMMA",       // U+0393
        "DELTA",       // U+0394
        "EPSILON",     // U+0395
        "(SIGMA+TAU)", // U+03A3 U+03A4
        "ZETA",        // U+0396
        "ETA",         // U+0397
        "THETA"        // U+0398
    };
    static final String[] TENS_UPPER_MODERN = {
        "IOTA",        // U+0399
        "KAPPA",       // U+039A
        "LAMDA",       // U+039B
        "MU",          // U+039C
        "NU",          // U+039D
        "XI",          // U+039E
        "OMIKRON",     // U+039F
        "PI",          // U+03A0
        null
    };
    static final String[] HUNDREDS_UPPER_MODERN = {
        "RHO",         // U+03A1
        "SIGMA",       // U+03A3
        "TAU",         // U+03A4
        "UPSILON",     // U+03A5
        "PHI",         // U+03A6
        "CHI",         // U+03A7
        "PSI",         // U+03A8
        "OMEGA",       // U+03A9
        null
    };

    static final String LOWER_NUMERAL_SIGN = "(lnsign)"; // U+0375

    static final String NUMERAL_SIGN = "(nsign)"; // U+0374

    public static String generateAncientGreekNumber(int number) {
        String[][] symbols = new String[6][];
        StringBuffer representation = new StringBuffer();

        int current_digit;
        int position;
        int number_copy = number;

        symbols[0] = symbols[3] = ONES_ANCIENT;
        symbols[1] = symbols[4] = TENS_ANCIENT;
        symbols[2] = symbols[5] = HUNDREDS_ANCIENT;

        if (number >= 1000000) {
            return null;
        }

        position = 0;
        do {
            current_digit = number_copy % 10;
            if (current_digit > 0) {
                representation.insert(0, symbols[position][current_digit-1]);
            }
            number_copy /= 10;
            ++position;
        } while (number_copy != 0);

        if (number >= 1000) {
            representation.insert(0, LOWER_NUMERAL_SIGN);
        }

        representation.append(NUMERAL_SIGN);

        return new String(representation);
    }

    public static String generateLowerModernGreekNumber(int number) {
        String[][] symbols = new String[6][];
        StringBuffer representation = new StringBuffer();

        int current_digit;
        int position;
        int number_copy = number;

        symbols[0] = symbols[3] = ONES_LOWER_MODERN;
        symbols[1] = symbols[4] = TENS_LOWER_MODERN;
        symbols[2] = symbols[5] = HUNDREDS_LOWER_MODERN;

        if (number >= 1000000) {
            return null;
        }

        position = 0;
        do {
            if (position == 3) {
                representation.insert(0, ' ');
            }
            current_digit = number_copy % 10;
            if (current_digit > 0) {
                if (symbols[position][current_digit-1] == null) {
                    return null;
                }
                representation.insert(0, symbols[position][current_digit-1]);
            }
            number_copy /= 10;
            ++position;
        } while (number_copy != 0);

        if (number >= 1000) {
            representation.insert(0, LOWER_NUMERAL_SIGN);
        }

        representation.append(NUMERAL_SIGN);

        return new String(representation);
    }

    public static String generateUpperModernGreekNumber(int number) {
        String[][] symbols = new String[6][];
        StringBuffer representation = new StringBuffer();

        int current_digit;
        int position;
        int number_copy = number;

        symbols[0] = symbols[3] = ONES_UPPER_MODERN;
        symbols[1] = symbols[4] = TENS_UPPER_MODERN;
        symbols[2] = symbols[5] = HUNDREDS_UPPER_MODERN;

        if (number >= 1000000) {
            return null;
        }

        position = 0;
        do {
            if (position == 3) {
                representation.insert(0, ' ');
            }
            current_digit = number_copy % 10;
            if (current_digit > 0) {
                if (symbols[position][current_digit-1] == null) {
                    return null;
                }
                representation.insert(0, symbols[position][current_digit-1]);
            }
            number_copy /= 10;
            ++position;
        } while (number_copy != 0);

        if (number >= 1000) {
            representation.insert(0, LOWER_NUMERAL_SIGN);
        }

        representation.append(NUMERAL_SIGN);

        return new String(representation);
    }

    public static void main(String[] argv) {
        int number;
        String representation;

        for (int i = 0; i < argv.length; ++i) {
            number = Integer.parseInt(argv[i]);
            System.out.println(number + " is ");

            representation = generateAncientGreekNumber(number);
            System.out.print("ancient-greek: ");
            if (representation != null) {
                System.out.println(" " + representation);
            }
            else {
                System.out.println(" no representation");
            }

            representation = generateLowerModernGreekNumber(number);
            System.out.print("lower-modern-greek: ");
            if (representation != null) {
                System.out.println(" " + representation);
            }
            else {
                System.out.println(" no representation");
            }

            representation = generateUpperModernGreekNumber(number);
            System.out.print("upper-modern-greek: ");
            if (representation != null) {
                System.out.println(" " + representation);
            }
            else {
                System.out.println(" no representation");
            }

            System.out.println("------------------------");
        }
    }
}

Received on Monday, 16 December 2002 15:46:09 UTC