W pliku numery.txt
zapisanych jest 1000 numerów telefonów (jeden numer na wiersz). Numery telefonów są zapisane bez żadnych dodatkowych znaków (tylko cyfry). Maksymalna długość numeru telefonicznego to 15 cyfr. Przykładowe numery w tym pliku to:
8532920888
6105000455181
646454074
Zadania do wykonania:
- Podaj liczbę numerów telefonów, które zawierają co najmniej trzy te same cyfry obok siebie (np. 111, 222 itd.).
- Wszystkie numery telefonów o tej samej liczbie cyfr tworzą jedną "rodzinę". Podaj liczbę niepustych rodzin numerów telefonów.
- Każdą rodzinę numerów telefonów zapisz w oddzielnym wierszu pliku
rodziny_numerow.txt
. Numery każdej rodziny wymień w kolejności rosnącej, oddzielone jedną spacją.
Plik do pobrania - numery.txt
Kod w języku Python
import re
from collections import defaultdict
def czy_powtarzajace_cyfry(numer):
return bool(re.search(r'(\d)\1\1', numer))
def liczba_numerow(nazwa_pliku):
liczba = 0
with open(nazwa_pliku, 'r') as plik:
for linia in plik:
numer = linia.strip()
if czy_powtarzajace_cyfry(numer):
liczba += 1
return liczba
print("Odp. 1: ", liczba_numerow('numery.txt'))
def liczba_rodzin_numerow(nazwa_pliku):
dlugosci = set()
with open(nazwa_pliku, 'r') as plik:
for linia in plik:
numer = linia.strip()
dlugosci.add(len(numer))
return len(dlugosci)
print("Odp. 2: ", liczba_rodzin_numerow('numery.txt'))
def zapisz_rodziny_numerow(nazwa_pliku_we, nazwa_pliku_wy):
rodziny = defaultdict(list)
with open(nazwa_pliku_we, 'r') as plik_we:
for linia in plik_we:
numer = linia.strip()
rodziny[len(numer)].append(numer)
with open(nazwa_pliku_wy, 'w') as plik_wy:
for dlugosc in sorted(rodziny.keys()):
numery = rodziny[dlugosc]
numery.sort()
plik_wy.write(' '.join(numery) + '\n\n')
zapisz_rodziny_numerow('numery.txt', 'rodziny_numerow.txt')
Szczegółowy opis kroków powyższego kodu:
- Importowanie modułów: Moduły
re
icollections
są importowane.re
jest modułem do obsługi wyrażeń regularnych, acollections
zawiera narzędzia do obsługi różnych struktur danych, w tymdefaultdict
. - Definicja funkcji czy_powtarzajace_cyfry: Ta funkcja przyjmuje ciąg znaków (numer) jako argument i sprawdza, czy zawiera on trzy powtarzające się cyfry. Zwraca
True
, jeśli tak, iFalse
w przeciwnym razie. - Definicja funkcji liczba_numerow: Ta funkcja przyjmuje nazwę pliku jako argument. Otwiera plik, czyta każdą linię (która reprezentuje numer telefonu), sprawdza, czy numer zawiera trzy powtarzające się cyfry, i zwiększa licznik, jeśli tak. Zwraca liczbę numerów z trzema powtarzającymi się cyframi.
- Wywołanie funkcji liczba_numerow i wypisanie wyniku: Wywołuje funkcję
liczba_numerow
dla pliku o nazwie 'numery.txt' i wypisuje wynik z etykietą "Odp. 1: ". - Definicja funkcji liczba_rodzin_numerow: Ta funkcja, podobnie jak poprzednia, przyjmuje nazwę pliku jako argument. Otwiera plik, czyta każdą linię (numer telefonu) i dodaje długość numeru do zbioru. Na koniec zwraca liczbę unikalnych długości numerów, co reprezentuje liczbę "rodzin" numerów.
- Wywołanie funkcji liczba_rodzin_numerow i wypisanie wyniku: Wywołuje funkcję
liczba_rodzin_numerow
dla pliku o nazwie 'numery.txt' i wypisuje wynik z etykietą "Odp. 2: ". - Definicja funkcji zapisz_rodziny_numerow: Ta funkcja przyjmuje dwie nazwy plików jako argumenty. Otwiera pierwszy plik, czyta każdą linię (numer telefonu) i dodaje numer do listy w słowniku
rodziny
, gdzie kluczem jest długość numeru. Następnie otwiera drugi plik, sortuje klucze słownika i dla każdej długości zapisuje numer telefonu (sortując numery) do pliku. - Wywołanie funkcji zapisz_rodziny_numerow: Wywołuje funkcję
zapisz_rodziny_numerow
dla plików o nazwach 'numery.txt' i 'rodziny_numerow.txt', odpowiednio jako plik wejściowy i wyjściowy.
Kod w języku C++
Ten kod działa w sposób bardzo podobny do kodu Pythona, ale zamiast korzystać z funkcji wbudowanych w Pythonie, używa podstawowych konstrukcji języka C++ do osiągnięcia tych samych celów.
Opis tego kodu w języku C++, krok po kroku (wraz z numerami linii):
1-5: Importowanie odpowiednich bibliotek, które będą wykorzystywane w kodzie.
7-9: Definicja funkcji czy_powtarzajace_cyfry
. Ta funkcja przyjmuje ciąg znaków jako argument i sprawdza, czy zawiera trzy powtarzające się cyfry zwracając true
jeśli tak i false
w przeciwnym razie.
11-18: Definicja funkcji liczba_numerow
. Ta funkcja otwiera plik o podanej nazwie, czyta linie jako numery telefonów i zwiększa licznik, jeśli numer zawiera trzy powtarzające się cyfry.
20-28: Definicja funkcji liczba_rodzin_numerow
. Ta funkcja otwiera plik o podanej nazwie, czyta linie jako numery telefonów i zwiększa wartość w mapie dla klucza odpowiadającego długości numeru. Zwraca liczbę kluczy w mapie, co jest równoznaczne z liczbą "rodzin" numerów.
30-41: Definicja funkcji zapisz_rodziny_numerow
. Ta funkcja otwiera plik wejściowy, czyta linie jako numery telefonów i dodaje je do wektora w mapie, której kluczem jest długość numeru. Następnie otwiera plik wyjściowy i dla każdej długości zapisuje numery (po posortowaniu) do pliku.
43-49: Funkcja main
, która jest punktem startowym programu. Wywołuje powyższe funkcje i wypisuje odpowiedzi.