anagramma201010.py
1    def kiir(ssz, szoveg):
2        print('{}. feladat - {}'.format(ssz, szoveg))
3    
4    # ------------------------------------------------------------------------------
5    # 1. Kérjen be a felhasználótól egy szöveget, majd határozza meg, hogy
6    #    hány különböző karakter található a szövegben! A darabszámot és a
7    #    karaktereket írja ki a képernyőre!
8    # ------------------------------------------------------------------------------
9    kiir(1, 'Karakterszámlálás')
10   
11   def kul_kar(sz):
12       volt_mar = set()  # sz szó betűinek halmaza lesz
13       i = 0
14       while i < len(sz):  # végignézzük a szó betűit
15           if sz[i] not in volt_mar:  # ha adott betű még nem eleme a halmaznak,
16               volt_mar.add(sz[i])  # akkor hozzáadjuk
17           i += 1
18       return len(volt_mar)  # a halmaz elemszáma a különböző betűk száma
19   
20   sz = input('Kérek egy szót: ')
21   print('Különböző karakterek száma: ', kul_kar(sz))
22   
23   # ------------------------------------------------------------------------------
24   # 2. Olvassa be a szotar.txt állományból a szavakat, és a következő feladatok
25   #   megoldása során ezekkel dolgozzon! Amennyiben nem tudja beolvasni az
26   #   állományból a szavakat, akkor az első 10 szóval dolgozzon!
27   # ------------------------------------------------------------------------------
28   kiir(2, 'Fájl beolvasása...')
29   
30   fbe = open('szotar.txt', 'r')
31   
32   szavak = []
33   for szo in fbe:
34       szo = szo.rstrip()
35       szavak.append(szo)
36   
37   fbe.close()
38   
39   # ------------------------------------------------------------------------------
40   # 3. Az állományból beolvasott szavakat alakítsa át úgy, hogy minden szó
41   #    karaktereit egyenként tegye ábécérendbe! Az így létrehozott szavakat
42   #    írja ki az abc.txt állományba az eredeti állománnyal egyező sorrendben!
43   # ------------------------------------------------------------------------------
44   kiir(3, 'Szavak rendezése, fájlírás (abc.txt)')
45   
46   
47   def szorendezo(sz):
48       return ''.join(sorted(sz))
49   
50   # sorted hatására rendezett listává esik szét a szó
51   # join hatására újra szöveggé áll össze
52   # pl.:   sz="bla" --> sorted: ['a','b','l']
53   #       join: 'abl'  
54   
55   fki = open('abc.txt', 'w')
56   
57   for szo in szavak:
58       print(szorendezo(szo), file=fki)
59   
60   fki.close()
61   
62   # ------------------------------------------------------------------------------
63   # 4. Kérjen be a felhasználótól két szót, és döntse el, hogy a két szó
64   #    anagramma-e! Ha azok voltak, írja ki a képernyőre az „Anagramma” szót,
65   #    ha nem, akkor pedig a „Nem anagramma” szöveget!
66   # ------------------------------------------------------------------------------
67   kiir(4, 'Két szó anagramma-e?')
68   
69   
70   def anagramma(sz1, sz2):
71       sz1 = szorendezo(sz1)
72       sz2 = szorendezo(sz2)
73       return sz1 == sz2
74   
75   sz1 = input('Kérem az első szót: ')
76   sz2 = input('Kérem a második szót: ')
77   
78   if anagramma(sz1, sz2):
79       print('Anagramma')
80   else:
81       print('Nem anagramma')
82   
83   # ------------------------------------------------------------------------------
84   # 5. Kérjen be a felhasználótól egy szót! A szotar.txt állomány szavaiból
85   #   keresse meg a szó anagrammáit (a szót önmagát is annak tekintve)! Ha van
86   #   találat, azokat egymás alá írja ki a képernyőre, ha nem volt találat,
87   #   akkor írja ki a „Nincs a szótárban anagramma” szöveget!
88   # ------------------------------------------------------------------------------
89   kiir(5, 'Anagrammák keresése adott szóhoz')
90   
91   sz = input('Kérek egy szót: ')
92   db = 0
93   for szo in szavak:
94       if anagramma(sz, szo):
95           print(szo)
96           db += 1
97   if db == 0:
98       print('Nincs a szótárban anagramma!')
99   
100  # ------------------------------------------------------------------------------
101  # 6. Határozza meg, hogy a szotar.txt állományban melyik a leghosszabb
102  #    szó! Ha több, ugyanannyi karakterből álló leghosszabb szó volt, akkor az
103  #    ugyanazokat a karaktereket tartalmazó szavakat (amelyek egymás
104  #    anagrammái) közvetlenül egymás alá írja ki! A feltételnek megfelelő
105  #    összes szó pontosan egyszer szerepeljen a kiírásban!
106  # ------------------------------------------------------------------------------
107  kiir(6, 'Leghosszabb szavak, anagrammák')
108  
109  # rendezés hossz szerint, azon belül abc sorrendbe
110  
111  for i in range(0, len(szavak) - 1):
112      for j in range(i + 1, len(szavak)):
113          if len(szavak[i]) < len(szavak[j]) or len(szavak[i]) == len(szavak[j]) and szavak[i] > szavak[j]:
114              szavak[i], szavak[j] = szavak[j], szavak[i]
115  
116  maxh = len(szavak[0])
117  print('Leghosszabb szó: ', szavak[0], end=' ')
118  i = 1
119  while len(szavak[i]) == maxh:
120      while anagramma(szavak[i - 1], szavak[i]):
121          print(szavak[i])
122          i += 1
123      i += 1
124  
125  # ------------------------------------------------------------------------------
126  # 7. Rendezze a szotar.txt állományban lévő szavakat a karakterek száma szerint
127  #    növekvő sorrendbe! Az egyforma hosszúságú és ugyanazokat a karaktereket
128  #    tartalmazó szavak (amelyek egymás anagrammái) szóközzel elválasztva
129  #    ugyanabba a sorba kerüljenek! Az egyforma hosszúságú, de nem ugyanazokat
130  #    a karaktereket tartalmazó szavak külön sorba kerüljenek! A különböző
131  #    hosszúságú szavakat egy üres sorral különítse el egymástól! Az így
132  #    rendezett szavakat írja ki a rendezve.txt állományba!
133  # ------------------------------------------------------------------------------
134  kiir(7, 'Rendezés, anagammák, fájlírás')
135  
136  fki = open('rendezve.txt', 'w')
137  
138  szavak2 = []  # másolat: anagrammavizsgálathoz
139  
140  for i in range(len(szavak)):
141      szavak2.append(szorendezo(szavak[i]))
142  
143  # rendezzük a másolatot szavak hossza szerint növekvő sorrendbe,
144  # és azon belül abc-rendbe egyszerű cserés rendezéssel
145  for i in range(0, len(szavak2) - 1):
146      for j in range(i + 1, len(szavak2)):
147          if len(szavak2[i]) > len(szavak2[j]) or len(szavak2[i]) == len(szavak2[j]) and szavak2[i] > szavak2[j]:
148              szavak2[i], szavak2[j] = szavak2[j], szavak2[i]
149              # a szavak eredeti állapotát együtt rendezzük az "anagrammás" másolattal
150              szavak[i], szavak[j] = szavak[j], szavak[i]
151  
152  # fájlbaírás
153  N = len(szavak)
154  for i in range(N):
155      if i < N - 1 and len(szavak[i]) == len(szavak[i + 1]):  # ha azonos  a szavak hossza
156          if szavak2[i] == szavak2[i + 1]:  # és anagrammák is, akkor egy sorba mehetnek
157              print(szavak[i], end=' ', file=fki)
158          else:
159              print(szavak[i], file=fki)
160      else:
161          if i == N - 1:  # utolsó szó kiírása
162              print(szavak[i], file=fki)
163          else:
164              print(szavak[i], file=fki)  # az i+1. már különböző hosszú,
165              print('', file=fki)  # így az i. írása után üres sort is írunk
166  
167  fki.close()