KABAFORCEGeliştirici KabaOS'u edinin

Algoritmalar · 82 satır

Asal eleği

Eratosthenes eleği: 120 sayılık ızgarada asal olmayanlar tur tur söner.

Önizleme · 0.6.0 — dil 1.0 öncesidir; sözdizimi ve kütüphane değişebilir. Buradaki her örnek derlenerek sınanır.

Çalıştırın

Uçbirim
kabalang calistir 04_asal_elek.kbl

Kaynak kod

04_asal_elek.kbl
# ╔═══════════════════════════════════════════════════════════════════╗
# ║  ERATOSTHENES ELEĞİ — asal olmayanları eleyerek asalları bul      ║
# ║  Her tur bir asalın katlarını söndürür; ızgara canlı güncellenir. ║
# ╚═══════════════════════════════════════════════════════════════════╝
kullan kaba.sistem

SINIR = 120

fonksiyon renkli(yazi: metin, renk: sayi):
    don "\033[38;5;" + metin(renk) + "m" + yazi + "\033[0m"

fonksiyon ekrani_temizle():
    yazdir("\033[H\033[2J")

fonksiyon izgarayi_ciz(elek, aktif: sayi, elenen: sayi):
    ekrani_temizle()
    yazdir("")
    yazdir(renkli("   ERATOSTHENES ELEĞİ — 2'den " + metin(SINIR) + "'e", 81))
    yazdir(renkli("   " + "─".tekrarla(62), 238))
    satir = "   "
    sutun = 0
    i = 2
    iken i <= SINIR:
        kutu = metin(i)
        eger i < 10:
            kutu = "  " + kutu
        degilse:
            eger i < 100:
                kutu = " " + kutu
        eger elek[i] == 0:
            satir = satir + renkli(kutu + " ", 236)
        degilse:
            eger i == aktif:
                satir = satir + renkli(kutu + " ", 220)
            degilse:
                satir = satir + renkli(kutu + " ", 78)
        sutun = sutun + 1
        eger sutun == 15:
            yazdir(satir)
            satir = "   "
            sutun = 0
        i = i + 1
    eger sutun > 0:
        yazdir(satir)
    yazdir(renkli("   " + "─".tekrarla(62), 238))
    yazdir(renkli("   elenen: " + metin(elenen) + "    şu an eleyen asal: " + metin(aktif), 245))
    uyu(420)

# ── Elek ──────────────────────────────────────────────────────────────
# 1 = hâlâ aday, 0 = elendi. Bir asalın katları asal olamaz.
elek = []
i = 0
iken i <= SINIR:
    elek.ekle(1)
    i = i + 1

elenen = 0
p = 2
iken p * p <= SINIR:
    eger elek[p] == 1:
        kat = p * p
        iken kat <= SINIR:
            eger elek[kat] == 1:
                elek[kat] = 0
                elenen = elenen + 1
            kat = kat + p
        izgarayi_ciz(elek, p, elenen)
    p = p + 1

izgarayi_ciz(elek, 0, elenen)

asallar = 0
i = 2
iken i <= SINIR:
    eger elek[i] == 1:
        asallar = asallar + 1
    i = i + 1

yazdir("")
yazdir(renkli("   ✓ " + metin(SINIR - 1) + " sayıdan " + metin(elenen) + " tanesi elendi, " + metin(asallar) + " asal kaldı.", 78))
yazdir(renkli("     Eleme yalnız p*p'den başlar: küçük katlar zaten elenmiştir.", 245))
yazdir("")