Advent of Code 2019 🤯 (יום 1)

תגיות: ,

הא לכם סיפור מעניין: כל שנה, כחודש לפני ערב השנה האזרחית החדשה (Новый Год, סילבסטר, מה שתרצו), מתפרסם משחק שמתכנתים ברחבי העולם אוהבים מאוד ונקרא Advent of Code.

הקדמה

למי שלא מכיר – Advent of ... היא מעין ספירת ייאוש נוצרית עד שמגיעה השנה החדשה. חלק מהנוצרים חוגגים את הסיפור ממש עם לוח שנה של תקופת הציפייה שכולל ספירה של 24 עד 31 ימים לאחור, ובחלק מהלוחות הללו יש חלונות קטנים של מתנות סמליות, שהולכות ונהיות משמעותיות יותר ככל שמועד השנה החדשה מתקרב.
אחד המימושים האהובים עלי, לדוגמה, הוא Rum Advent Calendar, שבו בכל חלון שכזה יש בקבוקון רום. :stuck_out_tongue:

יא חופר מה האתגר

מדובר באתר שלקראת השנה החדשה מפרסם תרגילי קוד חביבים, אחד כל יום, עד השנה החדשה.
חשבתי שיהיה נחמד להתחיל לפתור פה יחד אתכם את האתגרים שהיו בשנה האחרונה. מתוקף הנסיבות ומעצם זה שכולכם עמוסים, נחכה עד שיהיה מספר סביר של פתרונות לאתגר, ואחליט לפי זה מתי עובדים על היום הבא שפורסם ב־Advent of Code.
הבונוס הנחמד – אני אפרסם גם את הפתרון שלי לכל אחד מהתרגילים.

בכל “יום” באתגר יש שני תרגילים – השני נפתח רק אחרי שתפתרו את הראשון. במסגרת האתגר אנחנו נפתור את שניהם.

אז בואו נתחיל!
הירשמו ל־Advent of Code ופרסמו פה את התשובה שלכם לשאלה הראשונה.

8 לייקים

לייק 1

והנה חלק 2:

לייק 1

7 לייקים

אתה שטותניק שזה משהו. :slight_smile:
אם תעבוד איתי יום אחד ותכתוב שמות משתנים כאלו אני מכניס אותך למקרר ונועל את המשרד
:heart:

8 לייקים

מצטער, senpi!
פעם אחרונה שאני שם רווח לפני סוגריים בהגדרת פונקציה! :heart:

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

4 לייקים

:star: :star: - מקווה שסנתה מעריך את המאמץ חחח

