Kodlama Serüvenim

date
Dec 14, 2021
slug
kodlama-seruvenim
status
Published
tags
Programming
summary
type
Post
Uzun zamandır yazılımla ilgili makaleler okuyor, çalışmalar yapıyorum. Son zamanlarda kendimi Python dilinde küçük programlar yazarak geliştirmeye çalışıyorum. Bu günlüğü ilerleyişimi izlemek ve tarihe not düşmek adına tutuyorum.

Gün 1 - Dev Kalamar | 14.12.2021

2 Gün önce Reddit'te gezerken Advent of Code'a denk geldim. İçerdiği küçük bulmacaları herhangi bir programlama diliyle çözebiliyorsunuz. Ben bulmacaları çözerken Python dilini kullanacağım. Günlüğü tutarken cevaplardan çok karşılaştığım sorunlardan bahsedeceğim.
Daha önce ilk üç bulmacayı çözdüğüm için, bu günlüğü dördüncü gün bulmacası ile açıyorum.
Bu bulmacada bizden birinci çinko yapan matriste kalan sayıların toplamı ve çinkoyu yapan son rakamın çarpımını istiyor.
İlk gün ödevi olarak Python'da .txt dosyasından verileri nasıl matrise aktaracağımı ve matrislerle nasıl çalışacağımı araştıracağım.

Gün 2 - Dev Kalamar Sorunu Devam Ediyor | 15.12.2021

Bugün okul yoğun ve yorucuydu, bu yüzden kalamar sorununa vakit ayıramadım. Sadece dün üzerinde düşünmem gereken konular için biraz araştırma yaptım.
Python'da kod yazmanın bir çok yöntemi var. Fakat python yazan geliştiriciler pythonic kod yazmanın önemini forumlarda vurgulayorlar. Her ne kadar dile hakim olmasam da öğrenilerimi bu yönde yapıyorum.
Soruda oluşturmam gereken matrisler için Python'un 'liste' veri tipini kullanmaya karar verdim. Boş liste tanımlamak çok kolay,
tombala = [[["1. Çinko"],
					  ["2. Çinko"],
					  ["3. Çinko"],
					  ["4. Çinko"],
					  ["5. Çinko"]]]
Aynı zamanda liste içinde liste oluşturarak çok boyutlu kullanılabiliyor. Bir tombala seti 5 çinkodan oluştuğu için bir liste içinde beş farklı liste tanımlayacağım.
Python'da kod yazmanın bir çok yöntemi olduğundan bahsetmiştim.
tombala = []
for line in data:
    tombala.append([int(char) for char in line.strip().split(' ') if char != ""])
Yukarıda yazdığım birinci kod satırı boş bir liste oluşturuyor. İkinci satır veri dosyasının her bir satırını döndürüyor. Üçüncü ve tek satırdan oluşan for döngüsü ve if kontrolü ise satırın başındaki ve sonundaki boşlukları temizledikten sonra değerlerin arasında bulunan boşluk karakterini baz alarak ögeleri ayırıyor, daha sonra öge boş değer içermiyorsa tombala satırına ekliyor.
Yarın tam bir liste oluşturup, sonuca ulaşmaya çalışacağım.

Gün 3...7 - Dev Kalamar Sorunu Çözüldü | 20.12.2021

Yıl sonu olması nedeniyle ek dersler ve diğer işlemler üst üste geldi biraz fazla çalışmayla sorunsuz bir şekilde okuldaki işleri bitirdim fakat yazılım günlerim sekteye uğradı. Her gün bilgisayarın başına otursam da blog yazacak vakit bulamadım. Fakat bu süreçte kalamar problemini çözdüm hatta kabul edilmeyeceğini bilsem de Yemek Sepeti’ne iş başvurusu yapıp ön elemeye katıldım. Çok verimli bir hafta sonu olmasa bile bilgi hazineme yeni bilgiler ekledim. Şimdi bu bilgilerden biraz bahsedeyim.
Öncelikle Advent of Code’da her oyun iki bölümden oluşuyormuş ben bunu dördüncü oyunu bitirdikten sonra öğrendim. Tabi benim için biraz şok etkisi yarattı. Şimdi ilk oyunların ikinci bölümlerini çözmeye başladım 🙃
Geçtiğimiz süreçte listeler ve listelerin alt elemanlarına ulaşmakla alakalı bir çok yeni bilgi edindim. Python’da tek satırda döngü ve şart kullanımını kavradım sayılır. Fakat hala bir liste üzerinde döngü için for yazmak bana daha kolay geliyor. İnternette bir çok kaynakta map fonksiyonu ve filter fonksiyonu kullanarak daha etkili kod yazan arkadaşlara denk geliyor ve imrenmiyor değilim. Bunun üzerinde çalışıyorum.
def part2(numbers):
    seen = []
    for number in numbers:
        for index, card in enumerate(cards):
            for row in range(len(card)):
                for col in range(len(card)):
                    if card[row][col] == number:
                        card[row][col] = 100
            
            if index not in seen and check_winner(card):
                seen.append(index)
                
                if len(cards) - len(seen) == 0:
                    sum_lst = 0
                    for row in card:
                        for i in range(len(row)):
                            if row[i] != 100:
                                sum_lst += row[i]

                    return number * sum_lst
