אתגר קטן - גדול

voguemaster

New member
אתגר קטן - גדול

כמו שאתם יודעים, באפליקציות מסוימות יש כל מיני נואנסים שקשורים בהצגת טקסט. דוגמאות הן WRAPPING וכיוון נכון של פיסקאות (ע"ע אלגוריתם BIDI). הצורה שבה כותבים את האלגוריתם בד"כ קובעת אם מה שרואים על המסך נראה "נכון". אז הנה נתקלתי בבעיה (פתרתי אותה) ואני רוצה לשים אותה פה בתור מיני-אתגר קטן למי שרוצה. כמו שחלקכם בוודאי יודעים, אלגוריתם WRAP סטנדרטי מוסיף מילים לשורה כלשהי עד שהוא מגלה שהוספת המילה הבאה תחרוג מהאורך המקסימלי של השורה (שזה תלוי בגודל שאפשר להציג בתוכו, בין אם זה פקד, טבלה ב-HTML וכד'). נתונה שורת טקסט באורך לא ידוע. ניתן להניח שאת השורה רוצים להציג בדף HTML ולכן הדפדפן יידע לשבור לבד את השורה לכמה שורות כי מילים מופרדות ע"י רווחים ביניהן (רמז..). לעומת זאת, יכול להיווצר מצב שבו יש מילה או קטע טקסט רציף שארוך יותר מהאורך הניתן להצגה (תניחו 80 תווים לדוגמא). הבעיה שיש להרבה אפליקציות היא שהם לא שוברים את הקטע הארוך ההוא בכלל. דוגמאות: MSN Messenger. נסו לכתוב שורה ארוכה מאוד. כל עוד יש בה רווחים היא נכנסת יפה לחלון. אם אחת המילים תהיה ארוכה מאוווווד (נניח 160 או יותר תווים), היא לא נשברת והאפליקציה פותחת פס גלילה אופקי. המשימה שלכם (באם תחליטו לקבל אותה) - למצוא דרך לשבור את השורה הזדונית כך שתוצג כולה במלואה כמו שצריך כאשר חלקים רציפים נשברים בהתאם לאורך המקסימלי שציינתי. בנוסף, קטע רציף יכול להיות באורך לא ידוע כך שהוא יכול לתפוס כמה "שורות" בעצמו (אם הוא 200 תווים הוא תופס שתי שורות וקצת). כמובן שקטע רציף יכול להופיע בכל מקום בתוך השורה הזדונית, בין מילים רגילות ותמימות לחלוטין. רצוי מאוד שאחרי ששוברים קטע רציף ארוך שכזה, ההמשך יבוא מייד אח"כ. (דגש על *רצוי*).
 

voguemaster

New member
באנה יא דגיג קופצני ומצוי בנהרות

ישראליים בעלי נטייה להתפתחות של צורות חיים מפותחות ופטריות הזיה קשור, מה אתה מקשקש שם ????
 

vinney

Well-known member
לא הבנתי כלום... מה אתה רוצה?

להפעיל WRAP על מילה שיותר ארוכה מאורך השורה? אתה יכול לשבור אותה מלאכותית (או לחשב איפה, או פשוט לשים רווח בחצי ואז להזיז אותו לחצי שנשאר וכך הלאה, עד שהוא יהיה ממודם בדיוק איפה שהשורה נגמרת).
 

nirtheking

New member
בפורום ASP נכתבה "מחלקה" ב-JS

שמשתמשים בה ב-RegExp כדי לחתוך טקסט כל 80 תווים (לא כולל רווחים) אני כבר מחפש קישור להודעה ב-FAQ שם
 

selalerer

New member
לא ממש הבנתי את האתגר....

... בודקים אם מילה גדולה מ80 תווים ואם כן אז שוברים אותה כל 80 תווים (או שהשבירה הראשונה תהיה 80 תווים אחרי תחילת השורה שבה היא נמצאת ואחרי זה כל 80 תווים - קצת יותר יפה) וזהו, איפה האתגר?
 

voguemaster

New member
זה לפי מה שכתבת בסוגריים

וזה לא פשוט כמו שנדמה לך. בכל מקרה, אתם קקיונרים, ביקשתי פיתרון שעובד, כלומר *קוד*.
 

voguemaster

New member
תאריך את החלק הרציף של המחרוזת

לבערך 100 תווים ותגיד לי אם זה עובד ?
בג'אווה הפיתרון שלי לקח 10 שורות.. אולי!
 

DadleFish

New member
10 שורות זה אם אתה סופר את ההערות

לדעתי היו שם 8 שורות ביצועיות, לא יותר
 

selalerer

New member
אני מתנצל, הנה עוד גרסה, וכן היא עו

בדת עם 100 תוים ויותר וכל אורך שורה.
 

ahardon

New member
פתרון פשוט

לא קראתי את כל המגילה שסיללרר כתב, כי נראה לי שזה overkill. מה הבעיה פשוט לבדוק כל תו שנמצא במקום שהוא כפולה של 80, אם הוא לא רווח, אז להוסיף שם רווח. דוגמא(לא בדקתי):
void breakline(char *line){ int len=strlen(line); int x=0; char temp; for(x=80; x<len; x+=80){ temp=line[x]; line[x]='\0'; printf("%s",&line[x-80]); line[x]=temp; if(temp!=' ') printf(" %c",temp); else printf(" "); } printf("%s",$line[x-80]); }​
 

ahardon

New member
אופס

יצאתי תירס...
זה ישבור מילים באמצע... צריך ליישם את אותו עקרון רק על מילים שארוכות מ 80 תווים, יעני להפריד מחרוזות לפי הרווחים ואם המחרוזת ארוכה מ 80 תווים, אז להפעיל את הפונקציה שכתבתי, זה גם יוצא פתרון ארוך, אבל עדיין פחות של סילרר.
 

voguemaster

New member
זה הפתירון שכתבתי בג'אווה

(כי המערכת בג'אווה) ולקח לי 10 שורות
יפה
 

ilankt

New member
נצל"ש, אלדד

זוכר שפעם עשית חידה כזאת, לעשות אותו קוד כמה שיותר יעיל? תתנו עוד אחת
 
למעלה