הקוד שלי
def fuel_for_mass(mass):
    if mass <= 5:
        return 0
    mass = (mass // 3) - 2
    return fuel_for_mass(mass) + mass


def all_fuel_needed(all_masses):
    total_fuel = 0
    for star_mass in all_masses:
        mass_as_int = int(star_mass)
        total_fuel += fuel_for_mass(mass_as_int)
    return total_fuel


with open('resources/all_masses.txt', 'r') as file:
    all_masses = file.readlines()
all_fuel_needed(all_masses)
4 לייקים
חלק 1
def get_correct_fuel_amount(mass):
    # Returns the fuel amount requiered from a specific mass
    fuel = (mass // 3) - 2
    return fuel


def get_fuel_requierments():
    # Returns the sum of all the fuel amounts
    total_amount = 0
    with open(r"resources\adventofcode\fuels amounts.txt", 'r') as file:
        for line in file.readlines():
            total_amount += get_correct_fuel_amount(int(line))
    return total_amount


print(get_fuel_requierments())
חלק 2
def get_correct_fuel_amount_and_repeat(mass):
    # Returns the fuel amount requeired from a specific mass after calculating also the next calculations for the fuels
    fuel = (mass // 3) - 2
    if fuel <= 0:
        return 0
    return fuel + get_correct_fuel_amount_and_repeat(fuel)


def get_fuel_repeats_requierments():
    # Returns the sum of all the fuel amounts after all the calculations
    total_amount = 0
    with open(r"resources\adventofcode\fuels amounts.txt", 'r') as file:
        for line in file.readlines():
            total_amount += get_correct_fuel_amount_and_repeat(int(line))
    return total_amount


print(get_fuel_repeats_requierments())
2 לייקים

נראה לי שכלכך נהנית עם השמות משתנים שלא שמת לב שכנראה יש לך טעות איפשהו. הפלט שלך קרוב, אבל לא התשובה המדוייקת :sweat_smile:
מעניין איפה הטעות… על פניו נראה סבבה
עריכה: נראה שאתה צודק! מצטער שהטלתי ספק בנכונות :innocent:

לייק 1

fuel_1 היא הפונקציה שמחשבת לפי הבקשה בסעיף א , fuel_2 לפי הבקשה בסעיף ב’

אותו הדבר בגירסה טיפה יותר מקוצרת :

לייק 1

איזה חריפים אתם! כל הכבוד :slight_smile:

פתרון שכתבתי עבור הפורום:

def get_inputs():
    with open('input.txt', 'r') as challenge_input:
        for line in challenge_input.readlines():
            yield int(line.strip())


def calculate_fuel(inputs):
    for fuel_input in inputs:
        yield fuel_input // 3 - 2


def calculate_total_fuel(fuel):
    if fuel <= 0:
        return 0
    fuel_needed = fuel // 3 - 2
    return fuel_needed + calculate_total_fuel(fuel_needed)


def get_total_fuels(inputs):
    for fuel in inputs:
        yield calculate_total_fuel(fuel)


print(sum(calculate_fuel(get_inputs())))
print(sum(get_total_fuels(get_inputs())))

פתרון שכתבתי לעצמי (מי שרוצה להרחיב יכול; על חלק גדול נדבר השבוע)

from typing import Generator

def get_input() -> Generator[str, None, None]:
    with open('input.txt', 'r') as challenge_input:
        yield from map(str.strip, challenge_input)


def calculate_total_fuel(fuel: int) -> int:
    if fuel <= 0:
        return 0
    fuel_needed = fuel // 3 - 2
    return fuel_needed + calculate_total_fuel(fuel_needed)


# Part 1
print(sum(fuel // 3 - 2 for fuel in map(int, get_input())))

# Part 2
print(sum(map(calculate_total_fuel, map(int, get_input()))))
7 לייקים

אהבתי שאתה ממש ממש מפריד הכל לפונקציות … יש לי עוד מה ללמוד בנושא :slight_smile:
תודה.

לייק 1

הזנתי אותו, וזה קדם אותי הלאה.
(יכול להיותה שלא כולנו קבלנו את אותם המספרים?)

מוזר… ראיתי בעוד פתרונות שפרסמו פה שיוצא כמו אצלי אז הנחתי שלא.
עריכה: מסתבר שאתה צודק! ערכתי גם למעלה :grimacing:

:sunglasses: אהבתי ממש את הרעיון.
זה הפתרון שלי לתרגיל הראשון (איך אתם מדביקים בפורום קוד? בלי צילום מסך)

 import math


def calc_fuel_requierd(mass):
    mass = int(mass)
    fuel_requierd = math.floor(mass / 3) - 2
    return fuel_requierd


def get_masses_input():
    with open('resources/masses.txt', 'r') as masses_file:
        masses_list = masses_file.readlines()
    return masses_list


def sum_all_fuel_requierd(masses_list):
    sum_fuel_requiered = 0
    for mass in masses_list:
        sum_fuel_requiered = sum_fuel_requiered + calc_fuel_requierd(mass)
    return sum_fuel_requiered

masses_list = get_masses_input()
print(sum_all_fuel_requierd(masses_list))

and here is part two: :sunglasses:

import math

def calc_fuel_requierd(mass):
    mass = int(mass)
    fuel_requierd = math.floor(mass / 3) - 2
    return fuel_requierd


def get_masses_input():
    with open('resources/masses.txt', 'r') as masses_file:
        masses_list = masses_file.readlines()
    return masses_list


def sum_all_fuel_requierd(mass):
    sum_fuel_requiered = 0
    for mass in masses_list:
        temp_mass = int(mass)
        while temp_mass > 0:
            temp_mass = calc_fuel_requierd(temp_mass)
            if temp_mass > 0:
                sum_fuel_requiered = sum_fuel_requiered + temp_mass
    return sum_fuel_requiered

masses_list = get_masses_input()
print(sum_all_fuel_requierd(masses_list))

לייק 1
4 לייקים
תשובה
import math


with open('resources/input.txt', 'r') as fh:
    lines = fh.readlines()


def get_fuel_by_mass_part_1(input_mass):
    return math.floor(input_mass / 3) - 2


def get_fuel_by_mass_part_2(input_mass):
    fuel = get_fuel_by_mass_part_1(input_mass)
    if fuel <= 0:
        return 0
    return fuel + get_fuel_by_mass_part_2(fuel)


total_fuel = 0
for mass in lines:
    total_fuel += get_fuel_by_mass_part_2(int(mass.strip()))
print(total_fuel)

תשובה חלק 1 = 3361299
תשובה חלק 2 = 5039071

לייק 1

כשניסיתי להריץ קיבלתי שגיאה ש Generator אינו מוגדר. מה צריך להוסיף כדי שזה ירוץ? (גוגל עד כה הביא לי רק דברים על גנרטורים שכבר למדנו)

הוספתי :slight_smile:

2 לייקים

גם לי נראה שכולנו לא מקבלים את אותם המספרים. נראה שלכל אחד יצא מספר אחר :stuck_out_tongue:

2 לייקים