# 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:

```python
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ść :)

```python
hex_nums = [hex(n).replace("0x", "").upper() for n in nums]
```

Generujemy słownik z cyframi w systemie szesnastkowym:

```python
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 :)

```python

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:

```python
sorted_results = sorted(results.items(), key=lambda item: item[0])
for key, value in sorted_results:
    print(f"{key}:{value}")
```

## Cały program:

```python
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:

```markdown
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
```

%[https://replit.com/@Onix95/34#3/3_4.py] 

Źródło arkusza: [**https://arkusze.pl/matura-probna-informatyka-2022-grudzien-poziom-rozszerzony/**](https://arkusze.pl/matura-probna-informatyka-2022-grudzien-poziom-rozszerzony/)
