Herkese merhabalar! Bugün 4. gün ile birlikteyiz. Bana nispeten bir önceki güne göre daha basit gelen bu günkü bulmacada konumuz Kamp Temizliği hakkında ve hikaye şu şekilde başlıyor:
Bölüm 1:
Son erzaklar gemilerden indirilmeden önce alanın temizlenmesi gerekiyor ve bu yüzden birkaç Elf kampın bölümlerini temizleme işine atandı. Her bölümün benzersiz bir kimlik numarası vardır ve her Elf’e bir dizi bölüm kimliği atanır.
Ancak, bazı Elfler bölüm atamalarını birbirleriyle karşılaştırdıklarında, atamaların çoğunun çakıştığını fark ettiler. Çakışmaları hızlı bir şekilde bulmaya çalışmak ve mükerrer çabayı azaltmak için Elfler eşleşir ve her çift için bölüm atamalarının büyük bir listesini yapar (bulmaca girdiniz).
Örneğin, aşağıdaki bölüm atama çiftleri listesini göz önünde bulundurun:2-4,6-8 2-3,4-5 5-7,7-9 2-8,3-7 6-6,4-6 2-6,4-8İlk birkaç çift için bu liste şu anlama gelir:
https://adventofcode.com/2022/day/4
- İlk Elf çiftinde birinci Elf’e 2-4. bölümler (2, 3 ve 4. bölümler) atanırken, ikinci Elf’e 6-8. bölümler (6, 7, 8. bölümler) atanmıştır.
- İkinci çiftteki Elflerin her birine iki bölüm atanmıştır.
- Üçüncü çiftteki Elflerin her birine üç bölüm verildi: birine 5, 6 ve 7. bölümler verilirken diğerine 7, artı 8 ve 9. bölümler verildi.
Bu örnek listede, çizimi kolaylaştırmak için tek basamaklı bölüm kimlikleri kullanılmıştır; gerçek listeniz daha büyük sayılar içerebilir. Görsel olarak, bu bölüm atama çiftleri aşağıdaki gibi görünür:
.234..... 2-4
.....678. 6-8
.23...... 2-3
...45.... 4-5
....567.. 5-7
......789 7-9
.2345678. 2-8
..34567.. 3-7
.....6... 6-6
...456... 4-6
.23456... 2-6
...45678. 4-8
Bazı çiftler, atamalarından birinin diğerini tamamen içerdiğini fark etmiştir. Örneğin, 2-8 tamamen 3-7’yi içeriyor ve 6-6 tamamen 4-6 tarafından içeriliyor. Bir görevin diğerini tamamen kapsadığı çiftlerde, çiftteki bir Elf sadece eşinin zaten temizleyeceği bölümleri temizliyor olacaktır, bu nedenle bunlar yeniden gözden geçirilmeye en çok ihtiyaç duyanlar gibi görünmektedir. Bu örnekte böyle 2 çift bulunmaktadır.
Kaç atama çiftinde bir aralık diğerini tamamen kapsar?
Burada kısaca bizden istenen, eğer her satırdaki iki farklı sayı çiftlerini ardışık sayı çiftleri olarak düşünürsek, bu farklı sayı çiflerinin birbirini içerip içermediğini bulmak ve kaç tane satırda bu olay yaşanır onu bulmaktır. Bu problemi çözmek için önce kodu yazdığım dizine assignment.txt adlı bir dosya açtım ve inputumu bu dosyaya kopyaladım ve aşağıdaki kodu yazdım:
pairs = 0 # number of pairs that will fully contain the other
with open('assignment.txt', 'r', encoding="utf-8") as f: # Open the file
assignment = f.readlines() # Read the lines of the file
assignment = [line.strip() for line in assignment] # Remove the newline character from each line
for line in assignment:
# delete the '-' and ',' and split the line into two parts
line = line.replace('-', ' ').replace(',', ' ').split()
# convert the strings to integers
line = [int(i) for i in line]
# check if the first and second number are in the third and fourth number or third and fourth number are in the first and second number
if (line[0] <= line[2] and line[1] >= line[2] and line[0] <= line[3] and line[1] >= line[3]) or (line[2] <= line[0] and line[3] >= line[0] and line[2] <= line[1] and line[3] >= line[1]):
pairs += 1
print(pairs)
Burada önce pairs adlı bir değişkeni 0 olarak atadım. Bu değişkeni ileride atama çiftinde bir aralık diğerini tamamen toplam kaç defa kapsar bunu bulmak için kullanacağız. Daha sonra inputumuzu okuduk ve tüm satırlar üstünde tek tek geçmek için bir for döngüsü oluşturduk.
Bizim satır yapımız sayı1-sayı2,sayı3-sayı4 şeklinde olduğu için ilk olarak satırladaki tireler ‘-‘ ve vigüllerden ‘,’ kurtulamak ve bu sayıları integer olarak tanımlamak için 6 ve 10. satırlar arasındaki kod yazılmıştır. Daha sonra inputumuzdaki satırlarımız şu şekilde liste yapısına dönüşmüştür –> [sayı1,sayı2,sayı3,sayı4]
Bu listenin elemanlarına kolayca ulaşabileceğimiz için sayı1 ve sayı2’nin sayı3 ve sayı4 tarafından içeriliyor mu veya bunun tam tersi yaşanıyor mu bunu basit bir if else yapısıyla inceliyoruz ve bu durumun yaşandıpı satırlar olursa pairs değişkenini 1 arttırıyoruz. Böylelikle ilk görev tamamlandı. Hadi gelin şimdi sıradaki göreve bakalım.
Bölüm 2:
Görünüşe göre hala oldukça fazla mükerrer çalışma planlanıyor. Elfler bunun yerine, çakışan çiftlerin sayısını bilmek istiyorlar.
2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8
Yukarıdaki örnekte, ilk iki çift (2-4,6-8 ve 2-3,4-5) çakışmazken, kalan dört çift (5-7,7-9, 2-8,3-7, 6-6,4-6 ve 2-6,4-8) çakışmaktadır:
- 5-7,7-9 tek bir bölümde örtüşür, 7.
- 2-8,3-7, 3’ten 7’ye kadar olan tüm bölümlerle örtüşür.
- 6-6,4-6 tek bir bölümde örtüşür, 6.
- 2-6,4-8, 4, 5 ve 6 numaralı bölümlerde çakışır.
Dolayısıyla, bu örnekte, çakışan atama çiftlerinin sayısı 4’tür.
Kaç atama çiftinde aralıklar çakışıyor?
Kısaca bu soruda değişen şey artık sayı çiftlerinden birinin diğerinin tamamen kapsaması gerekmiyor onun yerine herhangi bir örtüşme varsa pair değişkenini 1 arttırmamız gerekiyor.
Bu problemi çözmek için uyguladığım yöntem şu şekilde:
pairs = 0 # number of pairs that do the ranges overlap
with open('assignment.txt', 'r', encoding="utf-8") as f: # Open the file
assignment = f.readlines() # Read the lines of the file
assignment = [line.strip() for line in assignment] # Remove the newline character from each line
for line in assignment:
# delete the '-' and ',' and split the line into two parts
line = line.replace('-', ' ').replace(',', ' ').split()
# convert the strings to integers
line = [int(i) for i in line]
if not (line[1] < line[2] or line[3] < line[0]): # if the ranges overlap
pairs += 1
print(pairs)
İlk kısımdan farklı olan tek şey if yapısının koşulu değişti. Buradaki koşul da eğer satırda bir çakışma var ise pair değişkenini artırmaya yönelik bir yapıdadır.
AoC’un dördü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.
