אתגר תכנות: בואו נפתור את Advent Of Code יחד

הי,

באתר הזה יש 24 חידות תיכנות מסודרות לפי ימים:
https://adventofcode.com

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

בהצלחה

לייק 1

יום 1: מעבר לרובוטים בלבד

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

לדוגמא בסידרה 1122 הסכום הוא 3. הסיפרה הראשונה 1 זהה לסיפרה שבאה אחריה, אחרי זה יש 1 שלא זהה ל-2 שבאה אחריה אז היא לא נספרת, אחריה 2 שזהה ל-2 שבאה אחריה (עד עכשיו ספרנו 3) ובסוף 2 שלא זהה ל-1 שבאה אחריה (זיכרו הרשימה מעגלית) ולכן לא נספרת.

בסידרה 1111 הסכום הוא 4 כי כל אחת מהספרות זהה לסיפרה שבאה אחריה.

בסידרה 91212129 הסכום הוא 9 כי רק הסיפרה 9 האחרונה זהה לסיפרה שבאה אחריה (ה-9 הראשונה).

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

הדביקו כאן את הקוד שכתבתם כדי לקבל פידבק מחברים או סתם לעוף על עצמכם שאתם אלופים

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

זה הקישור לחידה המקורית:
https://adventofcode.com/2017/day/1

בהצלחה

יש גם את האתר הזה


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

שבוע טוב :slight_smile:

string = [int(i) for i in str(11233441)]

flag = 0
res = 0

for index,item in enumerate(string):
    if flag < len(string) - 1 and item == string[index + 1]:
        res += int(item)
    flag += 1
if string[0] == string [-1]:
    res += int(string[0])

print res

“”"
get a number and calculate the sequences digits
“”"

print (“enter your number” )
num=int(input())
firstDigit=int(num%10)
sum=0
while num>=10:
temp=int(num%10)
num=int(num/10)
if int(num%10)==temp:
sum+=temp
if firstDigit==int(num):
sum+=firstDigit
print("sum of sequences numbers: ",sum)

function inverseCaptcha(s) {
	return s.split('').reduce((sum, c, i) => sum + (s[(i + 1) % s.length] === c ? +c : 0), 0);
}
לייק 1

הי ריקי,

הכי טוב להדביק כאן קוד לפי תחביר Markdown כפי שמתואר בהוראות כאן:
https://commonmark.org/help/

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

print("hello world")

ואז הרבה יותר קל לקרוא

לייק 1

נראה עובד - רוצה להוסיף בדיקה אוטומטית כדי לוודא שעובד על כל הקלטים?

לא כתבתי אבל מתכנן לתרגם ולפרסם כאן את הבעיות מ Advent Of Code בקצב של שתיים בשבוע כלומר הבאה בתור תגיע ביום שלישי. המטרה להגיע מוכנים לדצמבר אז אריק ווסטל יפרסם את הסידרה הבאה שלו

הי יואל,

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

בכל אופן מקווה שתצטרף עם פתרונות לאימון שלנו ב-3 חודשים הקרובים כאן

כן אבל לא בטוח איך…
אני צריך להכניס את הקוד הזה לפונקציה כדי לבדוק אותו ע"י unittest?

לדוגמא בשורה (self.assertEqual(True, False
צריך לקרוא לפונקציה (שהיא בעצם הקוד הנ"ל) בתוך הסוגריים?

import unittest


class MyTestCase(unittest.TestCase):
    def test_something(self):
        self.assertEqual(True, False)


if __name__ == '__main__':
    unittest.main()

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

import unittest
from exercise_1 import check_iden_digit

class MyTestCase(unittest.TestCase):
    def test_something(self):
        self.assertEqual(11,check_iden_digit(112233441))


if __name__ == '__main__':
    unittest.main()

עובד

ואף מילה על הפתרון האלגנטי שלי בג’אווהסקריפט? :thinking:

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

import unittest
import random
from exercise_1 import check_iden_digit
from exercise_1 import result

class MyTestCase(unittest.TestCase):
    def test_something(self):
        self.assertEqual(result,check_iden_digit(random.randint(0, 10000000)))
        

if __name__ == '__main__':
    unittest.main()

ספלינטור למה אף מילה? קיבלת לב - זה יותר טוב ממילה :slight_smile:

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

לא הבנתי - אם אתה מגריל מספר איך אתה יודע מה צריך להיות הסכום?

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

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

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

בבדיקה אתה לוקח קלט ידוע ובודק שהפונקציה החזירה עבורו את התוצאה שרצית. קח 3-4 קלטים וכתוב להם בדיקות.

כאן אתה יכול לעשות משהו עוד יותר מוצלח וזה ללכת לאתר של אריק וסטל (ממנו אני לוקח את הסידרה הזאת) בקישור כאן:
https://adventofcode.com/2017/day/1

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