Advent of Code 2024
(adventofcode.com)- Aralık ayındaki programlama bulmacası etkinliği Advent of Code, beceri ve dil seçimi bariyerlerini düşürerek pratik, eğitim, rekabet gibi çeşitli amaçlarla katılımı mümkün kılacak şekilde tasarlanmıştır
- Bilgisayar bilimi geçmişi ya da yüksek performanslı donanım gerekmez; tüm sorular için 10 yıllık donanımda en fazla 15 saniyede tamamlanan bir çözüm vardır
- Çözüm tıkanırsa örnekleri kontrol etme, kendi hazırladığınız test case'ler, girdiyi doğrulama, ardından arkadaşlar veya subreddit ipuçları sırasıyla problemi daraltabilirsiniz
- 2024 FAQ içinde etkinlik süresindeki değişiklik, global leaderboard'un kaldırılması, private leaderboard kuralları, yapay zeka kullanımı, kopyalama ve yeniden dağıtım kısıtları gibi operasyon politikaları özetleniyor
- Hız rekabeti isteğe bağlıdır; katılımcılar bulmacaları kendileri için yararlı olan şekilde çözmeye ve öğrenmeye odaklanabilir
Advent of Code'un niteliği ve katılım koşulları
- Advent of Code, küçük programlama bulmacalarından oluşan bir Advent calendar formatındaki etkinliktir
- Bulmacalar farklı beceri seviyelerine hitap eder ve istenen programlama dili ile çözülebilir
- Mülakat hazırlığı, şirket içi eğitim, üniversite ödevleri, alıştırma soruları, hız rekabeti ve katılımcılar arası meydan okumalar için kullanılır
- Bilgisayar bilimi geçmişi şart değildir; biraz programlama bilgisi ve problem çözme becerisi olan herkes katılabilir
- Yüksek performanslı bir bilgisayar da gerekmez; tüm sorular için 10 yıllık donanımda en fazla 15 saniyede tamamlanan bir çözüm vardır
Tıkandığınızda izlenecek çözüm süreci
- Çözüm tıkanırsa önce bulmacadaki örneklerle programı doğrulamak gerekir
- Örnek sonuçlar doğru çıkmıyorsa problem açıklamasını yeniden okuyun; yanlış anlaşılan noktaları veya programın beklenmedik davranışlarını kontrol edin
- Örnekler doğru ama asıl cevap yanlışsa, cevabı elle doğrulayabileceğiniz test case'ler oluşturup programa uygulayın
- Tüm bulmaca girdisinin eksiksiz kullanılıp kullanılmadığını da kontrol etmek gerekir
- Hâlâ tıkanırsanız bir arkadaşınızdan yardım isteyebilir, daha sonra tekrar deneyebilir veya subreddit'ten ipucu alabilirsiniz
Site kullanımı ve kimlik doğrulama
- Kod blokları, JavaScript etkinse üç kez tıklayarak tamamen seçilebilir
- Kimlik doğrulama için dış servislerde kimliği doğrulayan OAuth kullanılır
- Giriş sırasında kimlik bilgileri Advent of Code'a değil, yalnızca ilgili dış servise verilir
- Dış servis Advent of Code sunucusuna kullanıcının gerçekten siz olduğunu bildirir
- Genelde zaten herkese açık bilgiler dışında ek bir bilgi açığa çıkmaz
- Advent of Code, kimlik doğrulama servisinin benzersiz kimliğini, adını, URL'sini ve görselini hatırlar
- Sitedeki yazıları okumak zorsa yüksek kontrastlı alternatif stil sayfası kullanılabilir
- Firefox bunu varsayılan olarak View → Page Style → High Contrast ile destekler
Zorluk seviyesi, yayın saati ve etkinlik süresi
- Bulmacaların zorluk seviyesi ve konusu her etkinlikte değişir
- Genelde zaman ilerledikçe bulmacalar zorlaşır, ancak algılanan zorluk kişinin beceri kombinasyonuna göre büyük ölçüde değişebilir
- Bulmacalar EST/UTC-5 gece yarısında yayınlanır
- Çünkü bu saat, organizatörün sistemin sorunsuz çalıştığını güvenle kontrol edebildiği zamandır
- Gece yarısında katılamamak sorun değildir; yerel rekabet için private leaderboards kullanılabilir
- Etkinlik gün sayısı değişmiştir
- Advent of Code'u yürütmek her yıl çok fazla boş zaman gerektirir ve bunun büyük kısmını bulmaca üretimi alır
- 10 yıl aynı takvimi sürdürdükten sonra bir değişiklik gerekli hâle gelmiştir
- Bulmacalar tarih numaralarıyla uyumlu olacak şekilde 1 Aralık'ta başlar, her gün yayınlanır ve Aralık ortasında biter
Leaderboard'lar ve hız rekabeti
- global leaderboard kaldırılmıştır
- Bu, organizatör, altyapı ve birçok kullanıcı için en büyük stres kaynaklarından biriydi
- Bazı katılımcılar rekabeti gereğinden fazla ciddiye aldı ve DDoS saldırıları gibi davranışlar görüldü
- Birçok kullanıcı, kendi süreleri karşılaştırılan kişilerden daha yavaş diye yanlış biçimde kendilerinin daha kötü programcı olduğu sonucuna vardı
- 2015'te eğlenceli bir özellik olarak başlamıştı, ancak 10 yıl boyunca giderek büyüyen bir soruna dönüştü
- private leaderboard'un salt okunur görünümü paylaşılabilir
- Ancak bu özellik ya da bu veriler kullanılarak yeni bir global leaderboard oluşturulmamalıdır
- Hızlı çözüm süresi isteğe bağlıdır
- Hızlı çözmek için bulmaca çözmenin ötesinde çeşitli ek beceriler ve çok pratik gerekir
- speed-solve kodu çoğu zaman kod incelemesinden geçmesi beklenen koda hiç benzemez
- Kendiniz için yararlı hedeflere göre yaklaşım seçebilir ve hız rekabetini tamamen görmezden gelebilirsiniz
Yapay zeka kullanımı ve private leaderboard kuralları
- Bir private leaderboard içindeyseniz, organizatörden beklenen kuralları kontrol etmelisiniz
- Kurallar size uymuyorsa başka bir private leaderboard bulabilir veya kendiniz oluşturabilirsiniz
- private leaderboard kuralları; azami çalışma süresi, izin verilen diller, bulmacanın ilk ne zaman açılabileceği, hangi araçların kullanılabileceği ve hatta çalışırken komik bir şapka takmanın gerekip gerekmediği gibi şeyleri içerebilir
- Advent of Code bulmacalarını çözerken yapay zeka kullanımı önerilmez
- Bunun yerine, arkadaşınızı spor salonuna gönderirseniz sizin güçlenip güçlenmeyeceğinizi soran bir benzetme kullanılır
- Bulmacalar insanların çözerken ilginç bulacağı şekilde tasarlanır; yapay zekanın çözüp çözemeyeceği dikkate alınmaz
- Amaç AI prompt pratiği ise, bu amaca özel tasarlanmış başka alıştırmalar daha uygun olabilir
Bulmaca fikirleri, hatalar ve kopyalama politikası
- Bulmaca fikirleri gönderilmemelidir
- Telif hakkı ve attribution gibi hukuki sorunlar nedeniyle fikir kabul edilmez
- Yanlışlıkla bir kısmını kullanma ihtimalinden kaçınmak için, bulmaca fikri gibi görünen e-postalar bile okunmaz
- Bir bulmacada hata bulduğunuzu düşünüyorsanız önce subreddit'te kontrol etmelisiniz
- Bulmaca yayınlandıktan bir saat sonra zaten birçok kişi çözmüş olacağından, o noktadan sonra hata olasılığı çok düşüktür
- Advent of Code ücretsiz kullanılabilir, ancak serbestçe kopyalanamaz
- Kod deposuna bulmaca metni ya da kendi girdiniz gibi Advent of Code içeriğinin parçalarını eklememelisiniz
- Bir web sitesi yaparken Advent of Code'a benzetmemeli veya benzer bir ad vermemelisiniz
Hukuki bildirim ve izin verilen kapsam
- Advent of Code, ABD'de tescilli bir ticari markadır
- Advent of Code'un tasarım öğeleri, ifadeleri, tarzı ve konsepti Advent of Code'un münhasır mülkiyetidir; açık yazılı izin olmadan kopyalanamaz veya kullanılamaz
- Telif hakkı bildirimi 2015-2025 Advent of Code'tur ve tüm hakları saklıdır
- Advent of Code bulmacalarına tartışmalarda, derslerde, kaynak kodunda, basılı materyallerde vb. bağlantı verilebilir veya referans gösterilebilir; buna ticari bağlamlar da dahildir
- Advent of Code, kullanıcının çözüm implementasyonu üzerinde mülkiyet ya da telif hakkı iddiasında bulunmaz
1 yorum
Hacker News yorumları
AoC'yi sevdiğim için son 2-3 yıldır çözümleri Rust ile yaptım; Discord'da hep birlikte en hızlı çözümü üretmeye çalışarak eğlendik.
Bu süreçte her türden performans optimizasyonu ipucu, ileri algoritmalar ve SIMD öğrendim.
Bu kez işte kullandığım Go'yu sevip sevmeyeceğimi ya da en azından katlanıp katlanamayacağımı görmek; yoksa pek iyi olmadığı varsayımımı doğrulayıp yalnızca gerçekten gerektiğinde kullanmak için Rust ve Go ile çözmeye çalışıyorum.
Pratik, ortam kurulumu ve yan işler az, dosya okuma/ayrıştırma gibi gereken çoğu şey yerleşik, performansı iyi ve donanıma yakın olduğundan gizli performans tuzakları daha az.
Rust kullanmadığım için karşılaştırmak zor, ama çok yüzeysel bakınca daha az pratik geliyor.
AoC'de bellek güvenliği gibi prodüksiyon kriterlerine pek gerek olmadığından, sonraki problemlerde güvenlikten çok pratiklik ve performans daha önemli görünüyor.
Her yıl Zig ile hız optimizasyonu denemeye çalışıyorum: https://github.com/ManDeJan/advent-of-code
Hatta tam tersine, Rust'ı sevmeye çalışma ikilemi yaşıyorum.
Rust ile denemek istemiştim ama günlere göre modüllere mi ayırmalıyım, her günü bir kütüphane dosyası yapıp ana giriş noktasına mı bağlamalıyım, pek kestiremiyorum.
Herkese açık bir depo varsa paylaşırsanız sevinirim.
Bu yılki meydan okuma, standart kütüphane veya ayırıcı olmadan C ile yazmak.
32KB SRAM'e sahip bir STM32 üzerinde çalışabilir olmalı.
2 yıl önce assembly ile denemiştim; assembly için standart kütüphane oluşturmaya saatler harcayıp pes ettim ve Rust'a geçtim.
Çok ilerleyemedim; bellek koruması olmayınca gerçekten zorlaşıyor.
Bu yıl Amiga'da MMU'lu bir 060 yükseltmesi var, onu nasıl kullanacağımı bulup tekrar deneyebilirim.
C de buna dahildi ve hash table olmadığı için gerçekten acı vericiydi.
https://git.sr.ht/~q3cpma/aoc2024/tree/master/item/01
İlerlemeyi görebilmemiz için depo bağlantısını paylaşırsan memnun olurum.
Geçen yıl dış kütüphane kullanmadan tüm problemleri C ile çözdüm [1] ve çok eğlenceliydi.
Unuttuğum düşük seviyeli unsurları, örneğin heap gibi şeyleri doğrudan uygulamaya itti; sayısal rutinleri de kendim yazdım ve beklediğimden kolaydı.
[1] https://github.com/sebastianotronto/aoc/tree/master/2023
grep serbest, awk yasak gibi; benzer derecede kısıtlayıcı olur ama ölümcül bellek bozulması hataları olmaz.
Normalde AoC'yi Common Lisp ile yaparım, ama bu yıl Swift'i deniyorum.
Statik tipli ana akım bir dil için bu tür ufak tefek işlemlerde epey iyi.
https://github.com/codr7/aoc24/tree/main/swift/Sources/aoc
Bu yıl biraz tuhaf; yeni işimde bir etkinlik hazırlıyordum.
Çünkü geliştiricilerin framework'leri birbirine yapıştırmaktansa gerçek problem çözmeyi öğrenmesi açısından faydalı olacağını düşünüyordum.
Ama yeni patronumun birlikte çalışılması imkânsız biri olduğu ortaya çıktı ve ayrılmak zorunda kaldım.
Sonunda her zamanki gibi sanırım sadece ben ve Emacs kalacağız.
Farklı çözümleri karşılaştırmak oldukça ilginç.
Daha önce Swift ile AoC denemek istemiştim ama o kısım yüzünden hevesim epey kırıldı.
Küçük fonksiyonel tek satırlık çözümler güzeldi, ama bir hafta kadar sonra ayrıştırma yükü çok artacak gibi gelmişti.
Bu yıl Swift'i denemek istemiştim ama bunun için Xcode'u açmak biraz fazla gibi geliyor.
Yine geldi çattı: 25 gün boyunca giderek karmaşıklaşan girdi ayrıştırıcıları yazma sezonu.
Asıl mesele girdiyi işlemeye elverişli bir biçime ayrıştırmak oluyor; ayrıştırma bitti mi gerisi kolaylaşıyor.
Karmaşıklaşan şey problemin kendisi; 22. ya da 23. gün civarındaki zor problemlerde bile girdi genellikle boşlukla ayrılmış tamsayı satırları veya noktalardan oluşan bir grid gibi, 1-3. günlerin kolay problemlerine benzer biçimde oluyor.
Bu yıl hedefim tüm yıldızları toplayıp toplam 500 yıldıza ulaşmak
Yani tüm yılları, tüm problemleri bitirmiş olmak
Geçen hafta itibarıyla toplam 450 yıldıza sahip yaklaşık 1024 kişi vardı
Ancak 2022'nin 6. günü civarında başladım, sonra içine düştüm; 2023'ün başında vaktim olunca önceki yılları baştan sona çözdüm
Birkaç algoritmayı hazırda bulundurursanız çok zor değil; her yıl tekrarlanan temalar da var
Günlük hayatta sık dokunmadığım gerçek algoritma türü şeyleri yeniden öğrenmenin keyfi var
Gönüllülere ve Eric'e teşekkürler; artık her yıl bağış yapmayı planlıyorum. Gerçekten harika bir etkinlik
Bu dönemin öne çıkan güzel şeylerinden biri olduğu için seviyorum
Bu kez Pasifik'i doğuya doğru geçen bir uçakta çözmem gerekti
Hem benim için hem de arkadaşlarım, iş arkadaşlarım ve HN'deki insanlar için keyifli bir geleneğe dönüştü
wastl ve yardımcı elflerin bunu hazırlaması yine inanılmaz geliyor
Buradan değer elde edenlerin, mümkünse destek olması iyi olur
Bir tutku projesi olsa da gerçek maliyetleri olduğu da doğru
Yine de adventofcode gerçekten harika ve mümkünse desteklemek iyi olur
Ama aldığı mevcut destek miktarına bakınca, yaratıcısının epey iyi durumda olduğunu tahmin ediyorum
Bu yıl F# ve Gleam ile denemeyi planlıyorum ama her yıl olduğu gibi 10-12 günden fazlası için zamanım ve kafam olmayacak gibi
Python kullananların F#'ı da bir denemesini öneririm
Betik yazmaya oldukça yakın hissettirebilir ve mükemmel bir REPL'i de var
İlk yıl çok sıkıcı olmasın diye bir standart kütüphane yazmama motivasyon olmuştu
Şimdi daha iyi araçları bitirmiş olmayı dilerdim diye düşünüyorum
jq ile yazılmış gdb benzeri bir CLI hata ayıklayıcı olan wsjq[1] ile debug ediyorum ama yavaş
[0]: https://github.com/thaliaarchi/ws-challenges
[1]: https://github.com/thaliaarchi/wsjq
Fonksiyonel programlama deneyimi olmayan biri için bile eğlenceliydi
Bu yıl katılacak vaktim yok ama katılsaydım muhtemelen yine F#'ı seçerdim
Fonksiyonel yolculuğumun henüz başındayım ama şu ana kadar AoC'nin faydalı olduğunu düşünüyorum
Geçen yıl Day 12'de bir hafta boyunca takılı kaldım ve çözüm yolunu düşünmek uyanık olduğum tüm zamanı tüketti
Bu yıl kendime biraz daha anlayışlı davranıp katılmayacağım ve kış tatilinin tadını düzgünce çıkarmaya çalışacağım
Artık hiç bakmıyorum. Eğlence oldukça hızlı strese dönüşüyor
Sınır koymak ve dinlenme zamanının tadını çıkarmak önemli
Benim için Advent of Code kaygan bir yokuş gibi
Zorluk arttıkça başta kolay, sonra tatmin edici derecede zor oluyor; ama bir bakmışsınız çok fazla zaman harcıyorsunuz
O noktaya gelindiğinde duygusal olarak çoktan yatırım yapmış olmak tehlikeli
https://eli.li/december-adventure
Kesilmesi gereken en uzun üç kenarı bulmak için kuvvet tabanlı bir graf motoru bile yazmam gerekti
Çözdükten sonra başkalarının çözümlerine baktığımda, Meta'nın önerme çözücüsünü kullanıp yaklaşık 10 satırda bitirdiklerini gördüm
Bana inanılmaz bir hile gibi geldi
AoC'yi seviyorum
Yapay zeka botu mu çözüyor, başkası daha erken mi kalkıyor diye umursamadan, sırf kendi eğlenceniz için çözebilirsiniz
İster meydan okumanın kendisi hoşunuza gitsin, ister yeni bir dili denemek isteyin, fark etmez
Ben işte yaptıklarımdan farklı olsun diye, mümkün olduğunca Kotlin fonksiyonel tarzda çözmeyi seviyorum
Bugünkü çözümümü de yükledim. Yardımcı araçlar kullandığım için saf Kotlin değil ama güzel fonksiyonları bir araya getirip bir tür kütüphane oluşturmak da eğlencenin parçası
https://github.com/Matsemann/algorithm-problems/blob/main/ad...
Son birkaç yıl Python NumPy kullanmıştım; bu yıl Kotlin kullanıyorum ve ilk gün probleminde en çok transpose fonksiyonunu özledim
Benim kodum burada: https://github.com/charelF/AdventOfCode/blob/main/kt/src/y20...