אוניברסיטת תל אביב -בית הספר למדעי המחשב מבוא מורחב למדעי המחשב ,חורף 3102 תרגיל בית מספר ( 7אחרון!) -להגשה עד 77בינואר 7102בשעה 72:22 בציון הסופי ישוקללו ( 5ולא )6מתוך 7התרגילים הטובים של כל סטודנט. קיראו בעיון את קובץ הנחיות הגשת תרגילי בית שמופיע באתר. את כל הפונקציות שאתם כותבים הגישו בקובץ pyאחד .הקפידו על שמות הפונקציות כפי שהן מצוינות בשאלות .לנוחיותכם ,מצורף קובץ skeletonהמכיל את חתימות כל הפונקציות שעליכם לממש. בסיום העבודה שנו את שמו ל ( 123456789.py -עם תעודת הזהות שלכם). הקפידו לבדוק את תקינות קובץ ה py -שאתם מגישים על ידי הרצה מדוקדקת של הפונקציות. את התשובות ליתר השאלות הגישו בקובץ doc/docx/pdfאחד. בסה"כ מגישים שני קבצים בלבד .הקפידו לענות על כל מה שנשאלתם. שאלה 0 בשאלה זו נממש ְמאַ יֵּ ת ( ,(spell-checkerשישמש לתיקון שגיאות איות ( )typosבטקסט. יהיה בידנו אוסף של מילים חוקיות ,language ,שיוזן מתוך קורפוס כלשהו .בהינתן טקסט כלשהו ,נמצא לכל מילה בטקסט את המילה הקרובה ביותר אליה ב ( language -ייתכן שזו אותה מילה בעצמה) .נממש שתי גישות להגדרת מרחק בין מילים hamming :ו ( qwerty -יוסברו מייד). הגדרת מרחק בין מילים בשיטת hamming בהינתן 2מילים ,w1, w2המרחק ביניהן יוגדר כך :מצמידים את שתי המילים לשמאל זו מעל זו ,וסופרים את כמות התווים השונים בין שתי המילים ,כולל תווים חסרים .נתעלם מהבדלי .caseלמשל: hamming("hello", "belL"( = 2 o l l e h w1 L l e b w2 1 diff 1 הגדרת מרחק בין מילים בשיטת qwerty כפי שהוזכר באחת ההרצאות ,רוב מקלדות בעולם כיום מסודרות לפי סטנדרט שנקרא ( qwertyאלו 6 האותיות בשורה העליונה משמאל .בהרצאה הוזכר גם סידור אלטרנטיבי שנקרא .)Dvorak ניתן להגדיר מרחק בין כל שתי אותיות באופן יחסי למרחק ביניהן על המקלדת .גישה זו מבוססת על ההנחה ששגיאות איות מתרחשות בגלל גלישת האצבע למקש אחר ,או בגלל הקשה עודפת או חסרה. מרחק בין שני תווים יוגדר כמספר הצעדים שיש לבצע כדי לנוע מאחד לשני ,כאשר צעד יכול להתבצע בכיוון אופקי או אנכי בלבד .לצורך העניין נגדיר את מיקומי התווים כמתואר באיור הבא : 11 10 9 8 7 6 5 3 4 1 2 0 del 0 p o i u y t r e w l k j h g f d s a m n b v c x z q 1 2 3 למשל ,מרחק qwertyבין ' 'qלבין ' 'aהוא ,2ואילו בין ' 'aלבין ' 'yהוא .5 בהינתן 2מילים ,w1, w2המרחק ביניהן יוגדר כך :מצמידים את שתי המילים לשמאל זו מעל זו ,ומסכמים את המרחקים בין התווים ,בהתאם להגדרה הנ"ל .אם אחת המילים קצרה מהשניה ,ייחשב הדבר כמרחק אל התו .delנתעלם מהבדלי .case למשל: qwerty("hello", "belL"( = 5 o 4 l l e h w1 L l e b w2 0 0 0 diff 1 סעיף א' :כיתבו פונקציה ) hamming(w1,w2שמקבלת שתי מחרוזות המורכבות מאותיות באנגלית בלבד (קטנות או גדולות) ,ומחזירה את המרחק ביניהן בשיטת .hamming סעיף ב' :כיתבו פונקציה ) qwerty(w1,w2שמקבלת שתי מחרוזות המורכבות מאותיות באנגלית בלבד (קטנות או גדולות) ,ומחזירה את המרחק ביניהן בשיטת .qwerty לעזרתכם ניתנת הפונקציה הבאה ( לא חובה להשתמש בה ,ואפשר גם לשנות אותה) :פונקציה זו מייצרת מילון שמפתחותיו הם אותיות קטנות באנגלית והערכים הנלווים הם המיקומים על המקלדת ,כפי שהוצגה לעיל .שימו לב שהתו ' 'delלא מופיע במילון שנוצר. def build_qwerty_dict(): [ = keyboard_as_list ['q','w','e','r','t','y','u','i','o','p'], [' ','a','s','d','f','g','h','j','k','l'], ] ]'[' ',' ','z','x','c','v','b','n','m }{ = kbrd for i in range(len(keyboard_as_list)): ]row = keyboard_as_list[i for j in range(len(row)): ]char = row[j )kbrd[char] = (i+1, j ' ' kbrd.pop(' ') # Get rid of filler char return kbrd עמוד 2מתוך 5 :לדוגמה >>> kbrd = build_qwerty_dict() >>> kbrd['q'] (1, 0) >>> kbrd['m'] (3, 8) הפונקציה מקבלת מחרוזת.nearest_neighbor(word, language, distFunc) כיתבו פונקציה:'סעיף ג (שמקבלת שתי מחרוזות המורכבותdistFunc ופונקצית מרחק,language רשימת מילים חוקיות,word מחזירה את המילה הקרובהnearest_neighbor .)מאותיות באנגלית בלבד ומחזירה את המרחק ביניהן . תחת פונקצית המרחק הנתונהlanguage ברשימהword - ביותר ל הפונקציה.text - שתתקן שגיאות איות ב,correct(text, language, distFunc) כיתבו פונקציה:'סעיף ד , ומחזירה משפט מתוקן,distFunc ופונקצית מרחק,language רשימת מילים חוקיות,text מקבלת טקסט .language אל מולtext - על כל אחת מהמילים בnearest_neighbor ע"י הפעלה פשוטה של כלומר כל תו שאיננו.לצורך כך מילה בטקסט היא רצף מקסימלי של אותיות (קטנות או גדולות) באנגלית .כזה מהווה הפרדה בין מילים : " מכיל את המיליםintro. to Computer-Science with python 3.2" למשל הטקסט intro, to, Computer, Science, with, python את כל התווים שאינם אותיותtext אשר "מנקה" מהמחרוזתsplit(text) כיתבו פונקצית עזר:המלצה . ומחזירה את רשימת המילים שבה,קטנות או גדולות באנגלית :למשל >>> split("intro. to Computer-Science with python 3.2") ['intro', 'to', 'Computer', 'Science', 'with', 'python'] :correct דוגמה להרצת >>> text = "inyro. two computre-Science withh pithon 3.2" >>> language = ["to", "intro", "introduction","computer", "science", "Python", "with", "ourib"] >>> correct(text, language, hamming) 'intro to computer science with Python >>> correct(text, language, qwerty) 'intro to computer science with Python >>> text = "inyro. two computre-Science withh piton 3.2" #note the 'piton' in the end >>> correct(text, language, hamming) 'intro to computer science with with' >>> correct(text, language, qwerty) 'intro to computer science with ourib' 5 מתוך3 עמוד שאלה 7 להלן קוד לתיקון שגיאות :בהינתן הודעה באורך 2ביטים ,נשלח כל ביט פעמיים (כמו ב )repetition code - ונוסיף ביט זוגיות בסוף (כמו ב )parity check code -בסוף XORבין שני הביטים המקוריים .למשל ,עבור ההודעה ,01ישודר ( 00110 00111הביטים שנוספו מודגשים בקו). א .מהו המרחק המינימלי dשל הקוד (מרחק Hammingהמינימלי בין שתי הודעות חוקיות כלשהן) ? הסבירו. ב .כמה טעויות ניתן לגלות וכמה ניתן לתקן? ג .מהו כמות ההודעות שמוכלות בספרה ( )sphereשסביב כל הודעה חוקית ? הכוונה לס פרה שמכילה סביב הודעה חוקית. הודעות הניתנות לתיקון ,כלומר ספרה ברדיוס ד .האם קוד זה הוא "קוד מושלם"? הסבירו. שאלה 2 בתרגול ראינו את קוד אינדקס לתיקון שגיאות .לקוד פרמטר נדגים את אופן הקידוד של מילה בקוד אינדקס ,עבור ביטים של מידע ו - כזכור ,מילת קוד מכילה הקובע את אורך המילה .לשם תזכורת, : ביטים של תיקון שגיאות (בדוגמא שלנו 7ביטים של מידע ו 6-ביטים של תיקון שגיאות .בשאלה זו איננו מוסיפים עוד ביט זוגיות כפי שעשינו בתרגול). הביטים של תיקון השגיאות מכילים את ה XOR-של האינדקסים של הביטים שערכם 0במילת המידע (ביטים 2,3,5,6בדוגמא) .הביטים של תיקון השגיאות חוזרים על עצמם פעמיים .עבור כללי ,הפרמטרים של הקוד הם : המשקל של מילת קוד ( )Hamming Weightהינו מספר הפעמים שמופיע בה הערך .0למשל ,המשקל של המילה בדוגמא למעלה הוא .6שימו לב ,שלמעט מילת ה ( 1-שמכילה אפסים בלבד) כל מילה חוקית בקוד אינדקס היא במשקל 3לפחות. עבור קוד אינדקס עם (כלומר 05ביטים של מידע ו 8-ביטים של תיקון שגיאות) ,רשמו את כל המילים החוקיות בקוד אינדקס שמשקלן .3לדוגמא : כמה מילים כאלו יש? תארו בקצרה מה מאפיין את המילים הללו (כלומר איזו תכונה צריכה להתקיים בהן) ומדוע אין מילים נוספות שמשקלן 3מלבד אלו שציינתם. ניתן להיעזר בקוד פייתון על מנת לפתור את השאלה ,אך אין חובה כזאת .אם השתמשתם בקוד על מנת לפתור את השאלה ,צרפו אותו לקובץ ה py -שאתם מגישים. עמוד 4מתוך 5 נקודות02 – בונוס4 שאלה In class, we saw a proof that the halting problem is not solvable. Assuming the existence of a (high order) function Halt(func,x), which determines if func halts on input x, we constructed a (high order) function, modify(f). We saw that when applying modify to itself, modify(modify) halts iff it does not halt, which is a contradiction (to the existence of such Halt). Benny claims that not only is it impossible to compute Halt(func,x), but even computing the bounded halting is impossible. The bounded halting BHalt(s,func,x) determines if func halts on input x within s seconds. Having heard this claim during the weekly staff meeting, the teaching assistants quickly produce the piece of code (attached), which, they claim, solves bounded halting. The code for BHalt(s,func,x) opens a new thread, which executes func on input x. For those unfamiliar with the notion of threads, you may think of it as another program that runs in parallel to the main program. Since func itself may invoke BHalt(s,func,x), the code uses a global counter, used to prevent the opening of more than one thread at a time. If func halted on x within s seconds, a corresponding message "Execution ended" is printed, and the value True is returned. If func did not halt on x within s seconds, a corresponding message "Execution did not end" is printed, and the value False is returned. You are NOT asked to explain the inner working of the threads mechanism. Benny is not impressed. He wrote down a modified version of modify(f). This version is quite similar to the one presented in class, only it has an additional parameter s (default set to 10 seconds), and calls BHalt(s,f,f). In addition, if an infinite loop is entered, successive integers are printed, one per iteration, starting with 0. Benny claims that running the new modify on itself will lead to a contradiction, resulting in the processor melting down, the hard disk going up in flames, or some other disaster along these lines. YOU be the judges: Load the attached code. Then, in IDLE, execute >>> modify(modify) (When re-running the code, don't forget to set the global counter back to 0.) 1. Explain in words what happened (which function called which function? by the printouts, what does modify(modify) do? Does it halt in s=10 seconds? will anything change if you use s=20 instead?). 2. Does this prove that the bounded halting problem is not solvable as Benny claims? in other words, is Benny's argument valid for the bounded halting problem (as it was, in class, for the halting problem)? 3. Is the bounded halting problem solvable or not? explain. 5 מתוך5 עמוד
© Copyright 2024