Ders 08 / 18
Erişilebilir Grafik
Sekiz seri iki ton ailesi ve dört aydınlık basamağından oluşan varsayılan bir paletle kodlandığında tam çözücüyle sekizi de ayırt ediliyor, ton ayrımını okumayan çözücüyle yalnız dördü kalıyor. Şekil kanalı sırayla dağıtıldığında sayı dörtte kalıyor çünkü şekil dört seride başa dönüyor ve renk çakışması da dört seri arayla oluyor; şekil çakışmaya göre dağıtıldığında sekize çıkıyor. Gösterge kutusu 16 geçiş istiyor, sıralı gösterge 6, doğrudan etiketleme 0. Dokuz aydınlık basamağından iki aralıkla beşi ayırt ediliyor ve dört şekille tek gösterimin tavanı 20 seri çıkıyor.
İçindekiler
Yedi ders boyunca ölçülen şey kanalın taşıdığı sayıydı ve her seferinde okuyucunun kanalı okuyabildiği varsayıldı. Bu ders o varsayımı ölçer. Bir gösterimde birden çok seri varsa ilk soru serilerin değerlerinin doğru okunup okunmadığı değildir; ilk soru hangi serinin hangisi olduğudur. Bir seri komşusundan ayırt edilemiyorsa değeri de raporlanmamış sayılır.
Karşıtlık oranı hesabı, renk sistemleri ve erişilebilirlik ölçütleri Arayüz Temelleri kursunda ve erişilebilirlik kurslarında kuruldu; bunların hiçbiri burada tekrarlanmaz ve hiçbir renk sistemi adı yazılmaz. Buradaki soru veriye özgüdür ve tek bir sayıyla ölçülür: ayırt edilebilir seri sayısı. Renk tek kodlama kanalıyken bu sayı kaç, ve yedekli kodlama onu kaça çıkarıyor.
- GT43. Renk bir ad değil iki sayıdır. Modelde renk, ton ailesi ile aydınlık basamağından oluşur. Kodlayıcı seriye bir çift atar; hiçbir renk adı ya da sistemi anılmaz.
- GT44. Okuma çözünürlüğü iki basamaktır. İki aydınlık basamağı en az iki basamak farklı olmadan ayırt edilemez, çünkü gösterimde seriler ince çizgilerdir ve birbirinden uzakta durur; yan yana konmuş iki geniş yüzeyin ayrımı bu değildir.
- GT45. İki çözücü koşar. Tam çözücü ton ailesini de aydınlık basamağını da okur. Daralmış çözücü ton ayrımını okumaz ve yalnız aydınlık basamağını görür; ikisi de aynı kodlamaya uygulanır.
- GT46. Ayırt edilebilir seri sayısı küme sayısıdır. Birbirinden ayırt edilemeyen seriler tek bir kümede toplanır; geri okunan seri sayısı küme sayısıdır ve serilerin toplamından küçük olur.
- GT47. Yedekli kodlamanın yeri sonucu belirler. İkinci bir kanal eklemek tek başına yetmez; kanalın, rengin çakıştığı eksende değişmesi gerekir.
- GT48. Tek gösterimin bir tavanı vardır. Tavan, ayırt edilebilir basamak sayısı ile şekil sayısının çarpımıdır; üzerinde gösterim parçalanmadan seri sayısı geri okunamaz.
Renk Tek Kanalken
# seri.py — MODELDIR: K03-K05'in kurgu olcum agi ayni tohumla uretilir. # Sekiz seri ayni 3.199 okumanin alt kumeleridir: bes bolge ve uc tarife # basamagi. Renk bir ad degil, iki sayidir: ton ailesi ve aydinlik basamagi. import math TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF DONEM = ["2026-01", "2026-02", "2026-03"] TARIFE = [10, 25, 40] BOLGE = [("kuzey", 0.28, 21), ("guney", 0.22, 17), ("dogu", 0.18, 26), ("bati", 0.14, 14), ("merkez", 0.18, 23)] def uretec(t): x = ((t ^ (t >> 16)) * 2246822507) & M32 x = ((x ^ (x >> 13)) * 3266489909) & M32 s = [(x ^ (x >> 16)) & M32] def sonraki(): s[0] = (s[0] * 1664525 + 1013904223) & M32 return s[0] / 4294967296 return sonraki def ayrik(u, w): t = 0.0 for i, x in enumerate(w): t += x if u < t: return i return len(w) - 1 _k, _e = [], [] for i in range(HAM): r = uretec(TOHUM + i) b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])] ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05]) ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17]) (_e if r() < 0.046 else _k).append( {"abone_no": 10001 + i, "bolge": b[0], "taban": b[2]}) GECERLI = {a["abone_no"] for a in _k} OKUMA = [] for a in _k + _e: r = uretec(TOHUM + 7000 + a["abone_no"]) for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])): t = 0.0 if r() < 0.038 else math.floor( a["taban"] * math.exp((r() + r() + r() - 1.5) * 0.62) * (1 - d * 0.05) * 100 + 0.5) / 100 if a["abone_no"] not in GECERLI: r() continue OKUMA.append({"abone_no": a["abone_no"], "bolge": a["bolge"], "donem": DONEM[d], "tuketim_m3": t}) r() def basamak(v): return 1 + sum(1 for t in TARIFE if v >= t) def ortala(f): v = [o["tuketim_m3"] for o in OKUMA if f(o)] return sum(v) / len(v), len(v) SERI = [] for ad, _, _ in BOLGE: d, n = ortala(lambda o, x=ad: o["bolge"] == x) SERI.append((ad, d, n)) for bs in (2, 3, 4): d, n = ortala(lambda o, x=bs: basamak(o["tuketim_m3"]) == x) SERI.append((f"basamak{bs}", d, n)) # Renk kanali: ton ailesi (0/1) ve aydinlik basamagi (0-8). Palet iki aileden # dorder basamak seciyor; bu, sekiz seri icin dogal bir varsayilan dagilimdir. BASAMAK_SAYISI, AYIRMA, SEKIL_SAYISI = 9, 2, 4 PALET = [(i // 4, [1, 3, 5, 7][i % 4]) for i in range(len(SERI))] def tam_cozucu(x, y): """Iki seri ayirt edilir mi: ton farkli ya da basamak farki AYIRMA kadar.""" return x[0] != y[0] or abs(x[1] - y[1]) >= AYIRMA def daralmis_cozucu(x, y): """Ton ayrimini okumayan cozucu yalniz aydinlik basamagini gorur.""" return abs(x[1] - y[1]) >= AYIRMA def ayirt_edilebilir(kod, cozucu): """Ayirt edilemeyen seriler tek kume olur; kume sayisi geri okunan seridir.""" kok = list(range(len(kod))) def bul(i): while kok[i] != i: kok[i] = kok[kok[i]] i = kok[i] return i for i in range(len(kod)): for j in range(i + 1, len(kod)): if not cozucu(kod[i], kod[j]): kok[bul(i)] = bul(j) return len({bul(i) for i in range(len(kod))}) print(f"{len(SERI)} seri, hepsi ayni {len(OKUMA)} okumanin alt kumesi") print("seri gozlem ortalama ton basamak") for (ad, d, n), (t, bsm) in zip(SERI, PALET): print(f"{ad:11s} {n:6d} {d:9.3f} {t:4d} {bsm:8d}") print(f"okuma cozunurlugu: iki aydinlik basamagi en az {AYIRMA} basamak " f"farkli olmadan ayirt edilemez") print(f"tam cozucuyle ayirt edilebilir seri: " f"{ayirt_edilebilir(PALET, tam_cozucu)}/{len(SERI)}") print(f"ton ayrimini okumayan cozucuyle: " f"{ayirt_edilebilir(PALET, daralmis_cozucu)}/{len(SERI)}")
8 seri, hepsi ayni 3199 okumanin alt kumesi seri gozlem ortalama ton basamak kuzey 921 20.210 0 1 guney 645 16.602 0 3 dogu 557 24.674 0 5 bati 476 13.778 0 7 merkez 600 22.396 1 1 basamak2 2209 17.506 1 3 basamak3 692 30.009 1 5 basamak4 58 44.171 1 7 okuma cozunurlugu: iki aydinlik basamagi en az 2 basamak farkli olmadan ayirt edilemez tam cozucuyle ayirt edilebilir seri: 8/8 ton ayrimini okumayan cozucuyle: 4/8
Palet kusursuz görünüyor. Sekiz serinin sekizi de ayrı bir renk çifti almış, hiçbir çift tekrarlanmamış ve tam çözücü sekizini de ayırt ediyor. Bu, paleti seçen kişinin gördüğü sonuçtur.
Alt satır aynı paletin ikinci çözücü altında ne olduğunu söylüyor: 8 seriden 4’ü kalıyor. Kuzey ile merkez aynı aydınlık basamağını taşıyor, güney ile ikinci tarife basamağı aynı, doğu ile üçüncüsü aynı, batı ile dördüncüsü aynı. Dört seri çifti tek bir seriye iniyor ve her çiftin hangi üyesinin okunduğu belirsiz kalıyor. Rapor, 3.199 okumanın sekiz alt kümesini gösterdiğini sanıyorken dördünü gösteriyor.
Bu bir palet kusuru değil, bir yapı kusurudur. Palet iki ton ailesini dört aydınlık basamağıyla çaprazlamış ve sekiz gözü doldurmuş; ton ailesi okunamadığında çapraz tabloda sütun kalıyor, satır kalmıyor. Renk tek kodlama kanalıysa bu sonuç kaçınılmazdır ve paletteki renk sayısını artırmak işe yaramaz.
Yedekli Kodlama Nereye Eklenir
# yedek.py — sekil kanali eklenir. Nereye eklendigi sonucu belirler. SIRAYLA = [(p[0], p[1], i % SEKIL_SAYISI) for i, p in enumerate(PALET)] CAKISMAYA = [(p[0], p[1], i // SEKIL_SAYISI) for i, p in enumerate(PALET)] def sekilli(x, y): return daralmis_cozucu(x, y) or x[2] != y[2] print("katman tam cozucu daralmis cozucu") for ad, kod, coz in (("yalniz renk", PALET, daralmis_cozucu), ("renk + sekil (sirayla)", SIRAYLA, sekilli), ("renk + sekil (cakismaya)", CAKISMAYA, sekilli)): tam = ayirt_edilebilir([k[:2] for k in kod], tam_cozucu) print(f"{ad:28s} {tam:11d} {ayirt_edilebilir(kod, coz):16d}") print(f"sirayla dagitilan sekil {SEKIL_SAYISI} tanedir ve {SEKIL_SAYISI}. seride " f"bastan basliyor; renk cakismasi da {SEKIL_SAYISI} seri arayla oldugu " f"icin iki cakisma ust uste geliyor")
katman tam cozucu daralmis cozucu yalniz renk 8 4 renk + sekil (sirayla) 8 4 renk + sekil (cakismaya) 8 8 sirayla dagitilan sekil 4 tanedir ve 4. seride bastan basliyor; renk cakismasi da 4 seri arayla oldugu icin iki cakisma ust uste geliyor
Orta satır bu dersin en pahalı bulgusudur. Şekil kanalı eklendi, dört ayrı şekil serilere sırayla dağıtıldı ve daralmış çözücünün okuduğu sayı dörtte kaldı. Yedekli kodlama eklendi ama hiçbir şey düzelmedi.
Nedeni son satırdadır. Şekiller dört tanedir ve beşinci seride başa döner; paletin renk çakışması da tam dört seri arayladır. İki dönüş üst üste gelince aynı çakışan çiftler bu kez hem aynı basamağı hem aynı şekli paylaşır. İkinci kanal, birincinin çakıştığı yerde birlikte çakışıyor.
Üçüncü satır düzeltmeyi veriyor: şekil, sıraya göre değil çakışmaya göre dağıtıldığında — yani ilk dört seri bir şekil, sonraki dört seri başka bir şekil aldığında — daralmış çözücü de sekizini ayırt ediyor. Kullanılan şekil sayısı dörtten ikiye indi ve sonuç iyileşti. Yedekli kodlamanın ölçüsü kanal sayısı değil, kanalın nerede değiştiğidir.
Gösterge Kutusu ve Geçiş Sayısı
# gecis.py — gosterge kutusu okuyucuyu gosterimle kutu arasinda gidip # getirir. Sag kenar konumu ucuncu bir kanaldir ve sirayi tasir. SATIR = 12 enaz, encok = min(d for _, d, _ in SERI), max(d for _, d, _ in SERI) konum = [round((d - enaz) / (encok - enaz) * (SATIR - 1)) for _, d, _ in SERI] cakisan = sum(1 for i in range(len(SERI)) for j in range(i + 1, len(SERI)) if konum[i] == konum[j]) tekil = [i for i in range(len(SERI)) if all(konum[i] != konum[j] for j in range(len(SERI)) if j != i)] print(f"sag kenar konumlari ({SATIR} satir): {konum}") print(f"{len(SERI)} serinin {len(tekil)} tanesinin konumu tekil, " f"{cakisan} cift ayni satira dusuyor") kutu = 2 * len(SERI) sirali = 2 + 2 * (len(SERI) - len(tekil)) print("duzen gecis sayisi ayirt edilebilir seri") for ad, g, s in (("gosterge kutusu", kutu, ayirt_edilebilir(CAKISMAYA, sekilli)), ("sirali gosterge kutusu", sirali, ayirt_edilebilir(CAKISMAYA, sekilli)), ("dogrudan etiketleme", 0, len(SERI))): print(f"{ad:26s} {g:13d} {s:22d}")
sag kenar konumlari (12 satir): [2, 1, 4, 0, 3, 1, 6, 11] 8 serinin 6 tanesinin konumu tekil, 1 cift ayni satira dusuyor duzen gecis sayisi ayirt edilebilir seri gosterge kutusu 16 8 sirali gosterge kutusu 6 8 dogrudan etiketleme 0 8
Ayırt edilebilirlik gerekli koşuldur, yeterli değildir. Sekiz seri birbirinden ayrılıyor olabilir ve okuyucu yine de hangisinin hangi bölge olduğunu bilmez; bunu ancak gösterge kutusuna bakarak öğrenir. Ölçü burada geçiş sayısıdır: bakışın gösterimle gösterge kutusu arasında kaç kez gidip geldiği.
Sıradan bir gösterge kutusu her seri için bir gidiş bir geliş ister; sekiz seri 16 geçiş eder. Gösterge kutusundaki sıra serilerin sağ kenardaki sırasıyla aynı yapıldığında okuyucu tek bir eşlemeyle bütün listeyi çözer ve geçiş 6’ya iner. Kalan dördü, sağ kenarda aynı satıra düşen tek çiftten gelir: 12 satırın çözünürlüğünde güney ile ikinci tarife basamağı ayrılamıyor ve o iki seri tek tek eşleştirilmek zorunda.
Doğrudan etiketleme geçiş sayısını sıfıra indirir, çünkü ad serinin bittiği yere yazılır ve eşleme diye bir iş kalmaz. Sıralama ve doğrudan etiketleme de birer yedekli kodlama katmanıdır; farkları, ayırt edilebilirliği değil tanımayı taşımalarıdır. Üç düzen de aynı sekiz seriyi ayırt ediyor, ama okuyucudan istedikleri iş 16, 6 ve 0.
Tek Gösterimin Tavanı
# tavan.py — kac seri tek gosterimde tasinabilir. AYRIK_BASAMAK = len(range(0, BASAMAK_SAYISI, AYIRMA)) TAVAN = AYRIK_BASAMAK * SEKIL_SAYISI print(f"{BASAMAK_SAYISI} aydinlik basamagindan {AYIRMA} aralikla " f"{AYRIK_BASAMAK} tanesi ayirt edilebilir; {SEKIL_SAYISI} sekille " f"tavan {TAVAN} seri") print("seri ayirt edilebilir parca") for n in (8, 12, 16, 20, 24, 30, 40): kod = [(0, (i % AYRIK_BASAMAK) * AYIRMA, (i // AYRIK_BASAMAK) % SEKIL_SAYISI) for i in range(n)] e = ayirt_edilebilir(kod, sekilli) print(f"{n:4d} {e:17d} {max(1, -(-n // TAVAN)):6d}") print(f"tek gosterimde en cok {TAVAN} seri ayirt edilebiliyor; uzerinde " f"gosterim parcalanmadan seri sayisi geri okunamiyor")
9 aydinlik basamagindan 2 aralikla 5 tanesi ayirt edilebilir; 4 sekille tavan 20 seri seri ayirt edilebilir parca 8 8 1 12 12 1 16 16 1 20 20 1 24 20 2 30 20 2 40 20 2 tek gosterimde en cok 20 seri ayirt edilebiliyor; uzerinde gosterim parcalanmadan seri sayisi geri okunamiyor
Tavan iki sayıdan çıkar. Dokuz aydınlık basamağından iki basamaklık çözünürlükle beşi ayırt edilebilir; dört şekille çarpımı 20‘dir. Yirmiye kadar her seri ayırt ediliyor, 24 seride sayı 20’de kalıyor ve dördü okunamaz oluyor; 40 seride hâlâ 20.
Bu, gösterimin en sert sınırıdır ve tasarımla aşılamaz. Yirmiden çok seri taşınacaksa gösterim parçalanır: seriler tavanı geçmeyen gruplara bölünür ve her grup kendi gösteriminde çizilir. Bedeli, gruplar arası karşılaştırmanın artık aynı gösterimden okunamamasıdır. Konunun kuralı buradan çıkar — bir gösterim, ayırt edilebilir seri sayısı kadar seri taşır; fazlası çizilmiş ama raporlanmamış sayılır.
Özet
- Renk bir ad değil iki sayıdır ve modelde ton ailesi ile aydınlık basamağından oluşur; okuma çözünürlüğü iki basamaktır.
- İki ton ailesini dört aydınlık basamağıyla çaprazlayan varsayılan palet tam çözücüyle sekiz seriyi ayırt ediyor, ton ayrımını okumayan çözücüyle dördünü.
- Şekil kanalı sırayla dağıtıldığında sayı dörtte kalıyor, çünkü şekil dört seride başa dönüyor ve renk çakışmasıyla üst üste geliyor; çakışmaya göre dağıtıldığında iki şekille sekize çıkıyor.
- Ayırt edilebilirlik tanımayı vermez: aynı sekiz seri gösterge kutusuyla 16, sıralı göstergeyle 6, doğrudan etiketlemeyle 0 geçiş istiyor.
- Tek gösterimin tavanı ayırt edilebilir basamak sayısı ile şekil sayısının çarpımıdır; beş basamak ve dört şekille 20 seri, üzerinde gösterim parçalanmak zorundadır.
Sonraki Adım
Sekiz derste tek bir gösterim doğru kuruldu. Soru türüyle kanal eşleştirildi, dağılımın biçimi sayıya indi, taban çizgisi olmayan dilim ölçüldü, ilişkinin okunamaz olduğu nokta bulundu, zaman ekseninde eğim ve mevsim ayrıldı, alan kanalının ağırlığı sayıldı, dört çarpıtma tek tek basıldı ve son olarak kaç serinin ayırt edildiği ölçüldü. Hepsinde ölçü aynıydı: gösterim, okuyucunun geri okuyabildiği sayı kadar doğrudur.
Bir rapor ise tek gösterimden oluşmaz. Okuyucu bir bakışta birden çok sayıyla karşılaşır ve bunlar farklı kanallarla kodlanmış, farklı çözünürlüklerde durur. Sonraki konu ölçüyü buraya taşır: bir bakışta kaç ölçüt geri okunabiliyor, aynı ölçüt kaç yoldan ölçtüğünü oynatmadan oynatılabiliyor ve bir rapor ikinci kez üretildiğinde aynı sayıyı veriyor mu. Okuyucu artık bir sayıyı geri okuyan kişi değil, o sayıyla bir karar veren kişidir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.