Advent of Code: 9. Gün
Advent of Code'un 9. gününden tekrardan merhabalar!
8 gün boyunca o kadar yazdım kolay kolay diye, dünün dinamik programlaması bile kesmedi, ilk kez gerçekten zorlandığımı hissettim 9. günün probleminde, özellikle ikinci kısmında.
İlk kısımda çok da anlatmalık bir şey yok açıkçası. Bütün köşe çiftlerini deneyip en büyük alan olanı seçmekten ibaret. ama sorun olacak kadar fazla köşe olmadığı için süre sorunu olmuyor ilk kısımda.
İkinci kısımda işler biraz karışıyor. Artık sadece köşe çiftlerine bakma durumu yok, köşelerin oluşturduğu çokkenarlı cismi de düşünmek gerekiyor. Aslında kavramsal olarak pek bir zorluğu yok, bütün çiftleri denerken çokkenarlının tamamen içinde kalıp kalmadığına göre eleme yapınca cevap çıkıyor. Fakat o kalıp kalmama testini yazana kadar canım çıkmıştı benim. Kenarın üzerinde olması da sıkıntı olmadığı için aklıma gelen çözüm, zaten hâlihazırda ızgara üzerinde olduğumuz için, dış kenarlara bakmak olmuştu. Her bir kenarın dış kısmındaki kenarlarla kesişen dikdörtgenleri eleyince sonuç çıkmalıydı. Fakat olmadı. Saatlerce nerede hata yaptığımı aradım. Açık konuşmak gerekirse, tam olarak neyi yanlış yaptığımı yine de bulamadım. Bir noktada işin içinden çıkamayınca yaklaşımımı değiştirdim biraz. Dış kenarların ızgaradaki konumlarına tek tek bakmak yerine dış köşeleri buldum. Dış köşeler arasındaki kenarlara baktım bundan sonra. Bu kenarları dikdörtgen olarak yorumladım. Bir de Reddit'te gördüğüm bir değişiklik olarak ızgaranın boyutlarını katladım ki aradaki boşluklar her zaman boş olsun, yan yana kenar bulunmasın. Mevcut kodumda 4 katsayısı ile genişletmişim ızgarayı, belki daha az katsayıyla da çalışıyordur hatta. Katsayısız çalışıp çalışmadığından emin olduğumu söyleyemem ama. Bununla birlikte çözüm oldu ama bu bile saniyeden daha kısa sürede girdimin sonucunu bulabiliyordu. Girdideki köşe sayısı genel olarak azdı.
Dış köşeleri ve kenarları bulurken modulo işlemine ihtiyaç duydum, ilk günde bahsettiğim avantaja sahip olmadığım için, Lua değil C3 olduğundan, elimle "düzgün modulo" işlemini yazmak zorunda kaldım bu problemde.