Advent of Code (AoC), noel öncesi dört hafta takvimini takip eden Noel temalı bilgisayar programlama bulmacalarından oluşan her yıl aralık ayında başlayan bir challange’dir. 2015’ten beri devam etmektedir. Programlama bulmacaları çeşitli beceri setlerini kapsar ve herhangi bir programlama dili kullanılarak çözülebilir. Katılımcılar ayrıca hem küresel hem de özel liderlik tablolarında hıza dayalı olarak rekabet ederler. Sorular, genellikle bir hikayenin bir parçası olarak sunulur ve katılımcıların soruları çözerek hikayeyi takip etmeleri gerekir. Advent of Code, birçok programcının kendilerini geliştirmek için harika bir fırsattır ve genellikle çok eğlencelidir.
Ben bu challange’ı geçtiğimiz yıl Twitter’da Mert Cobanov (kendisi özel bir leaderboard açtı. Bu linke tıklayarak ve ‘1337966-0d825fb7’ kodunu girerek beraber bu challangelere meydan okuyabiliriz) sayesinde öğrendim. Fakat o zaman çok umursamamıştım. Bu sene her gün bulmacaları çözmek için kendime söz verdim ve bu yazı serisinde gelecek 25 gün yaşadığım tecrübeleri size aktaracağım. Bulmacaları Python ile çözeceğim.
Hadi gelin ilk günün bulmacasını çözelim.

