fix(liste): kayıtlı manuel liste tabanları yeni veri yılına tazelenir; yıl metinleri 2021–2026
All checks were successful
Deploy / deploy (push) Successful in 7m24s

Denetim bulgusu (2026-09-21): ManuelTercih.efektifSira ekleme anının
snapshot'ıydı; 2026 verisi yüklenince /listem 2025 tabanıyla renk verirken
/sonuc tablosu 2026 gösteriyordu ve hiçbir yol yenilemiyordu.

- db.ts: efektifSiralarGetir(ids) — güncel COALESCE(sira2026, sira2025).
- liste-actions: listeTabanlariniTazele (oturumsuz, ≤24 id); sunucu kaydı
  (listeSenkronla/listeyiKaydet) tazelenmiş yazılır.
- liste-store: tabanlariGuncelle — efektif sıra + profil varsa risk yenilenir,
  arşivlenmiş program eski değerini korur, değişiklik yoksa yayın yok.
- liste-senkron: girişli/girişsiz herkes için sekme oturumu başına bir kez
  (anahtar SON_YIL taşır).
- meraklisina-icerik: "son beş yılın" → VERI_YIL_SAYISI.
- rehber (4 yazı): katalog sayfalarını anlatan "2021–2025 / son 5 yıl"
  ifadeleri 2021–2026 / son yıllar; yazıların kendi örnek tabloları
  2021–2025 olarak etiketli kaldı.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 18:59:05 +03:00
parent d275e4d29c
commit 49683fa113
9 changed files with 157 additions and 32 deletions

View File

