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

ahardon

New member
ת'אמת גם לזה יש פתרון יותר יעיל

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

nirtheking

New member
ולמה פשוט לא ליישם כאן RegExp

שעקרונית נועד כדי ליצור תבניות של טקסט. (התבנית כאן היא 80 תווים+- (בגלל הרווחים)ונקודה/עוד תווים/רווח).
 

DadleFish

New member
RegExp הוא כללי יותר,

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

voguemaster

New member
זה לא יעיל יותר...

זה למעשה נראה ככה אבל זה לא. ו-REGEXP זה אחלה אבל לכתוב משהו כזה יהיה קשה לאללה..
 

nirtheking

New member
כבר כתוב ../images/Emo13.gif

תסתכל בלינק שהבאתי בתחילת השרשור ל-FAQ של פורום ASP מישהו בשם dagon כתב "מחלקה" ב-JS שמשתמשת ב-RegExp כדי ליצור wrap לטקסט מסויים. באפליקציות הוואב שאני כותב (ב-ASP) אני משתמש בזה וזה עובד מעולה
 

selalerer

New member
חברה, הפתרונות ה"יותר יעילים" שלכם

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

DadleFish

New member
אז פשוט לא ענית על השאלה המקורית

שים לב - "נתונה שורת טקסט באורך לא ידוע. ניתן להניח שאת השורה רוצים להציג בדף HTML ולכן הדפדפן יידע לשבור לבד את השורה לכמה שורות כי מילים מופרדות ע"י רווחים ביניהן"
 

voguemaster

New member
זה בסדר...

כי למעשה האלגוריתם שלו יכול להיות מומר בקלות יחסית כדי לספק את הפונק' של השבירה כמו שדפדפנים עושים בתוך טבלאות HTML. הנה הקוד שלי:
// we use a special algorithm to detect portions of text larger than 78 chars // who don't have spaces StringBuffer linebuf = new StringBuffer(line); StringTokenizer st = new StringTokenizer(line, " "); while(st.hasMoreTokens()) { String token = st.nextToken(); if (token.length() > 78) { // if we found a large token, find it's position in the original line // this will allow us to calculate where to "break" it. We do this by // adding a space at every 79th char above that position, taking into // account that everytime we add a space, the next location increases by 1 int index = linebuf.indexOf(token); int nSpacesToPut = token.length() / 78; for(int i=0 ; i < nSpacesToPut ; i++) linebuf.insert(index+((i+1)*78)+i, ' '); } } // finished one line, the modified line is in linebuf​
במקרה הזה בחרתי שרירותית את גודל השבירה להיות 78 תווים אבל בסביבה דינמית כמות התווים שנכנסת מחושבת דינמית לפי גודל ה-container.
 

selalerer

New member
ניתן להניח לא אומר שחייבים להניח.

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