Przejdź do treści

olski.werdykt.cennik

Cennik: co w tej gramatyce jest nacechowane i ile to kosztuje.

Koszt porządkuje czytania i werdyktu nie rusza; czym jest i czego nie robi, mówi docs/disambiguation.md#kolejność-czytań-ustala-koszt-i-późne-domknięcie.

Produkcja nazywa tutaj pozycje, którymi płaci, a ceny nie wypisuje (olski.grammar.Production.koszty). Kalibracja jest przez to edycją jednego pliku, a czytelnik strony dostaje pod czytaniem nie liczbę bez nazwy, tylko to, za co ono płaci (witryna/skrypt.js).

Cena jest deklaracją o polszczyźnie, a nie częstością wziętą z korpusu: mówi, że jedno czytanie tego samego napisu jest zwyklejsze od drugiego. Nikt jej nie zmierzył; czym się ją mierzy i czego ten pomiar dziś nie widzi, mówi wpis o kolejności czytań w todo/pomiar.md.

Pozycje dzielą się na dwie rodziny i różni je to, dokąd cena sięga. Pozycję produkcji płaci ciało i płaci ją na miejscu: rozstrzyga ona między ciałami jednej pozycji lasu, a nad rodzicem już nie waży (test_koszt_produkcji_nie_sumuje_się_do_kosztu_rodzica). Pozycję morfologii płaci forma, a cena idzie w górę, aż trafi na ciała, które się nią różnią (koszt_morfologii w olski/parse/las.py).

OKOLICZNIK = 'okolicznik' module-attribute

PRZESTAWIENIE = 'przestawienie' module-attribute

WYSUNIĘTY_ORZECZNIK = 'wysunięty orzecznik' module-attribute

CZASOWNIK_PRZED_PODMIOTEM = 'czasownik przed podmiotem' module-attribute

OPUSZCZONY_PODMIOT = 'opuszczony podmiot' module-attribute

WYSUNIĘTE_DOPEŁNIENIE_BEZOKOLICZNIKA = 'wysunięte dopełnienie bezokolicznika' module-attribute

FORMA_SPOZA_REJESTRU = 'forma spoza rejestru' module-attribute

CENNIK = {PRZESTAWIENIE: 100, OKOLICZNIK: 100, WYSUNIĘTY_ORZECZNIK: 100, CZASOWNIK_PRZED_PODMIOTEM: 100, OPUSZCZONY_PODMIOT: 200, WYSUNIĘTE_DOPEŁNIENIE_BEZOKOLICZNIKA: 200, FORMA_SPOZA_REJESTRU: 100} module-attribute

cena(nazwa)

Cena pozycji o tej nazwie.

Nazwa nieznana podnosi wyjątek, zamiast kosztować zero: literówka w deklaracji przemilczana zdejmowałaby cenę i nie byłoby tego widać po niczym poza kolejnością czytań.

Source code in olski/cennik.py
69
70
71
72
73
74
75
76
77
78
79
def cena(nazwa: str) -> int:
    """Cena pozycji o tej nazwie.

    Nazwa nieznana podnosi wyjątek, zamiast kosztować zero:
    literówka w deklaracji przemilczana zdejmowałaby cenę
    i nie byłoby tego widać po niczym poza kolejnością czytań.
    """
    try:
        return CENNIK[nazwa]
    except KeyError:
        raise KeyError(f"cennik nie ma pozycji o nazwie {nazwa!r}") from None

suma(koszty)

Ile płaci ten, kto płaci tymi pozycjami; pozycja powtórzona płaci tyle razy.

Source code in olski/cennik.py
82
83
84
def suma(koszty: Iterable[str]) -> int:
    """Ile płaci ten, kto płaci tymi pozycjami; pozycja powtórzona płaci tyle razy."""
    return sum(cena(nazwa) for nazwa in koszty)

rachunek(koszty)

Te pozycje policzone — nazwa wraz z liczbą wystąpień — w kolejności CENNIK.

Nazwy przychodzą tu sprawdzone, bo płaci nimi produkcja (olski.grammar.Production) albo kwalifikator (olski/rejestr.py), a obie drogi wołają wcześniej cena.

Source code in olski/cennik.py
87
88
89
90
91
92
93
94
95
def rachunek(koszty: Iterable[str]) -> tuple[tuple[str, int], ...]:
    """Te pozycje policzone — nazwa wraz z liczbą wystąpień — w kolejności :data:`CENNIK`.

    Nazwy przychodzą tu sprawdzone, bo płaci nimi produkcja
    (:class:`olski.grammar.Production`) albo kwalifikator (``olski/rejestr.py``),
    a obie drogi wołają wcześniej :func:`cena`.
    """
    ile = Counter(koszty)
    return tuple((nazwa, ile[nazwa]) for nazwa in CENNIK if nazwa in ile)