Matura próbna informatyka 2022 grudzień (poziom rozszerzony) - zadanie 3.4

Treść zadania:
Dla każdej liczby z pliku liczby.txt znajdź jej reprezentację w systemie szesnastkowym. Dla każdej cyfry szesnastkowej podaj, ile razy występuje ona łącznie w zapisach szesnastkowych wszystkich liczb z pliku liczby.txt.
Rozwiązanie:
Najpierw odczytajmy liczby w systemie dziesiętnym z pliku:
with open("dane/liczby_przyklad.txt", "r") as file:
nums = [int(n) for n in file.readlines()]
Następnie przekształcamy liczbę z systemu dziesiętnego na szesnastkowy, pamiętając, żeby usunąć przedrostek 0x - domyślnie funkcja hex dodaje go przed wlaściwą liczbą, np.: 0x123 . Metoda upper spowoduje zamienienie małych liter na duże, np.: a -> A itd. Wszystkie te przekształcenia można byłoby przerzucić do momentu, w którym odczytujemy dane z pliku, ale to może poprawić trochę czytelność :)
hex_nums = [hex(n).replace("0x", "").upper() for n in nums]
Generujemy słownik z cyframi w systemie szesnastkowym:
hex_digits = "0123456789ABCDEF"
results = {num: 0 for num in hex_digits}
domyślnie ustawiając im zero, jako wartość :)
Następne linijki to czysta formalność - dla każdej liczby i dla każdej jej cyfry zliczamy jej łączne wystąpienie. results.get(digit, 0) zapewnia pobranie wartości pod danym kluczem, a jeśli ta nie występuje, domyślnie będzie to 0 - tak dla pewności :)
for num in hex_nums:
for digit in num:
results[digit] = results.get(digit, 0) + 1
Pod kolejne klucze ("0", "1"... , "E", "F") przypisujemy wartość danego klucza + 1, żeby zliczyć wystąpienie kolejnej cyfry.
Teoretycznie od tego momentu mamy już rozwiązanie, ale możemy je jeszcze posortować i wyświetlić w oczekiwanym formacie, zamiast robić to ręcznie:
sorted_results = sorted(results.items(), key=lambda item: item[0])
for key, value in sorted_results:
print(f"{key}:{value}")
Cały program:
with open("dane/liczby_przyklad.txt", "r") as file:
nums = [int(n) for n in file.readlines()]
hex_nums = [hex(n).replace("0x", "").upper() for n in nums]
hex_digits = "0123456789ABCDEF"
results = {num: 0 for num in hex_digits}
for num in hex_nums:
for digit in num:
results[digit] = results.get(digit, 0) + 1
sorted_results = sorted(results.items(), key=lambda item: item[0])
for key, value in sorted_results:
print(f"{key}:{value}")
Wynik:
0:32
1:26
2:37
3:31
4:43
5:25
6:28
7:23
8:38
9:28
A:45
B:33
C:29
D:23
E:44
F:10
Źródło arkusza: https://arkusze.pl/matura-probna-informatyka-2022-grudzien-poziom-rozszerzony/




