Önyükleme
Botu hedef kareye götür. Bot sağa bakarak başlıyor; bot.move() onu baktığı yöne bir kare ilerletir.
Her sektör bir kavram. Kodunu yaz, çalıştır, geri sar ve satır satır ne olduğunu gör. Ezber çözümler gizli testlerde yakalanır.
0/51 sektör
Botu hedef kareye götür. Bot sağa bakarak başlıyor; bot.move() onu baktığı yöne bir kare ilerletir.
Kıvrılan koridorun sonundaki hedefe ulaş. bot.turn_left() ve bot.turn_right() botu yerinde 90° döndürür; dönmek de bir adım sayılır.
Hedefe ulaş. Koridorun sonunda yol ya yukarı ya aşağı dönüyor ve yön her testte değişiyor. radar.front_blocked() önünde duvar varsa True döndürür.
Kapıyı doğru kodla aç ve hedefe ulaş. radar.read() kapının sensöründeki sayıyı (int) okur. Sayı 30'dan küçükse "LOW", 70'ten küçükse "MID", değilse "HIGH" kodunu bot.send(...) ile gönder. Yanlış kod alarmı tetikler.
Koridorda arka arkaya iki güvenlik kapısı var ve her birinin sensörü farklı bir sayı gösteriyor. Aynı kontrolü iki kez yazmak yerine bir fonksiyon yaz ve iki kapıda da çağır. Kurallar aynı: 30'dan küçükse "LOW", 70'ten küçükse "MID", değilse "HIGH".
Uzun koridorun sonundaki hedefe ulaş. Kodun en fazla 8 satır olabilir. for i in range(n): bloğunun içindeki satırlar n kez tekrarlanır.
Hedefe ulaş. Hedef her testte farklı bir yerde, bu yüzden kaç adım atacağını bilemezsin. bot.at_target() hedefte olup olmadığını söyler; while döngüsü koşul doğru olduğu sürece tekrarlar.
Her testte yeni üretilen labirentten çık ve hedefe ulaş. Yeni sensörler: radar.left_blocked() ve radar.right_blocked() sol ve sağ taraf duvarsa True döndürür.
Drone'lara çarpmadan hedefe ulaş. Drone'lar koridoru dikine kesiyor. radar.danger_ahead() bir adım atarsan drone'a çarpıp çarpmayacağını söyler; bot.wait() bir tur bekler. Enerji sınırlı: ilerlemek 1, beklemek 0.5 enerji harcar.
Lazerlere yakalanmadan hedefe ulaş. Koridorda üç lazer farklı ritimlerle yanıp sönüyor; ışın açıkken hücreye giren ya da ışın açıldığında içinde duran bot yanar. radar.danger_ahead() bir adım atarsan tehlikeye girip girmeyeceğini söyler, bot.wait() bir tur bekler.
Koridor içe doğru kıvrılan bir sarmal ve hedef en içte. Kaç adım atacağını sayma: önün açıksa ilerle, kapalıysa dön. Sarmalın yönü her testte değişiyor; hangi yana döneceğini radar.left_blocked() söyler.
Koridor köşeden aşağı dönüyor ve iki drone yolu kesiyor: biri düz kısımda, biri dönemeçten sonra. Üç şeyi birlikte yönet: önün kapalıysa dön, tehlike varsa bekle, yoksa ilerle.
Listedeki en büyük değeri döndür. Artık botu yürütmüyorsun: solve(values) bir liste alır ve cevabı döndürür.
values içinde key değerinin indeksini döndür. Değerler birbirinden farklı ve karışık sırada; gizli testlerde liste 800 elemana kadar büyür.
values küçükten büyüğe sıralı ve değerler farklı. key'in indeksini döndür. Okuma bütçen en fazla ⌊log₂ n⌋ + 2: n = 4096 için yalnızca 14 okuma.
Paketlerdeki parantezler dengeliyse True, değilse False döndür: her açılan parantez doğru türle ve doğru sırayla kapanmalı. packets bir iterator: for ch in packets: ile sırayla gezilir, geri dönülemez.
Başlangıçtan hedefe en kısa rotayı döndür. Labirentte döngüler var ve enerjin yalnızca en kısa yola yetiyor. Rota N/E/S/W harflerinden oluşan bir metin, ör. "EESSW"; bot döndürdüğün rotayı yürür.
Yeni kural: sahada veri çipi varken hedef sayılmaz. Çipin üstüne gelince bot onu alır. Çip hedefin ilerisinde ve yeri her testte değişiyor. bot.chips_left() toplanmamış çip sayısını verir.
Ana koridorun ortasında bir kavşak var; çip güneydeki kolda, ama kaç adım içeride olduğu her testte değişiyor. Kolun kuzeyi de açık, o yüzden geri dönerken "duvara kadar yürü" işe yaramaz. İçeri girerken attığın adımları bir sayaçta tut, dönüşte tam o kadar adım at.
Koridorun üst duvarında nişler var; bazılarında çip duruyor, hangilerinde olduğu her testte değişiyor. Her karede sola dönüp bak: radar.scan() önündeki şeyi söyler ve çip görürse "chip" döndürür. Çip varsa gir, al, geri çık.
Çipler odanın içine saçılmış ve yerleri her testte farklı. Hiçbirini kaçırmamanın yolu odayı baştan sona taramak: bir satırı yürü, duvara gelince bir alt satıra in ve ters yöne yürü.
İki drone koridoru kesiyor, çiplerden biri hedefin ilerisinde. Hem gidişte hem dönüşte aynı dikkat gerekiyor: "tehlike varsa bekle, yoksa ilerle" kuralını bir fonksiyona koy ve iki döngüde de kullan.
Enerjin odayı baştan sona taramaya yetmiyor. radar.map() haritayı satır satır verir: "#" duvar, "C" çip, "T" hedef; grid[y][x] ile okunur. Çiplerin yerini haritadan bul ve doğrudan onlara git. bot.position() botun (x, y) konumunu, bot.face("E") baktığı yönü ayarlar ("N", "E", "S", "W").
Aynı oda, daha az enerji. Çipleri haritadaki sırayla toplamak artık yetmiyor: her seferinde en yakındaki çipe git. İki hücre arasındaki uzaklık abs(x1 - x2) + abs(y1 - y2).
Koridorun iki yanında on niş var, çipler bunların üçünde ve yerleri her testte değişiyor. Bataryan yalnızca dolu nişlere girip çıkmaya yetiyor: boş bir nişe girersen hedefe varamazsın. Bu kez önüne bakamazsın; radar.map() haritasında çipler "C" olarak yazılı. Her karede üstündeki ve altındaki hücreyi haritadan oku.
Çipler bir labirentin içine dağılmış ve enerjin sınırlı. Kuş uçuşu en yakın çip artık en yakın değil: araya duvar girebilir. Her seferinde yürüyerek en yakın çipi bul (BFS), ona git, sonra hedefe yürü.
Hedefin önünde kilitli bir kapı var; anahtar ise arkanda, koridorun başka bir yerinde. Anahtarın üstüne gelince bot onu alır ve o renkteki kapılar açılır. bot.has_key("red") kırmızı anahtar sende mi diye söyler. Anahtarın yeri her testte değişiyor.
Hedefe iki yoldan gidilir: soldaki kapı kırmızı, sağdaki mavi. Önündeki anahtar bunlardan yalnızca birini açar ve rengi her testte değişiyor. Anahtarı al, rengine bak, yolunu ona göre seç.
İki oda arasında kapı yok, yalnızca bir ışınlayıcı çifti var: birine adım atan bot diğerinde belirir. Çıkış noktası her testte değişiyor, o yüzden vardığında hedefin hangi yanda kaldığını bulman gerek. radar.scan() ışınlayıcıyı "portal" olarak görür; radar.map() satırında hedef "T" olarak yazılıdır.
Anahtar arkanda, kapı önünde ve iki drone koridoru kesiyor. Anahtara giderken de dönerken de çarpışmadan geçmelisin.
Oda bir duvarla ikiye bölünmüş; duvardaki tek geçit kilitli bir kapı. Anahtarın yeri ve rengi her testte değişiyor. radar.map() haritasında anahtarlar küçük harfle ("r", "b", "g"), kapalı kapılar büyük harfle ("R", "B", "G") yazılır. Anahtarı bul, al, kapıdan geç, hedefe yürü.
Üç oda, aralarında duvar; odaları yalnızca ışınlayıcılar bağlıyor. Haritada bir çiftin iki ucu aynı rakamla yazılır ("1", "2"). Hedefe varana kadar, bulunduğun odadaki henüz kullanmadığın ışınlayıcıya yürü. Işınlayıcıların yeri her testte değişiyor.
Kapının anahtarı duvarın öbür yanındaki kapalı odada; oraya yalnızca ışınlayıcıyla girilir ve çıkış da aynı ışınlayıcıdan. Işınlayıcının iki ucu, anahtarın yeri ve rengi her testte değişiyor. Vardığın kareyi aklında tut: anahtarı alınca aynı kareye geri yürü, ışınlayıcı seni koridora geri bırakır. Haritada ışınlayıcı "1", anahtar küçük harf ("r", "b", "g").
Üç oda, iki kilitli kapı. Her kapının anahtarı o kapıdan önceki odada; renkler ve yerler her testte değişiyor, bazen hiçbir kapıya uymayan fazladan bir anahtar da var. Kapıları batıdan doğuya sırayla aç: sıradaki kapının rengine bak, o renkteki anahtarı bul, al, kapıdan geç. Haritada kapalı kapı büyük harf, anahtarı aynı harfin küçüğü.
Üç oda, iki kilitli kapı; anahtarlar, kapı renkleri ve bazen bir ışınlayıcı her testte başka yerde. Bir kapı ancak anahtarı aldıktan sonra geçilir, yani "neredeyim" yetmez: "neredeyim ve elimde hangi anahtarlar var" birlikte bir durumdur. BFS'i bu durumlar üzerinde çalıştır.
Çip koridorun doğu ucunda, hedef ise arkanda. Çipi al, olduğun yerde geri dön ve hedefe yürü. Geri dönmek için ayrı bir komut yok: aynı yöne iki kez dönmek yeter.
Beş basamaklı bir merdiven: her basamak aynı dört komut. Komutları beş kez yazmak satır sınırını aşar; deseni bir kez yaz, döngü tekrarlasın.
Rota sana hazır verildi: "EEENNEEESSSEENNNEE". Her harf bir adımın yönü. Dönüş komutların yok; bot.face("N") yüzünü doğrudan o yöne çevirir. Metnin harflerini sırayla dolaş ve her biri için yüzünü çevirip bir adım at.
Hedefin kaç adım ötede olduğu her testte değişiyor ve bu kez bot.at_target() yok. Elinde yalnızca radar.scan() var: önündeki hücrede ne olduğunu söyler ("empty", "wall", "target"). Hedefi gördüğün an durursan bir adım eksik kalırsın.
Kapının sensörü hep sınırın dibinde okuyor: 49 ya da 50. Kural: okunan değer 50'den küçükse "COLD", 50 ya da daha büyükse "HOT" gönder. < ile <= arasındaki fark tam burada ortaya çıkar.
Hedef hemen arkanda, ama üç köşedeki çipleri almadan bölüm bitmez: binanın çevresini dolaşman gerek. Döngünün içinde döngü kur: içteki duvara kadar yürüsün, dıştaki her duvarda sağa dönüp yeniden başlatsın.
İçe doğru kıvrılan bir koridor: kenarlar 5, 4, 3, 2 ve 1 adım, her birinin sonunda sağa dönüş. Sensörün yok. Döngü değişkeninin kendisini adım sayısı olarak kullan: range geriye doğru da sayabilir.
Koridorda art arda kapılar var. Her kapıda kural aynı: sensör 50'den küçükse "LOW", değilse "HIGH". Önünde kapı yokken radar.read() bir sayı değil None döner; onu sayıyla karşılaştırmak hata verir. Hedefe kadar tek bir döngü yaz.
Koridordan kuzeye üç çıkmaz ayrılıyor: derinlikleri sırayla 2, 4 ve 3 hücre, her birinin dibinde bir çip. Çıkmazlar arasında üçer adım var. Sensörün yok ve satır sınırı dar: derinliği parametre alan bir fonksiyon yaz ve onu bir listenin her elemanı için çağır.
Rota bu kez sıkıştırılmış geldi: "3E2N3E3S2E3N2E". Çiftler hâlinde oku: önce adım sayısı, sonra yön (3E = doğuya üç adım). İkişer ikişer ilerleyen bir indeksle metni gez; rakamı int(...) ile sayıya çevir.
Bu kapıların beş kodu var: 0–19 ALFA, 20–39 BRAVO, 40–59 CHARLIE, 60–79 DELTA, 80–99 ECHO. Beş dallı bir if zinciri satır sınırına sığmaz. Kodları bir listeye koy ve doğru sırayı hesapla: her aralık 20 geniş.
Radarın bozuk: duvarı önceden göremezsin. Çarpmak artık ölümcül değil ama her çarpma 10 can götürür (100 canın var). Duvarı sonucundan anla: bot.move()'dan önce ve sonra bot.position() aynıysa yerinden kıpırdamamışsın demektir. Köşelerde hangi yana döneceğin testten teste değişir.
Enerjin 32 birim: her adım 1, her radar.front_blocked() sorusu 2 birim harcar. Yol beş koridordan oluşuyor ve hepsi aynı uzunlukta; köşelerde sırayla sola, sağa, sola, sağa dönülüyor. Her adımda radara sorarsan enerjin yetmez: bir kez ölç, sonucu bir değişkende sakla ve yeniden kullan.
Haritan yok, labirent her testte değişiyor ve içinde halkalar var: duvarı izlemek seni aynı adanın çevresinde döndürebilir. Elindekiler bot.position(), bot.face(...), bot.move() ve radar.front_blocked(). Gittiğin hücreleri bir kümede tut; her hücreden dört yönü dene, görmediğin yere gir, çıkmazsa geldiğin adımı geri al.
Boş bir salon, birkaç çip ve tam 18 adımlık enerji. "Hep en yakın çipe git" kuralı burada enerjiyi bitiriyor: yakındaki çip seni hedeften uzaklaştırıp geri getiriyor. Çip sayısı az: bütün sıralamaları dene, her birinin toplam yolunu hesapla ve en kısasını yürü.
İki oda arasında kapı yok: karşıya yalnızca ışınlanma pedleriyle geçilir. Haritada aynı rakamı taşıyan iki ped birbirine bağlıdır; birine basan diğerinde belirir. Enerjin en kısa yola ancak yetiyor ve en yakın ped her zaman doğru ped değil. Pedleri de birer kenar sayan bir BFS yaz: bir pede adım atmak seni eşinin üstüne koyar.