KabaLang örnekleri: konsol, masaüstü ve web için dokuz proje

Konsol: fraktal (paralel şeritli 24-bit Mandelbrot/Julia + yakınlaşma),
sudoku (geri izlemeli, canlı animasyon), fatura (JSON → terminal tablosu,
PDF ve Excel).
Masaüstü: hesap makinesi (işlem önceliği, canlı bağlama), odak (Pomodoro),
parola atölyesi (entropi ölçer, SHA-256).
Web: pano (Kanban REST API + SQLite), kisalt (302 yönlendirme, SVG
istatistik), anket (adres başına tek oy, sunucuda çizilen grafik).

Hepsi `kabalang calistir` ile derlenip çalışır; web uygulamaları yalnız
127.0.0.1'i dinler, SQL parametre bağlamalı, HTML çıktısı kaçırılır.
This commit is contained in:
2026-10-03 08:37:47 +03:00
commit e0e4a0d6c7
40 changed files with 2652 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
# Fraktal — terminalde 24 bit renkli Mandelbrot ve Julia
![Fraktal](../../medya/fraktal.png)
Terminali bir tuvale çevirir. Her karakter hücresi **iki piksel** taşır:
üst yarım blok `▀` ön plan rengiyle üst pikseli, arka plan rengiyle alt
pikseli çizer. 100 sütunluk bir terminal böylece 100 × 72 piksellik bir
görüntü olur.
```bash
kabalang calistir fraktal.kbl # Mandelbrot kümesi
kabalang calistir fraktal.kbl -- --tur julia # Julia kümesi (c = -0.8 + 0.156i)
kabalang calistir fraktal.kbl -- --yakinlas # denizatı vadisine 120 karelik dalış
kabalang calistir fraktal.kbl -- -s 160 -r 44 # geniş terminal: 160 sütun × 44 satır
```
## KabaLang'ın gösterdikleri
| Özellik | Nerede |
|---|---|
| `birlikte:` + `baslat` | Görüntü dört şeride bölünür, şeritler **aynı anda** hesaplanır ve sırası korunarak birleştirilir (`kare_ciz`) |
| `sayilabilir` | `Kume.MANDELBROT` / `Kume.JULIA` — kapalı değer kümesi |
| `yapi` | `Kamera` (merkez, görüş genişliği, yineleme sınırı) ve palet `Durak`ları |
| f-string biçimi | `{kam.merkez_x:.5f}{kam.merkez_y:+.5f}i` — işaretli ve hassasiyetli sayı |
| `KomutSatiri` | `--tur`, `--yakinlas`, `--sutun`/`--satir` ve kendiliğinden üretilen `--yardim` |
| Tipli imzalar | `fonksiyon kacis(zx: ondalik, ...) -> ondalik` |
## Nasıl çalışır
* **Kaçış süresi:** `z ← z² + c` yinelenir; `|z|` 2'yi aşarsa nokta kümeden
kaçmıştır. Ne kadar çabuk kaçtığı rengini belirler, hiç kaçmayan nokta
kümenin içidir (lacivert).
* **Palet:** altı renk durağından (derin uzay → gece mavisi → mavi →
camgöbeği → lavanta → beyaz) bir kez 256 tonluk bir liste üretilir.
* **Derin yakınlaşma:** renk, yineleme sayısının üçgen dalgasıdır; böylece
20 yinelemede de 700 yinelemede de paletin tamamı kullanılır.
Bir kare (7.200 piksel, 120 yineleme sınırı) birkaç milisaniyede hesaplanır;
süre başlık satırında yazar.
+171
View File
@@ -0,0 +1,171 @@
# ╔══════════════════════════════════════════════════════════════════╗
# ║ FRAKTAL — terminalde 24 bit renkli Mandelbrot ve Julia kümesi ║
# ║ ║
# ║ Her karakter hücresi İKİ piksel taşır: üst yarım blok `▀`'nin ║
# ║ ön plan rengi üst pikseli, arka plan rengi alt pikseli çizer. ║
# ║ Görüntü dört şeride bölünür ve şeritler AYNI ANDA hesaplanır. ║
# ║ ║
# ║ kabalang calistir fraktal.kbl → Mandelbrot ║
# ║ kabalang calistir fraktal.kbl --tur julia → Julia kümesi ║
# ║ kabalang calistir fraktal.kbl --yakinlas → derinlere dalış║
# ╚══════════════════════════════════════════════════════════════════╝
kullan kaba.sistem
sayilabilir Kume:
MANDELBROT
JULIA
# Kameranın baktığı yer: karmaşık düzlemde merkez ve görüş genişliği.
yapi Kamera:
merkez_x = -0.65
merkez_y = 0.0
genislik = 3.2
sinir = 120 # en fazla kaç yineleme
# ── Renk ─────────────────────────────────────────────────────────────
# Palet, renk duraklarından bir kez üretilir: derin uzay → gece mavisi →
# KabaForce mavisi → camgöbeği → lavanta → beyaz. Aradaki 256 ton doğrusal
# karışımdır; her piksel yalnız listeden bir ton seçer.
yapi Durak:
konum = 0.0
r = 0
g = 0
b = 0
fonksiyon karistir(a: sayi, b: sayi, t: ondalik) -> sayi:
don a + sayi(ondalik(b - a) * t)
fonksiyon palet_uret() -> liste<metin>:
duraklar = [Durak(0.00, 10, 13, 21), Durak(0.18, 26, 42, 108),
Durak(0.40, 55, 126, 244), Durak(0.62, 34, 211, 238),
Durak(0.82, 167, 139, 250), Durak(1.00, 250, 245, 255)]
palet = [] # boş liste sabiti metin listesidir
i = 0
iken i < 256:
t = ondalik(i) / 255.0
k = 0
iken t > duraklar[k + 1].konum:
k = k + 1
a = duraklar[k]
b = duraklar[k + 1]
oran = (t - a.konum) / (b.konum - a.konum)
palet.ekle(f"{karistir(a.r, b.r, oran)};{karistir(a.g, b.g, oran)};{karistir(a.b, b.b, oran)}")
i = i + 1
don palet
PALET = palet_uret()
fonksiyon renk(t: ondalik) -> metin:
eger t < 0.0: # kümenin içi: derin uzay laciverti
don "6;8;14"
don PALET[sayi(t * 255.0)]
# ── Kaçış süresi ─────────────────────────────────────────────────────
# z ← z² + c. |z| 2'yi aşarsa nokta kümeden kaçmıştır; ne kadar
# çabuk kaçtığı rengini belirler. Hiç kaçmazsa -1 döner (kümenin içi).
# Renk yineleme sayısının üçgen dalgasıdır (0 → 1 → 0, her 80 adımda):
# böylece 20 yinelemede de 500 yinelemede de palet baştan sona kullanılır.
fonksiyon kacis(zx: ondalik, zy: ondalik, cx: ondalik, cy: ondalik, sinir: sayi) -> ondalik:
i = 0
iken i < sinir:
x2 = zx * zx
y2 = zy * zy
eger x2 + y2 > 4.0:
dalga = ondalik(i % 80) / 40.0
eger dalga > 1.0:
dalga = 2.0 - dalga
don matematik.karekok(dalga)
zy = 2.0 * zx * zy + cy
zx = x2 - y2 + cx
i = i + 1
don -1.0
fonksiyon piksel(kume: Kume, kam: Kamera, px: sayi, py: sayi, sutun: sayi, satir: sayi) -> ondalik:
# Terminal hücresi kare değil; iki piksel ≈ bir sütun genişliği.
olcek = kam.genislik / ondalik(sutun)
x = kam.merkez_x + (ondalik(px) - ondalik(sutun) / 2.0) * olcek
y = kam.merkez_y + (ondalik(py) - ondalik(satir)) * olcek
eger kume == Kume.JULIA:
don kacis(x, y, -0.8, 0.156, kam.sinir)
don kacis(0.0, 0.0, x, y, kam.sinir)
# Bir şerit: [bas, son) arasındaki karakter satırlarını tek metin olarak üretir.
fonksiyon serit(kume: Kume, kam: Kamera, bas: sayi, son: sayi, sutun: sayi, satir: sayi) -> metin:
cikti = ""
j = bas
iken j < son:
px = 0
iken px < sutun:
ust = renk(piksel(kume, kam, px, 2 * j, sutun, satir))
alt = renk(piksel(kume, kam, px, 2 * j + 1, sutun, satir))
cikti = cikti + "\033[38;2;" + ust + "m\033[48;2;" + alt + "m▀"
px = px + 1
cikti = cikti + "\033[0m\n"
j = j + 1
don cikti
# Dört şeridi dört görevde birlikte hesapla; sıra korunarak birleştir.
fonksiyon kare_ciz(kume: Kume, kam: Kamera, sutun: sayi, satir: sayi) -> metin:
d = satir // 4
resim = "" # birlikte: kendi kapsamıdır, sonucu dışarıda tut
birlikte:
a = baslat serit(kume, kam, 0, d, sutun, satir)
b = baslat serit(kume, kam, d, 2 * d, sutun, satir)
c = baslat serit(kume, kam, 2 * d, 3 * d, sutun, satir)
e = baslat serit(kume, kam, 3 * d, satir, sutun, satir)
resim = a.bekle() + b.bekle() + c.bekle() + e.bekle()
don resim
fonksiyon baslik(kume: Kume, kam: Kamera, sure: sayi) -> metin:
ad = "MANDELBROT"
eger kume == Kume.JULIA:
ad = "JULIA c = -0.8 + 0.156i"
yakinlik = 3.2 / kam.genislik
don f"\033[1;38;2;125;170;255m ◆ {ad}\033[0m\033[38;2;110;120;150m · merkez {kam.merkez_x:.5f}{kam.merkez_y:+.5f}i · ×{yakinlik:.1f} · {kam.sinir} yineleme · {sure} ms\033[0m"
# ── Komut satırı ─────────────────────────────────────────────────────
ks = KomutSatiri("fraktal", "Terminalde 24 bit renkli fraktal çizer")
ks.secenek("tur", "t", "mandelbrot ya da julia")
ks.bayrak("yakinlas", "y", "Mandelbrot'un derinliklerine kare kare dal")
ks.secenek("sutun", "s", "çizim genişliği (karakter, varsayılan 100)")
ks.secenek("satir", "r", "çizim yüksekliği (karakter satırı, varsayılan 36)")
c = ks.coz()
eger c.yardim_mi():
c.yardim_yaz()
cikis(0)
eger c.hatali_mi():
c.hata_yaz_ve_cik()
SUTUN = sayi(c.secenek("sutun").deger_veya("100"))
SATIR = sayi(c.secenek("satir").deger_veya("36")) # 36 karakter satırı = 72 piksel satırı
eger SUTUN < 8 veya SATIR < 4:
konsol.hata_yaz("fraktal: --sutun en az 8, --satir en az 4 olmalı\n")
cikis(2)
kume = Kume.MANDELBROT
kam = Kamera()
eger c.secenek("tur").deger_veya("mandelbrot") == "julia":
kume = Kume.JULIA
kam.merkez_x = 0.0
kam.genislik = 3.0
eger c.bayrak("yakinlas"):
# Denizatı vadisine dalış: her karede görüş %8 daralır.
kam.merkez_x = -0.743643887
kam.merkez_y = 0.131825904
konsol.yaz("\033[?25l\033[2J") # imleci gizle, ekranı temizle
kare = 0
iken kare < 120:
t0 = zaman.milisaniye()
resim = kare_ciz(kume, kam, SUTUN, SATIR)
konsol.yaz("\033[H" + baslik(kume, kam, zaman.milisaniye() - t0) + "\033[K\n" + resim)
kam.genislik = kam.genislik * 0.92
kam.sinir = kam.sinir + 5
uyu(40) # hesap ~3 ms sürüyor; göz için yavaşlat
kare = kare + 1
konsol.yaz("\033[?25h")
degilse:
t0 = zaman.milisaniye()
resim = kare_ciz(kume, kam, SUTUN, SATIR)
yazdir(baslik(kume, kam, zaman.milisaniye() - t0))
konsol.yaz(resim)