Nadesłany przez Marek Madejski, 30 listopada 2018 11:58
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
zlns_gramatyka.py:
# -*- coding: UTF-8 # Zamiana liczby na slowa z polska gramatyka # www.algorytm.org def słownie(liczba:int, skala:str='długa', jeden:bool=True): ''' Zamienia liczbę na zapis słowny w języku polskim. Obsługuje liczby w zakresie do 10^66-1 dla długiej skali oraz 10^36-1 dla krótkiej skali. Możliwe pominięcie słowa "jeden" przy potęgach tysiąca. ''' if (skala == 'długa' and abs(liczba) >= 10**66) or (skala == 'krótka' and abs(liczba) >= 10**36): raise ValueError('Zbyt duża liczba.') jedności = ('', 'jeden', 'dwa', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć') naście = ('', 'jedenaście', 'dwanaście', 'trzynaście', 'czternaście', 'piętnaście', 'szesnaście', 'siedemnaście', 'osiemnaście', 'dziewiętnaście') dziesiątki = ('', 'dziesięć', 'dwadzieścia', 'trzydzieści', 'czterdzieści', 'pięćdziesiąt', 'sześćdziesiąt', 'siedemdziesiąt', 'osiemdziesiąt', 'dziewięćdziesiąt') setki = ('', 'sto', 'dwieście', 'trzysta', 'czterysta', 'pięćset', 'sześćset', 'siedemset', 'osiemset', 'dziewięćset') grupy = [ #kolejne potęgi tysiąca, z formami gramatycznymi ('', '', ''), ('tysiąc', 'tysiące', 'tysięcy'), ] przedrostki = ('mi', 'bi', 'try', 'kwadry', 'kwinty', 'seksty', 'septy', 'okty', 'nony', 'decy') for p in przedrostki: grupy.append((f'{p}lion', f'{p}liony', f'{p}lionów')) if skala == 'długa': grupy.append((f'{p}liard', f'{p}liardy', f'{p}liardów')) if liczba == 0: return 'zero' słowa = [] znak = '' if liczba < 0: znak = 'minus' liczba = -liczba g = 0 while liczba != 0: #Liczba jest dzielona na kolejne potęgi tysiąca, od największej. s = liczba % 1_000 // 100 d = liczba % 100 // 10 j = liczba % 10 liczba //= 1_000 if s == d == j == 0: #brak elementów do nazwania g += 1 continue if d == 1 and j > 0: #łączymy dziesiątki i jedności w -naście n = j d = j = 0 else: n = 0 #wybór formy gramatycznej if j == 1 and s + d + n == 0: forma = 0 elif 2 <= j <= 4: forma = 1 else: forma = 2 słowa = [setki[s], dziesiątki[d], naście[n], jedności[j] if jeden or g == 0 else '', grupy[g][forma]] + słowa g += 1 słowa.insert(0, znak) return ' '.join(s for s in słowa if s) def main(): liczba = int(input("Wpisz liczbę\n")) if abs(liczba) >= 10**9: print(f"W długiej skali: {słownie(liczba, skala='długa')}.") try: print(f"W krótkiej skali: {słownie(liczba, skala='krótka')}.") except ValueError as ex: pass else: print(słownie(liczba)) if __name__ == "__main__": main()