@@ -1,19 +1,20 @@
--- ---
baslik: Hedef Sıralama Nasıl Belirlenir? Hedef Bölümden Geriye Doğru Yöntem baslik: Hedef Sıralama Nasıl Belirlenir? Hedef Bölümden Geriye Doğru Yöntem
aciklama: İstediğin bölüm için kaçıncı olman gerektiğini son 5 yılın taban sıralamalarından çıkar — trendi oku, deneme sıralamanla kıyasla, hedef bandını koy. Tek şemada. aciklama: İstediğin bölüm için kaçıncı olman gerektiğini son yılların taban sıralamalarından çıkar — trendi oku, deneme sıralamanla kıyasla, hedef bandını koy. Tek şemada.
tarih: 2026-09-21 tarih: 2026-09-21
guncelleme: 2026-09-21
--- ---
Hedef sıralama, istediğin programın **son yıllardaki taban başarı sıralamasından geriye doğru** belirlenir: programın son 5 yıllık tabanlarına bakarsın, trendin yönünü okursun, en güncel tabanı referans alırsın ve deneme sıralamanı bu referansla kıyaslarsın. Hedef net sabit bir sayı değildir; sınavın zorluğu her yıl değiştiği için aynı sıralamaya her yıl farklı netlerle gelinir. Doğru sıra şu: önce bölüm, sonra sıralama, en son net. Hedef sıralama, istediğin programın **son yıllardaki taban başarı sıralamasından geriye doğru** belirlenir: programın son yıllardaki tabanlarına bakarsın, trendin yönünü okursun, en güncel tabanı referans alırsın ve deneme sıralamanı bu referansla kıyaslarsın. Hedef net sabit bir sayı değildir; sınavın zorluğu her yıl değiştiği için aynı sıralamaya her yıl farklı netlerle gelinir. Doğru sıra şu: önce bölüm, sonra sıralama, en son net.
Bu yazıdaki bütün rakamlar 2021-2025 yerleştirmelerine ait YÖK Atlas verisidir. 2026 yerleştirme verisi kataloğumuza yüklendiğinde tablolar güncellenecek; yöntem aynı kalır. Bu yazıdaki örnek tablolar 2021-2025 yerleştirmelerine ait YÖK Atlas verisidir; kataloğumuz 21 Eylül 2026'dan beri 2026 yerleştirme verisini de gösterir. Yöntem aynı kalır, güncel rakamı bölüm sayfasından okursun.
```mermaid ```mermaid
%% aria: Hedef sıralama belirleme şeması: önce hedef bölümünü ve o bölümde üç ila beş üniversiteyi seçersin. Sonra her programın son beş yıllık taban başarı sıralamasına bakarsın. Tabanlar dar bir bantta duruyorsa son yılın tabanı güvenilir referanstır. Her yıl sıkılaşıyorsa tabanın bu yıl daha da küçülebileceğini hesaba katıp hedefini daha iyi bir sıralamaya çekersin. Bir sıkı bir gevşek gidiyorsa ya da son yıllarda gevşediyse en sıkı yılı da aklında tutarsın. Ardından deneme sıralamanı referans tabanla kıyaslarsın. Taban senin sıralamandan küçükse program hayal dilimindedir ve satır etiketi risklidir. Taban, sıralaman ile sıralamanın 1,4 katı arasındaysa dengeli dilimdedir ve etiketi az risklidir. Taban, sıralamanın 1,4 katından büyükse güvenli dilimdedir. Sonunda hedef bandını yazarsın: bandın alt ucu tabanın kendisi, üst ucu tabanın 1,4'e bölünmüş hâlidir. Bu etiketler yerleşme olasılığı değil, geçmiş tabana göre konumundur. %% aria: Hedef sıralama belirleme şeması: önce hedef bölümünü ve o bölümde üç ila beş üniversiteyi seçersin. Sonra her programın son yıllardaki taban başarı sıralamasına bakarsın. Tabanlar dar bir bantta duruyorsa son yılın tabanı güvenilir referanstır. Her yıl sıkılaşıyorsa tabanın bu yıl daha da küçülebileceğini hesaba katıp hedefini daha iyi bir sıralamaya çekersin. Bir sıkı bir gevşek gidiyorsa ya da son yıllarda gevşediyse en sıkı yılı da aklında tutarsın. Ardından deneme sıralamanı referans tabanla kıyaslarsın. Taban senin sıralamandan küçükse program hayal dilimindedir ve satır etiketi risklidir. Taban, sıralaman ile sıralamanın 1,4 katı arasındaysa dengeli dilimdedir ve etiketi az risklidir. Taban, sıralamanın 1,4 katından büyükse güvenli dilimdedir. Sonunda hedef bandını yazarsın: bandın alt ucu tabanın kendisi, üst ucu tabanın 1,4'e bölünmüş hâlidir. Bu etiketler yerleşme olasılığı değil, geçmiş tabana göre konumundur.
%% altyazi: Önce bölüm, sonra son 5 yılın tabanı, sonra trend, en son deneme sıralamanla kıyas — hedef bandın böyle çıkar. %% altyazi: Önce bölüm, sonra son yılların tabanı, sonra trend, en son deneme sıralamanla kıyas — hedef bandın böyle çıkar.
flowchart TD flowchart TD
H("Hedef bölümünü ve<br/>3-5 üniversiteyi seç") --> T("Her programın son 5 yıllık<br/>taban sıralamasına bak") H("Hedef bölümünü ve<br/>3-5 üniversiteyi seç") --> T("Her programın son yıllardaki<br/>taban sıralamasına bak")
T --> F{"Beş yılın filmi<br/>ne diyor?"} T --> F{"Yılların filmi<br/>ne diyor?"}
F -- "dar bantta duruyor" --> I("İstikrarlı:<br/>son yılın tabanı referans") F -- "dar bantta duruyor" --> I("İstikrarlı:<br/>son yılın tabanı referans")
F -- "her yıl sıkılaşıyor" --> S("Sıkılaşıyor:<br/>hedefini daha iyi sıraya çek") F -- "her yıl sıkılaşıyor" --> S("Sıkılaşıyor:<br/>hedefini daha iyi sıraya çek")
F -- "bir sıkı bir gevşek" --> Z("Dalgalı:<br/>en sıkı yılı da aklında tut") F -- "bir sıkı bir gevşek" --> Z("Dalgalı:<br/>en sıkı yılı da aklında tut")
@@ -72,11 +73,11 @@ Bu tablodan üç ders çıkar:
- **Kontenjan tabanı sıçratır.** Ankara Hukuk'un kontenjanı 2024'te 500'dü, 2025'te 200'e indi; taban aynı yıl 3.227'den 2.233'e sıkılaştı. Hedef koyarken kontenjanın değişip değişmediğine de bak; kataloğumuz güncel kontenjanı gösterir, önceki yılları YÖK Atlas'tan kıyaslayabilirsin. - **Kontenjan tabanı sıçratır.** Ankara Hukuk'un kontenjanı 2024'te 500'dü, 2025'te 200'e indi; taban aynı yıl 3.227'den 2.233'e sıkılaştı. Hedef koyarken kontenjanın değişip değişmediğine de bak; kataloğumuz güncel kontenjanı gösterir, önceki yılları YÖK Atlas'tan kıyaslayabilirsin.
- **Sıkılaşan programda geçen yılın tabanı hedef değil, en fazla başlangıç çizgisidir.** Erciyes Makine Mühendisliği'ne 2021'de 230 bin civarı sıralamayla girilirken 2025'te taban 154.725. - **Sıkılaşan programda geçen yılın tabanı hedef değil, en fazla başlangıç çizgisidir.** Erciyes Makine Mühendisliği'ne 2021'de 230 bin civarı sıralamayla girilirken 2025'te taban 154.725.
Tabanları neyin oynattığını ve film okuma kalıplarını ayrıntısıyla [Taban sıralamalar yıldan yıla ne kadar değişir?](/rehber/taban-siralamalar-nasil-degisir) yazısında bulursun. Kendi hedef bölümünün tablosu için [bölümler](/bolumler) sayfasından bölümünü aç; her program satırında son 5 yılın taban sıralaması ve güncel kontenjan durur, satırdaki netler butonu da yerleşen son kişinin netlerini gösterir. Tabanları neyin oynattığını ve film okuma kalıplarını ayrıntısıyla [Taban sıralamalar yıldan yıla ne kadar değişir?](/rehber/taban-siralamalar-nasil-degisir) yazısında bulursun. Kendi hedef bölümünün tablosu için [bölümler](/bolumler) sayfasından bölümünü aç; her program satırında son 6 yılın (2021–2026) taban sıralaması ve güncel kontenjan durur, satırdaki netler butonu da yerleşen son kişinin netlerini gösterir.
## Hedef bandını nasıl koyarsın? ## Hedef bandını nasıl koyarsın?
Burada uydurma bir formül yerine KolayTercih'in listeleri dilimlerken kullandığı kuralın aynısını kullanabilirsin. Kural tek bir kıyasa dayanır: programın en güncel taban sıralaması (2025, o yıl veri yoksa 2024) ile senin sıralaman. Burada uydurma bir formül yerine KolayTercih'in listeleri dilimlerken kullandığı kuralın aynısını kullanabilirsin. Kural tek bir kıyasa dayanır: programın en güncel taban sıralaması (2026, o yıl veri yoksa 2025) ile senin sıralaman. Aşağıdaki örnekler yazının 2025 tabanlarıyla hesaplandı; kendi hedefin için bölüm sayfasındaki güncel tabanı kullan.
- Taban **senin sıralamandan küçükse** (program senden daha iyi bir dereceyle kapatmış) program **hayal** dilimindedir; satır etiketi "Riskli". - Taban **senin sıralamandan küçükse** (program senden daha iyi bir dereceyle kapatmış) program **hayal** dilimindedir; satır etiketi "Riskli".
- Taban, **sıralaman ile sıralamanın 1,4 katı arasındaysa** **dengeli** dilimdedir; etiketi "Az riskli". - Taban, **sıralaman ile sıralamanın 1,4 katı arasındaysa** **dengeli** dilimdedir; etiketi "Az riskli".
@@ -110,7 +111,7 @@ Elle hesaplamak istemezsen deneme sıralamanı [tercih robotuna](/tercih-robotu)
## Sık sorulan sorular ## Sık sorulan sorular
**Hedef sıralama için kaç yılın tabanına bakmalıyım?** **Hedef sıralama için kaç yılın tabanına bakmalıyım?**
En az 3-4, mümkünse 5 yıl. Tek yıl, dalgalı bir programın tepesine ya da dibine denk gelebilir. Bölüm sayfalarımızda 2021-2025 arasındaki beş yılın taban sıralaması yan yana durur. En az 3-4, mümkünse 5 yıl. Tek yıl, dalgalı bir programın tepesine ya da dibine denk gelebilir. Bölüm sayfalarımızda 2021-2026 arasındaki altı yılın taban sıralaması yan yana durur.
**Hedef bandıma girersem yerleşmem kesin mi?** **Hedef bandıma girersem yerleşmem kesin mi?**
Hayır. Bant ve dilim etiketleri geçmiş yılların tabanına göre konumunu gösterir; olasılık ya da söz değildir. Tabanlar yıldan yıla oynar, o yüzden tek hedef yerine bir bant ve birden fazla üniversite önerdik. Hayır. Bant ve dilim etiketleri geçmiş yılların tabanına göre konumunu gösterir; olasılık ya da söz değildir. Tabanlar yıldan yıla oynar, o yüzden tek hedef yerine bir bant ve birden fazla üniversite önerdik.
@@ -126,5 +127,5 @@ Evet. Bazı programlara tercih yazabilmek için tabandan bağımsız bir başar
## Kaynaklar ## Kaynaklar
- YÖK Atlas, yokatlas.yok.gov.tr — 2021-2025 yerleştirmelerine ait taban başarı sıralaması, kontenjan ve yerleşen son kişinin netleri. Rakamlar KolayTercih kataloğundaki veriden alınmıştır (katalog veri güncellemesi: 9 Ağustos 2026). - YÖK Atlas, yokatlas.yok.gov.tr — 2021-2025 yerleştirmelerine ait taban başarı sıralaması, kontenjan ve yerleşen son kişinin netleri. Rakamlar KolayTercih kataloğundaki veriden alınmıştır (yazıdaki örnekler 2021-2025 yerleştirmeleri; katalog 21 Eylül 2026'da 2026 verisiyle güncellendi).
- Dilim kuralı (1,4 katı eşiği): KolayTercih'in kendi listeleme kuralıdır; dilimlerin işleyişi [Meraklısına](/meraklisina) sayfasında gösterilir. - Dilim kuralı (1,4 katı eşiği): KolayTercih'in kendi listeleme kuralıdır; dilimlerin işleyişi [Meraklısına](/meraklisina) sayfasında gösterilir.

View File

@@ -78,13 +78,13 @@ Kayıt dondurma ise ülke çapında tek bir kurala bağlı değil; her üniversi
## Karar verirken kendine ne sormalısın? ## Karar verirken kendine ne sormalısın?
1. **"Seneye de olmazsa bu bölümde okur muyum?"** Cevabın evetse kayıtlı kalmanın sana bıraktığı şey büyük. Cevabın "asla" ise kaydın sana kazandırdığı pek bir şey yok. 1. **"Seneye de olmazsa bu bölümde okur muyum?"** Cevabın evetse kayıtlı kalmanın sana bıraktığı şey büyük. Cevabın "asla" ise kaydın sana kazandırdığı pek bir şey yok.
2. **Hedefinle aran ne kadar?** Tek yıla değil, hedef programın son 5 yıllık taban sıralamasına bak: [bölüm sayfalarında](/bolumler) hepsi var, yöntemi [hedef sıralama nasıl belirlenir](/rehber/hedef-siralama-nasil-belirlenir) yazısında. Tabanlar da yerinde durmuyor: [tabanlar nasıl değişir](/rehber/taban-siralamalar-nasil-degisir). 2. **Hedefinle aran ne kadar?** Tek yıla değil, hedef programın son yıllardaki taban sıralamasına bak: [bölüm sayfalarında](/bolumler) hepsi var, yöntemi [hedef sıralama nasıl belirlenir](/rehber/hedef-siralama-nasil-belirlenir) yazısında. Tabanlar da yerinde durmuyor: [tabanlar nasıl değişir](/rehber/taban-siralamalar-nasil-degisir).
3. **Bu yıl neyi farklı yapacaksın?** İkinci yılın daha iyi geçeceğinin bir güvencesi yok. Planını, bu soruya somut bir cevap verebiliyorsan kur. 3. **Bu yıl neyi farklı yapacaksın?** İkinci yılın daha iyi geçeceğinin bir güvencesi yok. Planını, bu soruya somut bir cevap verebiliyorsan kur.
4. **Bir yılın masrafı ne?** Vakıf ücreti, başka şehirde yaşam, kurs ya da yayın gideri — hangi seçenekte hangisi var, alt alta yaz. Kalemler için [yurt, burs ve yıllık maliyet](/rehber/yurt-burs-ve-yillik-maliyet) yazısı işini görür. 4. **Bir yılın masrafı ne?** Vakıf ücreti, başka şehirde yaşam, kurs ya da yayın gideri — hangi seçenekte hangisi var, alt alta yaz. Kalemler için [yurt, burs ve yıllık maliyet](/rehber/yurt-burs-ve-yillik-maliyet) yazısı işini görür.
## 2027'de liste zamanı gelince ## 2027'de liste zamanı gelince
Hangi yolu seçersen seç, 2027'de sıralaman belli olduğunda iş yine 24 satırlık listeye gelecek. Bu yılın dersi belli: yerleşsen bile gitmeyeceğin programı listeye yazma ve [ölü tercihleri](/rehber/olu-tercih-nedir) temizle. O gün sıralamanı [tercih robotuna](/tercih-robotu) girip hangi programların son 5 yılın verisine göre hayal, dengeli ya da güvenli (halk arasında "garanti tercih") aralıkta kaldığını tek ekranda görebilirsin. Hangi yolu seçersen seç, 2027'de sıralaman belli olduğunda iş yine 24 satırlık listeye gelecek. Bu yılın dersi belli: yerleşsen bile gitmeyeceğin programı listeye yazma ve [ölü tercihleri](/rehber/olu-tercih-nedir) temizle. O gün sıralamanı [tercih robotuna](/tercih-robotu) girip hangi programların son yılların verisine göre hayal, dengeli ya da güvenli (halk arasında "garanti tercih") aralıkta kaldığını tek ekranda görebilirsin.
## Sık sorulan sorular ## Sık sorulan sorular

View File

@@ -10,11 +10,11 @@ Tercih listeni geçen yılın tabanlarıyla kuruyorsun ama yerleşmeni **bu yıl
## Tabanı oynatan mekanizmalar ## Tabanı oynatan mekanizmalar
```mermaid ```mermaid
%% aria: Taban trendi okuma şeması: tek yılın tabanı fotoğraftır, beş yılın (2021–2025) tabanı filmdir. Beş yıl üst üste dar banttaysa istikrarlı referanstır. Her yıl sıkılaşıyorsa geçen yılın tabanına güvenme ve pay bırak. Bir sıkı bir gevşek testere dişi sürü etkisidir, ortalamayı al. Bazı yıllar veri boşsa belirsizlik yüksektir; o programı dengeli değil hayal bölgesine koy. %% aria: Taban trendi okuma şeması: tek yılın tabanı fotoğraftır, altı yılın (2021–2026) tabanı filmdir. Yıllar üst üste dar banttaysa istikrarlı referanstır. Her yıl sıkılaşıyorsa geçen yılın tabanına güvenme ve pay bırak. Bir sıkı bir gevşek testere dişi sürü etkisidir, ortalamayı al. Bazı yıllar veri boşsa belirsizlik yüksektir; o programı dengeli değil hayal bölgesine koy.
%% altyazi: Tek yıla bakan, testere dişinin tepesinden ya da dibinden ölçüm alır — en az 3-4 yıla bak. %% altyazi: Tek yıla bakan, testere dişinin tepesinden ya da dibinden ölçüm alır — en az 3-4 yıla bak.
flowchart TD flowchart TD
F("Tek yılın tabanı = fotoğraf<br/>5 yılın tabanı = film") --> T{"Film ne diyor?"} F("Tek yılın tabanı = fotoğraf<br/>6 yılın tabanı = film") --> T{"Film ne diyor?"}
T -- "5 yıl dar bantta" --> I("İstikrarlı:<br/>güvenilir referans") T -- "6 yıl dar bantta" --> I("İstikrarlı:<br/>güvenilir referans")
T -- "her yıl sıkılaşıyor" --> S("Tek yönlü trend:<br/>pay bırak, geçen yıla güvenme") T -- "her yıl sıkılaşıyor" --> S("Tek yönlü trend:<br/>pay bırak, geçen yıla güvenme")
T -- "bir sıkı bir gevşek" --> TE("Testere dişi:<br/>ortalamayı al, uca değil") T -- "bir sıkı bir gevşek" --> TE("Testere dişi:<br/>ortalamayı al, uca değil")
T -- "bazı yıllar veri yok" --> B("Belirsiz:<br/>dengeli değil, hayal bölgesine koy") T -- "bazı yıllar veri yok" --> B("Belirsiz:<br/>dengeli değil, hayal bölgesine koy")
@@ -39,20 +39,20 @@ flowchart TD
## Trend nasıl okunur? ## Trend nasıl okunur?
Tek yılın tabanı **fotoğraf**, 5 yılın (2021–2025) tabanı **film**dir. Film izle: Tek yılın tabanı **fotoğraf**, 6 yılın (2021–2026) tabanı **film**dir. Film izle:
- **İstikrarlı taban** (5 yıl üst üste dar bantta): güvenilir referans. Sıralaman tabana yakınsa "dengeli", belirgin gerisindeyse "güvenli" (halk arasında "garanti tercih") davranabilirsin. - **İstikrarlı taban** (6 yıl üst üste dar bantta): güvenilir referans. Sıralaman tabana yakınsa "dengeli", belirgin gerisindeyse "güvenli" (halk arasında "garanti tercih") davranabilirsin.
- **Tek yönlü trend** (her yıl sıkılaşıyor): geçen yılın tabanına güvenme; bu yıl daha da sıkılaşacağını varsayıp payla yaklaş. Popüler bölümlerde sık görülür — [Psikoloji](/bolum/psikoloji) ve [Bilgisayar Mühendisliği](/bolum/bilgisayar-muhendisligi) tablolarında 2024-2025 kolonlarını yan yana koyup bak. - **Tek yönlü trend** (her yıl sıkılaşıyor): geçen yılın tabanına güvenme; bu yıl daha da sıkılaşacağını varsayıp payla yaklaş. Popüler bölümlerde sık görülür — [Psikoloji](/bolum/psikoloji) ve [Bilgisayar Mühendisliği](/bolum/bilgisayar-muhendisligi) tablolarında 2025-2026 kolonlarını yan yana koyup bak.
- **Testere dişi** (bir sıkı bir gevşek): sürü etkisi işliyor demektir; ortalamayı referans al, uç yıla değil. - **Testere dişi** (bir sıkı bir gevşek): sürü etkisi işliyor demektir; ortalamayı referans al, uç yıla değil.
- **Veri boşluğu** (bazı yıllar "—"): yeni ya da o yıl dolmamış program; belirsizlik yüksek, listende dengeli değil güvenli bölgeye koyma, hayal bölgesine koy. - **Veri boşluğu** (bazı yıllar "—"): yeni ya da o yıl dolmamış program; belirsizlik yüksek, listende dengeli değil güvenli bölgeye koyma, hayal bölgesine koy.
Bölüm sayfalarımızdaki tablolarda 2025 sıralamasının yanında 2024 kolonu ve değişim yönü işareti (▲/▼) tam bu iş için var. Bölüm sayfalarımızdaki tablolarda 2026 sıralamasının yanında 2025 kolonu ve değişim yönü işareti (▲/▼) tam bu iş için var.
## Listeye nasıl yansıtılır? ## Listeye nasıl yansıtılır?
1. Her satır için son 5 yılın (2021–2025) tabanına bak; tek yıl asla yeterli değil. 1. Her satır için son 6 yılın (2021–2026) tabanına bak; tek yıl asla yeterli değil.
2. Sıkılaşma trendindeki programları bir kademe yukarı say ("dengeli" sandığın aslında "hayal" olabilir). 2. Sıkılaşma trendindeki programları bir kademe yukarı say ("dengeli" sandığın aslında "hayal" olabilir).
3. Gevşeme trendindeki programlara erken sevinme; sürü geri dönebilir. 3. Gevşeme trendindeki programlara erken sevinme; sürü geri dönebilir.
4. Belirsizliği [dengeli bir listeyle](/rehber/tercih-listesi-nasil-yapilir) yönet: trend ne yaparsa yapsın, hayal/dengeli/güvenli dağılımı düzgün kurulmuş bir liste boşta bırakmaz. 4. Belirsizliği [dengeli bir listeyle](/rehber/tercih-listesi-nasil-yapilir) yönet: trend ne yaparsa yapsın, hayal/dengeli/güvenli dağılımı düzgün kurulmuş bir liste boşta bırakmaz.
[Tercih robotu](/tercih-robotu) işin mekanik kısmını üstlenir: sıralamanı girdiğinde her programı **son yılın tabanına** göre (2025; o yıl veri yoksa 2024) hayal, dengeli ya da güvenli dilimine yerleştirir ve satırda geçmiş yılların tabanlarını da gösterir. Dilim tek yılın fotoğrafıdır; filmi yukarıdaki kalıplarla sen okursun. Aynı okumayı seneye tek bir hedef bölüm için yapmak istersen [hedef sıralama nasıl belirlenir?](/rehber/hedef-siralama-nasil-belirlenir) yazısına bak. [Tercih robotu](/tercih-robotu) işin mekanik kısmını üstlenir: sıralamanı girdiğinde her programı **son yılın tabanına** göre (2026; o yıl veri yoksa 2025) hayal, dengeli ya da güvenli dilimine yerleştirir ve satırda geçmiş yılların tabanlarını da gösterir. Dilim tek yılın fotoğrafıdır; filmi yukarıdaki kalıplarla sen okursun. Aynı okumayı seneye tek bir hedef bölüm için yapmak istersen [hedef sıralama nasıl belirlenir?](/rehber/hedef-siralama-nasil-belirlenir) yazısına bak.

View File

@@ -95,7 +95,7 @@ Kuralı burada yeniden anlatmıyoruz; hesabı [OBP yazısında](/rehber/obp-nedi
Elinde bir bölüm varken liste kurmak, ilk tercihinden farklıdır: Elinde bir bölüm varken liste kurmak, ilk tercihinden farklıdır:
- **Listeye yalnızca şu anki bölümüne tercih edeceğin programları yaz.** Yerleştirme listeni yukarıdan aşağı okur; "nasıl olsa gitmem" dediğin satıra da yerleşebilirsin. 2026 kılavuzlarındaki kural aynı kalırsa her yeni yerleştirme, bir sonraki yılın sınavı için OBP bedelini yeniden doğurur. ÖSYM de devam etmeyi düşünmediğin programı yazmaman konusunda uyarıyor. - **Listeye yalnızca şu anki bölümüne tercih edeceğin programları yaz.** Yerleştirme listeni yukarıdan aşağı okur; "nasıl olsa gitmem" dediğin satıra da yerleşebilirsin. 2026 kılavuzlarındaki kural aynı kalırsa her yeni yerleştirme, bir sonraki yılın sınavı için OBP bedelini yeniden doğurur. ÖSYM de devam etmeyi düşünmediğin programı yazmaman konusunda uyarıyor.
- **Hedefi tek yılın tabanıyla koyma.** Hedef programın son 5 yıllık taban sıralamasına [bölüm sayfalarından](/bolumler) bak; yöntemi [hedef sıralama nasıl belirlenir?](/rehber/hedef-siralama-nasil-belirlenir) yazısında. - **Hedefi tek yılın tabanıyla koyma.** Hedef programın son yıllardaki taban sıralamasına [bölüm sayfalarından](/bolumler) bak; yöntemi [hedef sıralama nasıl belirlenir?](/rehber/hedef-siralama-nasil-belirlenir) yazısında.
- **[Ölü tercihleri](/rehber/olu-tercih-nedir) temizle.** Sıralaman belli olduğunda [tercih robotuna](/tercih-robotu) girip programların son yılın tabanına göre hayal, dengeli ya da güvenli (halk arasında "garanti tercih") dilimlerinden hangisine düştüğünü tek ekranda görebilirsin. Bu dilimler yerleşme olasılığı değil, geçmiş tabana göre konumundur. - **[Ölü tercihleri](/rehber/olu-tercih-nedir) temizle.** Sıralaman belli olduğunda [tercih robotuna](/tercih-robotu) girip programların son yılın tabanına göre hayal, dengeli ya da güvenli (halk arasında "garanti tercih") dilimlerinden hangisine düştüğünü tek ekranda görebilirsin. Bu dilimler yerleşme olasılığı değil, geçmiş tabana göre konumundur.
## Sık sorulan sorular ## Sık sorulan sorular

View File

@@ -13,9 +13,19 @@
import { useEffect, useRef } from "react"; import { useEffect, useRef } from "react";
import { PROFIL_DEGISTI_EVENT } from "@/features/sihirbaz/sihirbaz-sabitler"; import { PROFIL_DEGISTI_EVENT } from "@/features/sihirbaz/sihirbaz-sabitler";
import { tercihProfiliOku, tercihProfiliYaz } from "@/features/sihirbaz/sihirbaz-profil"; import { tercihProfiliOku, tercihProfiliYaz } from "@/features/sihirbaz/sihirbaz-profil";
import { listeOku, sunucuylaBirlestir, useManuelListe } from "../liste-store"; import { SON_YIL } from "@/lib/veri-yillari";
import {
listeOku,
sunucuylaBirlestir,
tabanlariGuncelle,
useManuelListe,
} from "../liste-store";
import { oturumDurumuBildir } from "../liste-oturum-sinyali"; import { oturumDurumuBildir } from "../liste-oturum-sinyali";
import { listeSenkronla, listeyiKaydet } from "../liste-actions"; import {
listeSenkronla,
listeTabanlariniTazele,
listeyiKaydet,
} from "../liste-actions";
const DEBOUNCE_MS = 2000; const DEBOUNCE_MS = 2000;
@@ -29,6 +39,33 @@ export function ListeSenkron({ userId }: { userId: string | null }) {
oturumDurumuBildir(Boolean(userId)); oturumDurumuBildir(Boolean(userId));
}, [userId]); }, [userId]);
// Yeni veri yılı: kayıtlı satırların efektif sırası ekleme anının
// snapshot'ıdır. Girişli/girişsiz herkes için, sekme oturumu başına bir kez
// güncel sıralar çekilir ve risk yeniden hesaplanır — /listem ile /sonuc
// tablosu aynı yılın tabanını göstersin. Anahtar SON_YIL'i taşır: yıl
// değişince eski işaret geçersizleşir.
useEffect(() => {
const mevcut = listeOku();
if (mevcut.length === 0) return;
const anahtar = `kolaytercih.liste-taban.${SON_YIL}`;
try {
if (sessionStorage.getItem(anahtar)) return;
} catch {}
let iptal = false;
void (async () => {
const tabanlar = await listeTabanlariniTazele(mevcut.map((t) => t.id));
if (iptal) return;
tabanlariGuncelle(tabanlar);
try {
sessionStorage.setItem(anahtar, "1");
} catch {}
})();
return () => {
iptal = true;
};
// Yalnız mount'ta: liste sonradan değişse de ekleme anı zaten güncel veriyle olur
}, []);
// Giriş anı merge'i — sekme oturumu başına bir kez (idempotent olsa da // Giriş anı merge'i — sekme oturumu başına bir kez (idempotent olsa da
// her gezinmede sunucuya gitmesin diye sessionStorage ile tekilleştirilir). // her gezinmede sunucuya gitmesin diye sessionStorage ile tekilleştirilir).
useEffect(() => { useEffect(() => {

View File

@@ -13,6 +13,7 @@
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { getSession } from "@/lib/session"; import { getSession } from "@/lib/session";
import { appDb, schema } from "@/lib/appdb"; import { appDb, schema } from "@/lib/appdb";
import { efektifSiralarGetir } from "@/lib/db";
import { tercihProfiliDogrula, type TercihProfili } from "@/features/sihirbaz/sihirbaz-sabitler"; import { tercihProfiliDogrula, type TercihProfili } from "@/features/sihirbaz/sihirbaz-sabitler";
import { import {
MANUEL_LISTE_MAX, MANUEL_LISTE_MAX,
@@ -24,11 +25,48 @@ export type ListeSenkronSonucu =
| { ok: true; items: ManuelTercih[]; profil: TercihProfili | null } | { ok: true; items: ManuelTercih[]; profil: TercihProfili | null }
| { ok: false }; | { ok: false };
const PROGRAM_ID = /^\d{1,12}$/;
/**
* Kayıtların taşıdığı efektif sıra ekleme anının snapshot'ıdır; yeni
* yerleştirme yılı yüklenince eskir. Güncel değeri DB'den okuyup satıra yazar;
* güncel kılavuzda olmayan program (arşiv) eski değerini korur. Risk burada
* yenilenmez — aday sırasını istemci bilir (bkz. liste-store tabanlariGuncelle).
*/
function tabanlariTazele(items: ManuelTercih[]): ManuelTercih[] {
const guncel = efektifSiralarGetir(
items.map((t) => t.id).filter((id) => PROGRAM_ID.test(id)),
);
return items.map((t) =>
t.id in guncel ? { ...t, efektifSira: guncel[t.id] } : t,
);
}
/**
* İstemcinin (girişli ya da girişsiz) localStorage listesini yeni veri yılına
* tazelemesi için: id → güncel efektif sıra. Program verisi herkese açık, oturum
* gerekmez. Yanıt yalnız listedeki (en fazla 24) id'yi kapsar.
*/
export async function listeTabanlariniTazele(
ids: unknown,
): Promise<Record<string, number | null>> {
if (!Array.isArray(ids)) return {};
const temiz = [
...new Set(
ids.filter(
(id): id is string => typeof id === "string" && PROGRAM_ID.test(id),
),
),
].slice(0, MANUEL_LISTE_MAX);
return efektifSiralarGetir(temiz);
}
async function kaydiYaz( async function kaydiYaz(
userId: string, userId: string,
items: ManuelTercih[], itemsHam: ManuelTercih[],
profil: TercihProfili | null, profil: TercihProfili | null,
): Promise<void> { ): Promise<void> {
const items = tabanlariTazele(itemsHam);
const now = new Date(); const now = new Date();
await appDb await appDb
.insert(schema.savedLists) .insert(schema.savedLists)
@@ -65,10 +103,12 @@ export async function listeSenkronla(girdi: {
const sunucuProfil = tercihProfiliDogrula(mevcut?.profil); const sunucuProfil = tercihProfiliDogrula(mevcut?.profil);
const clientIdler = new Set(clientItems.map((t) => t.id)); const clientIdler = new Set(clientItems.map((t) => t.id));
const items = [ const items = tabanlariTazele(
[
...clientItems, ...clientItems,
...sunucuItems.filter((t) => !clientIdler.has(t.id)), ...sunucuItems.filter((t) => !clientIdler.has(t.id)),
].slice(0, MANUEL_LISTE_MAX); ].slice(0, MANUEL_LISTE_MAX),
);
const profil = clientProfil ?? sunucuProfil; const profil = clientProfil ?? sunucuProfil;
await kaydiYaz(userId, items, profil); await kaydiYaz(userId, items, profil);

View File

@@ -194,6 +194,31 @@ export function programdanManuelTercih(
}; };
} }
/**
* Yeni veri yılı: sunucudan gelen güncel efektif sıralarla kayıtları tazeler,
* profil varsa riski yeniden hesaplar. Haritada olmayan id (arşivlenmiş
* program) dokunulmaz. Değişiklik yoksa referans korunur, yayın yapılmaz.
*/
export function tabanlariGuncelle(tabanlar: Record<string, number | null>) {
yukle();
const profil = tercihProfiliOku();
let degisti = false;
const yeni = liste.map((t) => {
if (!(t.id in tabanlar) || tabanlar[t.id] === t.efektifSira) return t;
degisti = true;
const efektifSira = tabanlar[t.id];
return {
...t,
efektifSira,
risk: profil ? riskHesapla(efektifSira, profil.sira) : t.risk,
};
});
if (!degisti) return;
liste = yeni;
kaydet();
yayinla();
}
/** Profil sırasına göre listedeki riskleri yeniden hesaplar (program silmez). */ /** Profil sırasına göre listedeki riskleri yeniden hesaplar (program silmez). */
export function riskleriYenile(profil?: TercihProfili | null) { export function riskleriYenile(profil?: TercihProfili | null) {
yukle(); yukle();

View File

@@ -8,6 +8,7 @@ import {
SiralamaDemo, SiralamaDemo,
} from "./meraklisina-demo"; } from "./meraklisina-demo";
import { HuniSemasi } from "./huni-semasi"; import { HuniSemasi } from "./huni-semasi";
import { VERI_YIL_SAYISI } from "@/lib/veri-yillari";
/** /**
* Algoritmanın öğrenci diline çevrilmiş anlatımı. Teknik detay (SQL, çarpan * Algoritmanın öğrenci diline çevrilmiş anlatımı. Teknik detay (SQL, çarpan
@@ -135,8 +136,8 @@ export function MeraklisinaIcerik() {
Tüm bu hesaplar <strong>geçen yılların</strong>{" "} Tüm bu hesaplar <strong>geçen yılların</strong>{" "}
yerleştirme sonuçlarına dayanır. Kontenjanlar, tercih davranışları yerleştirme sonuçlarına dayanır. Kontenjanlar, tercih davranışları
ve puanlar her yıl değişir; geçen yıl &ldquo;güvenli&rdquo; ve puanlar her yıl değişir; geçen yıl &ldquo;güvenli&rdquo;
görünen bir bölüm bu yıl dolabilir. Bu yüzden satırlarda son beş görünen bir bölüm bu yıl dolabilir. Bu yüzden satırlarda son{" "}
yılın taban seyrini de gösteririz — çizgi yukarı tırmanıyorsa {VERI_YIL_SAYISI} yılın taban seyrini de gösteririz — çizgi yukarı tırmanıyorsa
bölüm zorlaşıyor demektir. KolayTercih karar <em>destek</em>{" "} bölüm zorlaşıyor demektir. KolayTercih karar <em>destek</em>{" "}
aracıdır; listenin son hâli ve sorumluluğu her zaman sana aittir. aracıdır; listenin son hâli ve sorumluluğu her zaman sana aittir.
</p> </p>

View File

@@ -210,6 +210,27 @@ export function netlerGetir(programId: string): ProgramNetSatiri[] {
.all(programId) as ProgramNetSatiri[]; .all(programId) as ProgramNetSatiri[];
} }
/**
* Kayıtlı manuel liste satırlarının güncel efektif sırası (son yıl, yoksa bir
* önceki). Kayıtlar efektif sırayı ekleme anının snapshot'ı olarak taşır; yeni
* yerleştirme yılı yüklenince bununla tazelenir. Güncel kılavuzda olmayan
* (arşivlenmiş) id'ler sonuçta yer almaz — çağıran taraf eski değeri korur.
*/
export function efektifSiralarGetir(
ids: readonly string[]
): Record<string, number | null> {
if (ids.length === 0) return {};
const satirlar = getDb()
.prepare(
`SELECT id, ${EFEKTIF_SIRA} AS efektif FROM programs
WHERE id IN (${ids.map(() => "?").join(",")})`
)
.all(...ids) as { id: string; efektif: number | null }[];
const sonuc: Record<string, number | null> = {};
for (const s of satirlar) sonuc[s.id] = s.efektif;
return sonuc;
}
// Sihirbaz bubble'ları için erişilebilir program penceresi: hayal için // Sihirbaz bubble'ları için erişilebilir program penceresi: hayal için
// gerçekçi alt sınırdan (sira*0.5) itibaren AÇIK uçlu — garanti tarafı artık // gerçekçi alt sınırdan (sira*0.5) itibaren AÇIK uçlu — garanti tarafı artık
// sınırsız olduğundan üst kesim yok. Böylece 500B sıradaki aday Tıp bubble'ı // sınırsız olduğundan üst kesim yok. Böylece 500B sıradaki aday Tıp bubble'ı