AoC’un üçüncü gününden herkese merhabalar. Bugünkü bulmacamız bir tık zorlaşmış durumda. İstenilen bulmaca Sırt Çantalarının Yeniden Düzenlenmesi hakkında. Hikaye şu şekilde başlıyor:
Bir Elf, orman yolculuğu için tüm sırt çantalarını malzemelerle doldurmak gibi önemli bir işe sahiptir. Ne yazık ki, bu Elf paketleme talimatlarını tam olarak takip etmedi ve bu yüzden şimdi birkaç öğenin yeniden düzenlenmesi gerekiyor.
Her sırt çantasının iki büyük bölmesi vardır. Belirli bir türdeki tüm eşyaların iki bölmeden tam olarak birine girmesi gerekir. Paketlemeyi yapan Elf, her sırt çantası için tam olarak bir eşya türü için bu kurala uymadı.
Elfler şu anda her bir sırt çantasında bulunan tüm eşyaların bir listesini yaptı (bulmaca girdiniz), ancak hataları bulmak için yardımınıza ihtiyaçları var. Her eşya türü tek bir küçük veya büyük harfle tanımlanır (yani, a ve A farklı eşya türlerini ifade eder).
Her bir sırt çantası için öğelerin listesi tek bir satırda karakterler olarak verilir. Belirli bir sırt çantasının her iki bölmesinde de her zaman aynı sayıda eşya bulunur, bu nedenle karakterlerin ilk yarısı ilk bölmedeki eşyaları temsil ederken, karakterlerin ikinci yarısı ikinci bölmedeki eşyaları temsil eder.
https://adventofcode.com/2022/day/3