Dev kalamar sorununun ikinci partını yukarıda yazdığım şu acayip çirkin kodla çözdüm. Önümüzdeki günlerde kendimi recursion özyineleme konusuna adayacağım.

Gün 8 - Hidrotermal Baca | 21.12.2021

Bugün yeniden dayı olmanın mutluluğunu yaşıyorum. Hoş geldin Asım 👶🏼
Advent of Code’da beşinci güne geldim. Amacımız denizaltımızı Hidrotermal kaçaklardan korumak.
0,9 -> 5,9
8,0 -> 0,8
9,4 -> 3,4
2,2 -> 2,1
7,0 -> 7,4
6,4 -> 2,0
0,9 -> 2,9
3,4 -> 1,4
0,0 -> 8,8
5,5 -> 8,2
Yukarıdaki örnek verilerde her rakam bir koordinatı işaret ediyor. İlk satırı ele alacak olursak veriler x1=0, y1=9, x2=5, y2=9
Daha önce verileri split() fonksiyonu ile ayırabiliyordum. Bu sefer işin içinden kolayca çıkamadım. İnternette kısa bir araştırma yaptıktan sonra regex komutu ile verileri ayırabileceğimi gördüm.
import re

with open('day5/sample.txt', 'r') as f:
    lines = [line.strip() for line in f.readlines()]
    for line in lines:
        split_str = re.split(',| -> ',line)
        x1,y1,x2,y2 = split_str
Regex’i kullanmak için python içinde gelen re kütüphanesini dosyamıza eklememiz gerekiyor. Daha sonra dosyayı okuyup satırlarına ayırdıktan sonra her satırda re.split(',| -> ',line) fonksiyonu ile verilerimizden sadece işe yarar kısımlarını alıyoruz. Fonksiyona hangi ifadeleri çıkartmak istiyorsak tırnak içinde onu gönderiyoruz. Ben ilk önce virgülleri istemediğimi belirttim. Daha sonra pipe işareti koyarak -> ’boşluk tire büyüktür boşluk’ ifadesini de istemediğimi belirttim. Burada pipe işareti önemli çünkü tırnak içinde yazılan her şeyi regex ardı ardına geliyor mu diye bakıyor. Böylece elimde sadece rakamların string değeri kalmış oldu. Burada python’un güçlü özelliklerinden biri olan çoklu değer atamayı kullanarak x1,y1,x2,y2 = split_st diyerek tüm değerleri istediğim değişkene atadım.

Gün 9 - Hidrotermal Baca Birinci Bölüm Tamamlandı | 22.12.2021

Bugün, kısa bir sürede beşinci partın sonucuna ulaştım. Hızlıca ulaşmama numpy kütüphanesinin çok yardımı oldu. Ben de bu soru vesilesiyle numpy’a giriş yapmış oldum. Aşağıda Advent of Code beşinci günün çözümü var. Her ne kadar başlarken çözümü paylaşmayacağım desem de burada hangi satırda hangi işlemi yaptığımı yazmak beni daha ileri götürüyor.
import numpy as np
import re


with open('day5/data.txt', 'r') as f:
    lines = [line.strip() for line in f.readlines()]
    split_str = []
    for line in lines:
        line_regex = re.split(',| -> ',line)
        split_str.append([int(x) for x in line_regex])

draw = np.zeros((1000,1000))

for i in split_str:
    x1,y1,x2,y2 = i

    if x1 == x2 and y1 < y2:
        for i in np.arange(y1,y2+1):
            draw[x1][i] += 1
    elif x1 == x2 and y1 > y2:
        for i in np.arange(y1,y2-1,-1):
            draw[x1][i] += 1
    draw = draw.transpose()

    if y1 == y2 and x1 < x2:
        for i in np.arange(x1,x2+1):
            draw[y1][i] += 1
    elif y1 == y2 and x1 > x2:
        for i in np.arange(x1,x2-1,-1):
            draw[y1][i] += 1
    draw = draw.transpose()

print("Part1 Solution:",len(np.where(draw >= 2)[0]))
Numpy kütüphanesini projeme dahil ettikten sonra sıfırlardan oluşan bin satır ve bin sütunluk bir matris yarattım. İşin aslı biraz kolaya kaçtım. Verilen değerlerdeki en yüksek değeri almam daha uygun olurdu yalnız bana bin satır yetiyor şimdilik.
Daha sonra parçaladığım ve bir liste içine aldığım koordinatların üzerinde döngüye girdim. Soruda verilen gerekli koşulları yerine getirdim. Burada günlük hayatta Excel’de kullandığım transpose komutunu yani matrisi doksan derece döndürmeyi düşündüm. numpy içinde transpose() fonksiyonunu direkt olarak kullanabiliyoruz. Böylece satır ve sütunlara hızlı bir şekilde erişerek işlemleri gerçekleştirdim. Kodlarımın hala sadeleşmeye ve mantıklı tanımlara ihtiyacı var 😀

© Omer Deger 2021 - 2024