İlk gün bulmacasının ismi Calorie Counting yani Kalori sayımı. Burada bizi bir hikaye karşılıyor bu hikayede anlatılanlar şu şekilde:
Noel Baba’nın ren geyikleri genellikle normal ren geyiği yiyeceği yerler, ancak Noel’de hediye dağıtmak için çok fazla sihirli enerjiye ihtiyaçları vardır. Bunun için en sevdikleri atıştırmalık, sadece ormanın derinliklerinde yetişen özel bir yıldız meyvesi türüdür. Elfler sizi bu meyvenin yetiştiği koruya yaptıkları yıllık keşif gezisine getirdiler.
Yeterli sihirli enerjiyi sağlamak için seferin 25 Aralık’a kadar en az 50 yıldız toplaması gerekiyor. Elfler koruda bol miktarda meyve olduğu konusunda sizi temin etse de, her ihtimale karşı yol boyunca gördüğünüz meyveleri almaya karar veriyorsunuz.
Bulmacaları çözerek yıldızları toplayın. Advent takviminde her gün iki bulmaca sunulacak; ilkini tamamladığınızda ikinci bulmacanın kilidi açılacak. Her bulmaca bir yıldız kazandırır. İyi şanslar!
https://adventofcode.com/2022/day/1
Hikayenin bu kısmından sonra bize bugünkü görevlerimizden bahsetmeye başlıyor:
Birinci Bölüm
Elflerin keşif gezisi geleneksel olarak yürüyerek yaparlar. Tekneleriniz karaya yaklaşırken, Elfler erzaklarının envanterini çıkarmaya başlar. Önemli bir husus yiyecek – özellikle de her Elfin taşıdığı Kalori miktarı (bu bizim bulmaca girdimiz).
Elfler sırayla yanlarında getirdikleri çeşitli yemeklerin, atıştırmalıkların, erzakların vb. içerdiği kalori miktarını her satıra bir öğe olmak üzere yazarlar. Her Elf kendi envanterini bir önceki Elf’in envanterinden (varsa) boş bir satırla ayırır.
Örneğin, Elflerin eşyalarının Kalorilerini yazmayı bitirdiklerini ve aşağıdaki listeyi elde ettiklerini varsayalım:
1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
Bu liste, beş Elfin taşıdığı yiyeceklerin Kalorilerini temsil eder:
- İlk Elf 1000, 2000 ve 3000 Kalorilik, toplamda 6000 Kalorilik yiyecekler taşıyor.
- İkinci Elf 4000 Kalorilik bir gıda maddesi taşıyor.
- Üçüncü Elf 5000 ve 6000 Kalorilik, toplamda 11000 Kalorilik yiyecekler taşıyor.
- Dördüncü Elf 7000, 8000 ve 9000 Kalorilik, toplamda 24000 Kalorilik yiyecekler taşıyor.
- Beşinci Elf 10000 Kalorilik bir gıda maddesi taşıyor.
Bulmaca ise şu şekilde, En çok Kalori taşıyan Elf’i bulun. Bu Elf’in taşıdığı toplam kaç Kalori var?
Öncelikle kendi yaklaşımımda bana verilen inputları kopyalayıp ‘calories.txt’ isimli bir text dosyasının içine kaydettim. Bu tex dosyasının bulunduğu klasör içine ‘1a.py‘ isimli bir python script açtım ve aşağıdaki kodu yazdım.
import pandas as pd # Import pandas
dicts = dict() # Create a dictionary to store the data
elves_number = 0 # Create a variable to store the number of elves
calories = 0 # Create a variable to store the calories
# check if a line is NOT empty
with open('calories.txt', 'r', encoding="utf-8") as f: # Open the file
lines = f.readlines() # Read the lines
for line in lines: # For each line
if line.strip(): # If the line is NOT empty
calories += int(line) # Add the calories to the variable
print('The line is NOT empty ->', line)
else: # If the line is empty
elves_number += 1 # Add 1 to the number of elves
dicts[f'Elves {elves_number}'] = calories # Add the calories to the dictionary
calories = 0 # Reset the calories
print('The line is empty')
# convert dictionary with elves and their calories to dataframe
df = pd.DataFrame.from_dict(dicts, orient='index', columns=['Calories']) # Create a dataframe from the dictionary
#print the maximum calories and the elves who ate the most
print(df)
print(df['Calories'].max())
print(df[df['Calories'] == df['Calories'].max()].index[0])
# save df as csv
df.to_csv('calories.csv')
Burada daha sonra pandas DataFrame’e çevirebilmek için boş bir sözlük yapısı oluşturdum. Daha sonra Elfleri ve aldıkları kalorileri hesaplayabilmek için ‘elves_number’ ve ‘calories’ isimli iki adet değişkeni sıfır olarak atadım.
Daha sonra kaydettiğim ‘calories.txt‘ isimli text dosyasınının içindeki tüm satırları okudum ve bir for döngüsü yardımıyla bu satırların üzerinden tek tek geçtim. Eğer satır boş değilse satırdaki sayıyı calories adlı değişkenle koplayıp tekrar bu değişkene atadım. Eğer satır boş ise bu toplanan calories değişkeni elf numarasını anahtar kelime alacak şekilde sözlüğe kaydettim ve calories değişkenini resetledim. Sonuç olarak text dosyasındaki tüm kalori sayılarını uygun şekilde toplayıp elflere atadık. En son ise bu sözlüğü bir pandas DataFrame yapısı olarak kaydedim en çok kaloriye sahip olan Elf ile onun kalori sayısını yazdırdık. Son olarak, daha sonraki bölümde oluşturduğumuz DataFram’e ulaşmak için ‘calories.csv’ olarak kaydettik.
İkinci Bölüm
Elflerin sorusunun cevabını hesapladığınızda, en çok Kalori taşıyan Elfin sonunda atıştırmalıklarının tükenebileceğini çoktan fark etmişlerdir.
Elflerin sorusunun cevabını hesapladığınızda, en çok Kalori taşıyan Elfin sonunda atıştırmalıklarının tükenebileceğini çoktan fark etmişlerdir.
Bu kabul edilemez durumdan kaçınmak için Elfler bunun yerine en çok Kalori taşıyan ilk üç Elfin taşıdığı toplam Kaloriyi bilmek isterler. Bu şekilde, bu Elflerden birinin atıştırmalıkları bitse bile, hala iki yedeği vardır.
Yukarıdaki örnekte, ilk üç Elf dördüncü Elf (24000 Kalori ile), sonra üçüncü Elf (11000 Kalori ile), sonra beşinci Elf (10000 Kalori ile). Bu üç elfin taşıdığı kalorilerin toplamı 45000’dir.
En çok Kalori taşıyan ilk üç Elfi bulun. Bu Elfler toplamda kaç Kalori taşıyor?
Yani kısaca bizden en çok kaloriye sahip üç elfin toplam kalori sayısını istiyor. Bunun için de ‘1b.py‘ isimli bir python script açıp, ilk bölümde kaydettiğimi csv dosyasını tekrar okuduk.
import pandas as pd
df = pd.read_csv('calories.csv', index_col=0) # Read the csv file and set the index column to 0
# Find the three elves who ate the most and sum their calories
df = df.sort_values(by='Calories', ascending=False) # Sort the dataframe by calories
print(df.head(3)) # Print the first 3 rows
print(df.head(3)['Calories'].sum()) # Print the sum of the first 3 rows
Buradaki yaklaşımımız ise bu DataFrame’i azalan şekilde sıralayıp, ilk üç satırı toplamak. Şunu söylemekte fayda var. Bu görevlerin çözümü çok daha kısa satırlarda halledilebilir fakat ben burda daha kapsamlı, bol yorumlu, anlaşılır şekilde çözümler geliştirmek istedim.
AoC’un ilk günü bu kadardı. Umarım bu seriyi tutarlı bir şekilde yıl başına kadar ilerletebilirim. Vakit ayırıp okuduğunuz için teşekkür ederim. Eğer yazıyı beğendiyseniz, kodlamaya meraklı arkadaşlarınızla paylaşmayı unutmayın 🙂
Herhangi bir sorunuz olursa veya benimle iletişim kurmak isterseniz tüm sosyal medya hesaplarıma bu linke tıklayarak ulaşabilirsiniz. Ayrıca tüm çözümlerimi görebilmeniz için bir github reposu açtım. Bu repoya da bu linkten ulaşabilirsiniz.