Örneğin, elinizde altı sırt çantasına ait aşağıdaki içerik listesinin olduğunu varsayalım:
vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw
- İlk sırt çantası vJrwpWtwJgWrhcsFMMfFFhFp öğelerini içerir, yani ilk bölmesi vJrwpWtwJgWr öğelerini içerirken ikinci bölmesi hcsFMMfFFhFp öğelerini içerir. Her iki bölmede de görünen tek öğe türü küçük p harfidir.
- İkinci sırt çantasının bölmeleri jqHRNqRjqzjGDLGL ve rsFMfFZSrLrFZsSL öğelerini içerir. Her iki bölmede de görünen tek öğe türü büyük L harfidir.
- Üçüncü sırt çantasının bölmeleri PmmdzqPrV ve vPwwTWBwg içerir; tek ortak öğe türü büyük P harfidir.
- Dördüncü sırt çantasının bölmeleri yalnızca v öğe türünü paylaşır.
- Beşinci sırt çantasının bölmeleri yalnızca t öğe türünü paylaşır.
- Altıncı sırt çantasının bölmeleri yalnızca s öğe türünü paylaşır.
Öğelerin yeniden düzenlenmesine öncelik verilmesine yardımcı olmak için her öğe türü bir önceliğe dönüştürülebilir:
- Küçük harfli a’dan z’ye kadar olan öğe tiplerinin 1’den 26’ya kadar öncelikleri vardır.
- A’dan Z’ye büyük harfli öğe türlerinin 27’den 52’ye kadar öncelikleri vardır.
Yukarıdaki örnekte, her bir sırt çantasının her iki bölmesinde de bulunan eşya türünün önceliği 16 (p), 38 (L), 42 (P), 22 (v), 20 (t) ve 19’dur (s); bunların toplamı 157’dir.
Her bir sırt çantasının her iki bölmesinde de bulunan eşya türünü bulunuz. Bu eşya türlerinin önceliklerinin toplamı nedir?
Bu bulmacayı çözmek için uyguladığım metot şu şekilde:
# Initialize the sum of priorities to 0
sum_of_priorities = 0
with open('rucksacks.txt', 'r', encoding="utf-8") as f: # Open the file
rucksacks = f.readlines() # Read the lines
# Loop through each rucksack
for rucksack in rucksacks:
# Split the rucksack into two compartments
comp1, comp2 = rucksack[:len(rucksack)//2], rucksack[len(rucksack)//2:]
# Create dictionaries that map each character to the number of times
# it appears in each compartment
counts1, counts2 = {}, {} # Initialize the dictionaries
for ch in comp1: # Loop through each character in the first compartment
counts1[ch] = counts1.get(ch, 0) + 1
for ch in comp2: # Loop through each character in the second compartment
counts2[ch] = counts2.get(ch, 0) + 1
# Loop through the keys in the first dictionary
for ch in counts1.keys(): # Loop through each character in the first compartment
# If the character appears in both compartments, add its priority
# to the sum of priorities
if ch in counts2: # If the character appears in both compartments
# Lowercase item types a through z have priorities 1 through 26.
# Uppercase item types A through Z have priorities 27 through 52.
if ch.islower():
sum_of_priorities += ord(ch) - 96 # Add the priority
else:
sum_of_priorities += ord(ch) - 38 # Add the priority
# Print the sum of priorities
print(sum_of_priorities)
Önce sum_of_priorities isimli bir değişkeni 0 olarak başlattık. İleride bu değişkeni eşya türlerinin önceliklerinin toplamını tek tek toplamak için kullanacağız. Daha sonra bize verilen input’u kaydettiğimiz dosya olan rucksacks.txt‘yi açıp tüm satırları okuduk. Bu text dosyasını okuduktan sonra satırlar üzerinden tek tek geçmek için bir for döngüsü oluşturduk ve kodun comp1, comp2 = rucksack[:len(rucksack)//2], rucksack[len(rucksack)//2:] kısmında her bir satırın ikiye ayırıp sağdaki ve soldaki kısımları ayrı ayrı komponentlere kaydettik.
Sonrasında 14-18 satırları arasında yapılan işlem ise text dosyasındaki satırlardaki hafralerin kaçar kere geçtiğini saymak ve ilgili harfe bir sözlük yapısında değer olarak kaydetmektir.
Son açılan for döngüsünde ise ilk komponentin içinde olan harfleri döndürüm bunların ikinci komponentte olup olmadığını sormaktır. Eğer ilk komponentteki herhangi bir harf ikinci komponentte var ise harfin ilgili değeri sum_of_priorities isimli değişken ile toplanıyor. Böylelikle ilk görevi tamamlamış olduk. Gelin şimdi ikinci kısma bakalım.
İkinci Bölüm:
Bu bölümde hikaye şu şekilde ilerliyor:
Yanlış yerleştirilmiş eşyaları tespit etmeyi bitirdiğinizde, Elfler size başka bir sorunla geliyor.
Güvenlik için Elfler üçer kişilik gruplara ayrılmıştır. Her Elf kendi grubunu tanımlayan bir rozet taşıyor. Verimlilik için, üç Elf’ten oluşan her grupta rozet, üç Elf tarafından da taşınan tek eşya türüdür. Yani, bir grubun rozeti B tipi eşyaysa, üç Elf de sırt çantalarının bir yerinde B tipi eşya taşıyacak ve Elflerden en fazla ikisi başka bir eşya tipi taşıyacaktır.
Sorun şu ki, birisi rozetlerin üzerine bu yılın güncellenmiş özgünlük etiketini koymayı unutmuş. Yeni orijinallik etiketlerinin yapıştırılabilmesi için tüm rozetlerin sırt çantalarından çıkarılması gerekiyor.
Ayrıca, kimse her grubun rozetine hangi eşya türünün karşılık geldiğini yazmamıştır. Hangi eşya türünün doğru olduğunu söylemenin tek yolu, her gruptaki üç Elf arasında ortak olan bir eşya türünü bulmaktır.
Listenizdeki her üç satır tek bir gruba karşılık gelir, ancak her grup farklı bir rozet öğesi türüne sahip olabilir. Yani, yukarıdaki örnekte, ilk grubun sırt çantaları ilk üç satırdır:
vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
İkinci grubun sırt çantaları ise sonraki üç sıra:
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw
İlk grupta, her üç sırt çantasında da görünen tek eşya türü küçük r harfidir; bu onların rozetleri olmalıdır. İkinci grupta ise rozetlerinin türü Z olmalıdır.
Çıkartma yapıştırma çabalarını düzenlemek için bu öğeler için öncelikler bulunmalıdır: burada, ilk grup için 18 (r) ve ikinci grup için 52 (Z). Bunların toplamı 70’tir.
Her bir üç-Elf grubunun rozetlerine karşılık gelen öğe türünü bulun. Bu öğe türlerinin önceliklerinin toplamı nedir?
Bu problemi çözmek için yazdığım python kodu şu şekildedir:
# Initialize the sum of priorities to 0
sum_of_priorities = 0
with open('rucksacks.txt', 'r', encoding="utf-8") as f: # Open the file
rucksacks = f.readlines() # Read the lines
rucksacks = [rucksack.strip() for rucksack in rucksacks] # Strip the lines
# Split the list of rucksacks into groups of three
for i in range(0, len(rucksacks), 3):
group = rucksacks[i:i+3]
# Create a dictionary that maps each character to the number of times
# it appears in all three rucksacks
for rucksack1 in group[0]:
if rucksack1 in group[1] and rucksack1 in group[2]:
if rucksack1.islower():
sum_of_priorities += ord(rucksack1) - 96
else:
sum_of_priorities += ord(rucksack1) - 38
break
# Print the sum of priorities
print(sum_of_priorities)
Burdaki yaklaşımım ise şu sekildedir. Txt dosyasını okuduktan sonra oluşan boşlukları almamak için strip() metodu ile bir parçalama işlemi yaptık. Daha sonra bir for döngüsü ile üçer üçer atlayacak şekilde her üç satırı grupladık.
Bu gruplama işeminden sonra grubun ilk satırının tüm karakterlerinden geçicek bir for döngüsü oluşturduk ve bu karakterlerin her birinin hem grubun ikinci elemanında hem de üçüncü elemanında olup olmadığını bir if else yapısıyla kontrol etik. Eğer bu karakter diğer grup üyelerinde de varsa sum_of_priorities isimli değişken gerekli şekilde toplandı ve başka bir harf bulmamak için break komutu ile döngüyü kırıyoruz. Ve son olarak önceliklerinin toplamı ekrana yazdırılmıştır.
AoC’un üçüncü günü de bu kadardı. 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.