איך ניתן לקבוע האם המחרוזת היא עברית?

| More
נוסף ב-28/07/2010 16:27 על ידי דניאל כץ

לפעמים כשאנחנו שולפים טקסט מהמסד נתונים אנו מוצאים את עצמינו מתלבטים האם להציג אותו בדף כltr או כrtl.

כמובן, ניתן לבדוק:

אבל כל זה עדיין לא ייתן מענה למחרוזות מעורבות כדוגמת אלו:

  • האות הראשונה בא"ב האנגלי היא 'a'.
  • 'a' היא האות הראשונה בא"ב האנגלי.
  • the first latter of the hebrew abc is 'א'.
  • 'א' is the first latter of the hebrew abc.

הפתרון שנראה לי אינטליגנטי יותר, מבוסס על רוב התווים ה"חזקים": אם הרוב הוא עברי אזי המחרוזת נחשבת עברית אם לא – לא. במקרה של תיקו, האלגוריתם יקבע ע"פ האות החזקה הראשונה.

הסיבוכיות של האלגוריתם קטנה מO(n) שכן, הוא מסתיים ברגע שניתן להוכיח רוב תווים לצד זה או אחר, לדוגמה במחרוזת "אבגab" התוים "ab" כלל לא ייבדקו כי גם אם הן לא עבריות המחרוזת כבר מוכחת כעברית.

המתודה:

 public  static  bool  IsHebrewString(this  string  value)
 {
     int  balance = 0;
     int  firstLetter = 0;
 
     for  (int  i = 0; i < value.Length; i++)
     {
         if  (char .IsLetter(value[i]))
         {
             if  ((value[i] >= (char )0x5D0) && (value[i] <= (char )0x5EA))
                 balance++;
             else 
                 balance--;
 
             if  (firstLetter == 0)
             {
                 firstLetter = balance > 0 ? 1 : -1;
             }
         }
 
         if  ((value.Length - (i + 1)) < Math .Abs(balance))
             break ;
     }
 
     if  (balance == 0)
         return  firstLetter > 0;
 
     return  balance > 0;
 }
 

הנה כמה דוגמאות ליעילות האלגוריתם:

 bool  test1 = "האות הראשונה בא\"ב האנגלי היא 'a'." .IsHebrewString(); // true 
 bool  test2 = "'a' היא האות הראשונה בא\"ב האנגלי." .IsHebrewString(); // true 
 bool  test3 = "the first latter in hebrew abc is 'א'." .IsHebrewString(); // false
 bool  test4 = "'א' is the first latter in hebrew abc." .IsHebrewString(); // false 
 bool  test5 = "אבגabc" .IsHebrewString(); // true 
 bool  test6 = "abcאבג" .IsHebrewString(); // false 
 bool  test7 = "()!^." .IsHebrewString(); // false 
 

Tags: , , , ,

.NET 4.0 | Tools | .NET

Covariance and Contravariance in C# 4.0

| More
נוסף ב-16/04/2010 13:33 על ידי דניאל כץ

גם אני כשנתקלתי לראשונה במושגים covariance וcontravariance הייתי מבולבל למדי בעצמי. אבל, מסתבר שלאחר הסבר קצר אלו בסך הכל מונחים למושגים שכולנו מכירים טוב מאוד. מושגי הvariance שאולים במקור מהתפלגות סטטיסטית במתמטיקה, שם השונות המשותפת (variance) היא מדד לקשר בין שני משתנים מקריים. השונות המשותפת חיובית כאשר המשתנים נוטים לסטות באותו כיוון, מעל או מתחת לממוצע, ושלילית כאשר הם משתנים בכיוונים מנוגדים זה לזה. משם הושאל המינוח למדעי המחשב, וליתר דיוק למינוח האפיון של שפות תכנות.

נניח מערכת טיפוסים בה קיים הטיפוס Animal וטיפוס Elephant היורש ממנו:

 class  Program 
 {
     public  class  Animal  { }
     public  class  Elephant  : Animal  { }

}

במערכת טיפוסים זו המרה מטיפוס אחד למשנהו נחשבת:

  • covariant – כשממירים טיפוס כללי יותר לטיפוס מצומצם יותר לדוגמה: מAnimal לElephant.
  • contravariant – כשממירים טיפוס מצומצם יותר לטיפוס כללי יותר לדוגמה: מElephant לAnimal.
  • invariant – כשממירים בין שני טיפוסים שאינם קשורים לדוגמה: מProgram לAnimal. עוד...

Tags:

.NET 4.0

Named and Optional Arguments in C# 4.0

| More
נוסף ב-15/04/2010 14:50 על ידי דניאל כץ

ארגומנטים אופציונאליים והצבת ארגומנטים לפי שם

בC# 4.0 נוספה אפשרות להעביר ערך לארגומנט של מתודה בשמו (arg: "value") ולאו דווקא בסדר מסוים. אפשרות זו חיונית כדי לאפשר אפשרות חדשה נוספת שהיא - ארגומנטים אופציונאליים. הקוד הבא ממחיש העברה של הערך 1 לארגומנט ,copies את הערך"COLOR" לארגומנט ColorMode, ואת הערך "readme.txt" לארגומנט DocumentName:

 Print(copies: 1, colorMode: "COLOR" , documentName: "readme.txt");
 static  void  Print(string  colorMode, string  documentName, int  copies) {...}

ארגומנטים אופציונאליים מוכרזים בC# על ידי ציון ערך ברירת המחדל עבור הארגומנט: עוד...

Tags: ,

.NET 4.0