Program artık siraGecmisi (YILLAR ile hizalı) + efektifSira + siraSon/puanSon/ kontenjanSon/yerlesenSon taşır. db.ts kolonları YILLAR'dan üretip takma adla seçer, programSatiri eşleyicisi ham satırı Program'a çevirir; SELECT_COLS'un üç tüketicisi de eşleyiciden geçer. EFEKTIF_SIRA veri-yillari'dan gelir. - trend: ILK_YIL tek kaynaktan, opsiyonel ilkYil parametresi - rapor snapshot'ına opsiyonel ilkYil yazılır (eski kayıtlar: okurken ILK_YIL) - rapor promptu son 4 yılı göndermeye devam eder, anahtarlar dinamik - tadımlık "son N yıl" filtresi genel: N != VERI_YIL_SAYISI ise servis edilmez - veri-kapsami VERI_YIL_SAYISI'nı veri-yillari'dan türetir Bileşenler bir sonraki commit'te yeni tipe geçer (ikisi birlikte derlenir). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
51 lines
2.3 KiB
TypeScript
51 lines
2.3 KiB
TypeScript
// Deterministik trend cümlesi: rapor satırları (lib/ai/rapor.ts) ve girişsiz
|
||
// tadımlık (lib/tadimlik-havuzu.ts) AYNI saf fonksiyondan okur. Cümle gerçek
|
||
// YÖK Atlas sıra geçmişinden kesin rakamla kurulur ("45B düzeyinden 38B
|
||
// düzeyine indi"); yıl aralığı sabit bir "son N yıl" kalıbından değil,
|
||
// serideki dolu yıllardan gelir.
|
||
|
||
import { ILK_YIL } from "./veri-yillari";
|
||
|
||
/** 45000 -> "45B", 1_200_000 -> "1,2M" (şemadaki öğrenci dili). */
|
||
function siraKisa(n: number): string {
|
||
if (n >= 1_000_000) {
|
||
return `${(n / 1_000_000).toLocaleString("tr-TR", { maximumFractionDigits: 1 })}M`;
|
||
}
|
||
if (n >= 1000) return `${Math.round(n / 1000)}B`;
|
||
return String(n);
|
||
}
|
||
|
||
/**
|
||
* [ilkYil..] taban sıralaması dizisinden tek cümlelik trend özeti. Dizi
|
||
* `ilkYil`'a demirlidir (varsayılan: veri penceresinin ilk yılı); yeni veri
|
||
* yılı sona eklenir, bu yüzden eski kayıtların daha kısa dizileri de doğru
|
||
* yılları verir. `ilkYil`, snapshot kendi çapasını taşıyorsa ondan gelir.
|
||
*
|
||
* Cümle yalnızca OLANI betimler: ilk ve son dolu yılın tabanını kıyaslar
|
||
* (±%10 eşiği). "Zorlaşıyor / kolaylaşıyor" gibi geleceğe dönük yargı
|
||
* kurmaz — iki uç yılın kıyası aradaki seyri ve gelecek yılı söylemez.
|
||
* Küçülen sıra = taban sıkılaştı, büyüyen sıra = taban gevşedi.
|
||
*/
|
||
export function trendOzetiMetni(
|
||
gecmis: readonly (number | null | undefined)[] | undefined,
|
||
ilkYil: number = ILK_YIL,
|
||
): string {
|
||
const seri: Array<[number, number]> = [];
|
||
(gecmis ?? []).forEach((sira, i) => {
|
||
if (sira != null) seri.push([ilkYil + i, sira]);
|
||
});
|
||
if (seri.length < 2) {
|
||
return "Karşılaştırma için yeterli geçmiş yıl verisi yok; trendi temkinli oku.";
|
||
}
|
||
const [basYil, ilkSira] = seri[0];
|
||
const [sonYil, sonSira] = seri[seri.length - 1];
|
||
const oran = (sonSira - ilkSira) / ilkSira;
|
||
if (oran <= -0.1) {
|
||
return `${basYil}-${sonYil} arasında taban ${siraKisa(ilkSira)} düzeyinden ${siraKisa(sonSira)} düzeyine indi; taban sıkılaştı.`;
|
||
}
|
||
if (oran >= 0.1) {
|
||
return `${basYil}-${sonYil} arasında taban ${siraKisa(ilkSira)} düzeyinden ${siraKisa(sonSira)} düzeyine çıktı; taban gevşedi.`;
|
||
}
|
||
return `${basYil}-${sonYil} arasında taban sıralaması ${siraKisa(sonSira)} düzeyinde stabil seyretti.`;
|
||
}
|