algorytm.org

Implementacja w Python



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Zamiana liczby na słowa z polską gramatyką - Implementacja w Python
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
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()
Dodaj komentarz