תרגול נוסף (נוסף): שבוע 3

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

פלינדרום

כתבו פונקציה שמקבלת מילה ובודקת האם היא פלינדרום. פלינדרום היא מחרוזת שניתן לקרוא אותה מההתחלה לסוף ומהסוף להתחלה, כמו “אמא”, “ילד כותב בתוכ דלי” או “רק פושטק עלוב בולע קטשופ קר”.

דוגמאות לערכים שאמורים להחזיר True הם: a, aa, מחרוזת ריקה, baba abab, 12321.
דוגמאות לערכים שאמורים להחזיר False הם: ab, shlomo, 12345.

הרפתקאות אליס בארץ הפלאות

הורידו למחשבכם את הסיפור הרפתקאות אליס בארץ הפלאות.

  1. מה הוא המספר הגדול ביותר בקובץ? השתמשו גם בהערות של פרויקט גוטנברג לצורך הסעיף הזה, והתייחסו רק למספרים המורכבים מספרות (2 ולא two).
  2. מה היא המילה הארוכה ביותר בסיפור? ודאו שלא כללתם סימני פיסוק.
  3. “מילה משוגעת” היא מילה שיש עבורה “מילה תאומה” בסיפור – אותה מילה שכתובה מהסוף להתחלה. מילה משוגעת חייבת להיות בת שני תווים או יותר. לדוגמה: המילה pot היא מילה משוגעת, מכיוון שהיא מופיעה בסיפור, וגם המילה “top” מופיעה בו. החזירו רשימה של tupleים שבה כל המילים המשוגעות בסיפור של אליס, כאשר כל tuple מייצג צמד של מילים משוגעות. דאגו שמילה משוגעת לא תופיע ביותר ממקום אחד ברשימה.

ראשוניים

אם נתחיל לציין ברצף את המספרים הראשוניים – 2, 3, 5, 7, 11, 13 וכן הלאה, נראה ש־13 הוא המספר הראשוני השישי. מי הוא המספר הראשוני ה־10,001?

פוקר

לקלף פוקר יש צורה וערך.

  1. צורתו יכולה להיות תלתן (C), יהלום (D), לב (H) או עלה שחור (S).
  2. ערכו של הקלף יכול להיות 1 (אס) עד 9, עשר (T), נסיך (J) מלכה (Q) או מלך (K).

“יד פוקר” או “יד” היא רשימה המורכבת מ־5 קלפים, כל אחת מהן היא מחרוזת בת 2 תווים המכילה את צורתו ואת ערכו של הקלף.

פתרו את הסעיפים הבאים:

  1. כתבו פונקציה שמקבלת יד פוקר, ומחזירה את דירוג היד.
  2. כתבו פונקציה שמקבלת שני פרמטרים – יד מספר 1 ויד מספר 2. החזירו את היד המנצחת. התחשבו במצב של תיקו בדירוג היד לפי הכתוב בוויקיפדיה.
  3. בהינתן 7 קלפים (כמו במשחק Texas Holdem) – בנו את היד החזקה ביותר שניתן להרכיב מ־5 קלפים כלשהם.
  4. בנו פונקציה שמקבלת שתי רשימות: הראשונה היא רשימת קלפי המשתתפים. כל תא ברשימה זו מייצג משתתף, והוא בעצמו רשימה המורכבת מ־2 איברים: הקלף הראשון של המשתתף והקלף השני של המשתתף. הרשימה השנייה היא 5 קלפים נוספים שמהווים “קופה משותפת”. השתמשו בפונקציה הקודמת שכתבתם כדי להרכיב את היד החזקה ביותר עבור כל משתתף, מתוך 2 הקלפים שברשותו ועוד 5 הקלפים בקופה המשותפת. על היד לכלול 5 קלפים בלבד. מצאו את השחקן שהיד שלו היא החזקה ביותר.

איחוד CSV

