Egy társaságban többen vannak, akik különböző helyekről ismerik egymást, de vannak szép számmal olyanok is, akik még sohasem találkoztak. Az ismeretségek kölcsönösek.

Zoltán nagyon érdeklődik a gráfok iránt, ezért gyorsan feltérképezi a társaságot az ismeretségek alapján. Egy papírra feljegyzi az egymást ismerők monogramját (pl. KP NZ JJ SA …).

A leírásban párok fordulnak elő, tehát KP és NZ ismeri egymást, JJ és SA is ismeri egymást. A monogramok minden esetben az angol ABC két nagybetűjéből állnak, és nincs két azonos monogrammal jelölt személy. Minden ismeretség csak egyszer kerül feljegyzésre, és teljesen véletlenszerű, hogy melyik fél szerepel azon elsőként vagy másodikként.

Zoltán később több kérdést is megfogalmazott, amely az ismeretségekre vonatkozik. Mivel a társaság elég nagy, ezért úgy gondolta, hogy a kérdésekre előbb választ kaphat, ha számítógépes programot készít. Segítsünk neki, oldjuk meg a következő feladatokat, a kiírás a minta alapján történjen.

  1. A párok monogramjai a parok.txt szöveges állomány egy sorában vannak egy-egy szóközzel elválasztva, legföljebb 500 monogram, azaz 250 ismeretség. Olvassuk be és tároljuk el a további feldolgozáshoz a monogramokat és az ismertségeket.
  2. Adjuk meg, hogy hány személy szerepel az állományban.
  3. Adjuk meg, hogy melyik személynek van a legtöbb ismerőse a társaságban. Ha több ilyen személy van, akkor elegendő az egyiket megadni: írjuk ki a monogramját és ismerőseinek számát.
  4. Kérjük be egy személy monogramját, és adjuk meg a monogramjaik ABC-sorrendjében az ismerőseit.
  5. Kérjük be egy másik személy monogramját, és adjuk meg, hogy hány közös ismerőse van az előző feladatban bekért személlyel.
  6. Határozzuk meg, hogy kik azok, akik nem ismerik az előbb bekért személyt és annak egyetlen ismerősét sem. Az eredményt írd ki egy szövegfájlba, aminek a fájlneve az 5. feladatban bekért személy, vagyis ha pl. FR volt a bekért személy, akkor txt a fájl neve.

Letöltés: parok.txt

 

Minta:

1. feladat
A parok.txt állományt beolvastam.

 

2. feladat
Az állományban 193 személy szerepel.

 

3. feladat
A legtöbb ismerőse MH személynek van, szám szerint 11

 

4. feladat
Adja meg egy személy monogramját: CV
CV ismerősei: FR HG KM OG QP TM VE

 

5. feladat
Kérem adja meg egy másik személy azonosítóját: HG
CV és HG közös ismerőseinek a száma 2

 

6. feladat
HG.txt fájl elkészült.

 

A HG.txt mintája

LE US VL XH VO FQ CG PM DD SA BZ MV …

 

 

Megoldás

# 1. feladat
with open('parok.txt') as fajl:
     forras = fajl.read().splitlines()[0].split(' ')
# a forras listában egyenként vannak az emberek
adatok = [forras[i:i+2] for i in range(0,len(forras),2)]
print('1. feladat\nA parok.txt állományt beolvastam.')

# 2. feladat
print('\n2. feladat\nAz állományban',len(set(forras)),'személy szerepel.')

# Mivel többször előfordul az ismerősök kutatása, érdemes készíteni egy függvényt
# ismerosok() bemenete: kinek az ismerőse, kimenete: az ismerősök listája, mindenki csak egyszer
def ismerosok(kinek):
     ismeretsegek = []
     for adat in adatok:
          if adat[0]==kinek:
               ismeretsegek.append(adat[1])
          if adat[1]==kinek:
               ismeretsegek.append(adat[0])
     ismeretsegek = list(set(ismeretsegek))
     return ismeretsegek

# 3. feladat
max_ismerettseg, max_ember = 0, ''
for ember in set(forras):
     lista = ismerosok(ember)
     if len(lista) > max_ismerettseg:
          max_ismerettseg = len(lista)
          max_ember = ember
print('\n3. feladat\nA legtöbb ismerőse',max_ember,'személynek van, szám szerint',max_ismerettseg)

# 4. feladat
print('\n4.feladat')
szemely = input('Adja meg egy személy monogramját: ')
lista1 = ismerosok(szemely)
print(szemely,'ismerősei:',' '.join(sorted(lista1)))
#print(lista1)

# 5. feladat
print('\n5.feladat')
szemely1 = input('Kérem adja meg egy másik személy azonosítóját: ')
ism1 = ismerosok(szemely1)
#print(ism1)
kozos = []
for ember in ism1:
     if ember in lista1:
          kozos.append(ember)
#print(kozos)
print(szemely,'és',szemely1,'közös ismerőseinek a száma',len(kozos))

# 6. feladat
# lista1-ben vannak az előbb bekért személy ismerősei; bővíteni kell az ismerősök ismerőseivel
lista2 = [ember for ember in ism1] # ebbe gyűjtjük az ismerősöket és az ismerősök ismerőseit
for ember in ism1: # összegyűjtjük az ismerősök ismerőseit
     lista2.extend(ismerosok(ember))
lista2 = set(lista2) # hátha van benne ismétlődés…
nem_ismeros = set([ember for ember in forras if ember not in lista2])
fajl = open(szemely1+'.txt','w')
print(' '.join(nem_ismeros),file=fajl)
fajl.close()
print('\n6. feladat\n'+szemely1+'.txt fájl elkészült.')

 

News Reporter