כתבו תוכנה לאיחוד קובצי CSV. על התוכנה להיות מסוגלת לקבל שני קובצי CSV, בהם השורה הראשונה היא הכותרת של כל אחת מהעמודות.
בכל אחד מקובצי ה־CSV תהיה עמודה בשם id, לפיה יתבצע המיזוג.
התוכנה תדע לקרוא את הקובץ הראשון והשני, ולהוציא קובץ שלישי, בו נמצאים השורות של הקבצים הראשון והשני, ממוזגים לפי כותרות העמודות.
משמע:

  1. אם בקובץ הראשון ישנן 5 שורות (כולל שורת הכותרות) ובקובץ השני 6 שורות (כנ"ל), קובץ הפלט יכיל 10 שורות (שורת כותרות, 4 שורות מהקובץ הראשון, 5 שורות מהקובץ השני).
  2. אם בקובץ הראשון קיימות העמודות id, name ו־address ובקובץ השני קיימות העמודות id, phone ו־mail, הקובץ השלישי יופיעו העמודות id, name, address, phone ו־mail.
  3. הניחו שבקובצי ה־CSV אין סימנים מיוחדים, אלא רק מספרים, אותיות באנגלית ורווחים.
  4. במקרה של התנגשות (שורה שמכילה נתונים עם אותו id ושם עמודה זהה בשני הקבצים), העתיקו את הנתון מקובץ לבחירתכם.
  5. הניחו שאין שתי שורות בעלות id זהה באותו קובץ.

דוגמה לתרגיל ה־CSV

הניחו שהריווחים המוצגים בדוגמאות לא קיימים באמת בקובץ – הם שם כדי לעזור לכם להבין את הדוגמאות.

קובץ 1:

id,a,b,c,d
a ,9,9,9,9
1 ,H,4,5,x

קובץ 2:

id,f,a,e
1, 6,7,8
0 ,b,c,d
c ,b,c,d

קובץ תוצר:

id,a,b,c,d,f,e
a ,9,9,9,9, ,
1, H,4,5,x,6,8
0 ,c, , , ,b,d
c ,c, , , ,b,d
4 לייקים

20200427_090758

5 לייקים

תרגיל #1
עשיתי בשתי דרכים:

  1. שהייתה לי יותר אינטואיטיבית - לקרוא את זה הפוך
  2. בצורה רקורסיבית (זה יותר ארוך אבל זה בשביל עצמי כדי לפתח את החשיבה הזו)

עריכה לאחר הערות:

def palindrome(string):
    return string[:] == string[::-1]

# בצורה רקורסיבית
def palindrome_recorsivi(string):
    if len(string) == 1 or len(string) == 0:
        return True
    if string[0] == string[-1]:
        return palindrom_recorsivi[string[1:-1]]
    return False

2 לייקים

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

לייק 1

מצוין! (רק שים לב שאין צורך בסוגריים ב־return)
בנוגע לטקסט של אליס – תעשה מה שאתה רוצה, זה לא באמת משנה :stuck_out_tongue:
@zurikarat – עדיף להחזיר מאשר להדפיס :slight_smile:

לייק 1

מעולה תודה !
אכן הסוגריים מיותרים! :heart_eyes:

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

נראה לי שאפשר להחריג ולא להתייחס (או לפצל לפי – ולא לפי -)

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

אנסה…(סתם מילים ושטויות), סליחה אמחק.

מצרף את התמונה החדשה, הקודם היה ‘המספר הראשוני האחרון עד למספר המוזן’ כעת שיניתי למספר במיקום המוזן:


לקח למחשב הרבה זמן…

לייק 1

אפשר תוך פחות מחצי שנייה. נסה לייעל :slight_smile:

def is_prime(num,lst):
i = 0
while i < len(lst)-1:
if not (num % lst[i]):
return False
i = i + 1
return True

def get_prime_num(n):
counter = 1
num = 3
lst = [2]
while counter < n:
if is_prime(num,lst):
counter = counter + 1
lst.append(num)
if counter == n:
return num
num = num + 1

print(get_prime_num(10001))

לקח בערך 10 שניות לרוץ, ניסיתי לייעל בכך שהמערכת תבדוק חלוקות רק במספרים שהם עשרוניים ובכך תחסוך איטרציות לולאה

image

לייק 1

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

def is_prime_number(number):
    is_prime = True
    counter = 2
    while counter < number and is_prime:
        if number % counter != 0:
            counter += 1
        else:
            is_prime = False
    return is_prime


def prime_number_x(limit):
    numbers = 2
    steps = 0
    while steps < limit:  
        if is_prime_number(numbers):
            steps += 1
        numbers += 1
    return numbers - 1
    
limit = 10001
print(prime_number_x(limit))
לייק 1

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

קוד-ספויילר
def is_prime_number(number):
    is_prime = True
    counter = 2
    while counter <= number**0.5 and is_prime:
        if number % counter != 0:
            counter += 1
        else:
            is_prime = False
    return is_prime


def prime_number_x(limit):
    last_number = [1, 3, 7 , 9]
    numbers = 7
    steps = 3
    while steps < limit:  
        if numbers % 10 in last_number:
            if is_prime_number(numbers):
                print(numbers)
                steps += 1
        numbers += 1
    return numbers - 1
    
limit = 10001
print(prime_number_x(limit))

החלום הוא להגיע לחצי שניה :slight_smile:

2 לייקים

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

תודה :slight_smile:

לפי איזה סדר?
תכל’ס זה לא משנה במיוחד, העיקר שיצא קובץ מאוחד כמו שמובא בדוגמה

השאלה על מספרים ראשוניים לקוחה מפרוייקט אוילר, אחלה אתר:
https://projecteuler.net/problem=7

הפיתרון שלי, רץ ב"0.10756874084472656 seconds":

def is_prime(n):
	if n == 2 or n == 3:
		return True
	if n < 2 or n % 2 == 0:
		return False
	if n < 9:
		return True
	if n % 3 == 0:
		return False
	r = int(n ** 0.5)
	f = 5
	while f <= r:
		if n % f == 0: return False
		if n % (f + 2) == 0: return False
		f += 6
	return True


limit = 10001
count = 1  # we know that 2 is prime
candidate = 1
while count != limit:
    candidate = candidate + 2
    if is_prime(candidate):
        count += 1

print(candidate)
לייק 1

היי, אני וכמה תלמידים נוספים בקבוצת הוואטסאפ נתקלנו במשהו שלא מוסבר טוב בתרגיל -
באיזה סדר צריך לאחד את השורות של קובץ 1 + קובץ 2?
לפי מה שכן כתוב בתרגיל

הקבצים צריכים להיות מאוחדים אחד אחרי השני (שורות קובץ 1 ואחריהן שורות וקבץ 2, כמובן תוך התחשבות בחוקים שניתנו בתרגיל בנוגע לכפילויות) אבל אם הדבר היה כך אז בדוגמה של הקובץ המאוחד השורה השנייה (אחרי הכותרת) הייתה אמורה להיות השורה שמתחילה בa ולא השורה במתחילה ב1

תוכלו לחדד כיצד נדרש לחבר את השורות?

תודה!

ערכתי את הדוגמה, תודה! :slight_smile: