usrbinenv python3 implementation of entropy of information https en wikipedia orgwikientropyinformationtheory this method takes path and two dict as argument and than calculates entropy of them param dict param dict return prints 1 entropy of information based on 1 alphabet 2 entropy of information based on couples of 2 alphabet 3 print entropy of hx nxn1 text from random books also random quotes text behind winstons back the voice from the telescreen was still babbling and the overfulfilment calculateprobtext 4 0 6 0 2 0 text the ministry of truthminitrue in newspeak newspeak was the official face in elegant lettering the three calculateprobtext 4 0 5 0 1 0 text had repulsive dashwoods suspicion sincerity but advantage now him remark easily garret nor nay civil those mrs enjoy shy fat merry you greatest jointure saw horrible he private he on be imagine suppose fertile beloved evident through no service elderly is blind there if every no so at own neglected you preferred way sincerity delivered his attempted to of message cottage windows do besides against uncivil delightful unreserved impossible few estimating men favourable see entreaties she propriety immediate was improving he or entrance humoured likewise moderate much nor game son say feel fat make met can must form into gate me we offending prevailed discovery calculateprobtext 4 0 7 0 3 0 what is our total sum of probabilities one length string for each alpha we go in our dict and if it is in it we calculate entropy print entropy two len string for each alpha two in size calculate entropy print second entropy print the difference between them convert text input into two dicts of counts the first dictionary stores the frequency of single character strings the second dictionary stores the frequency of two character strings first case when we have space at start text had repulsive dashwoods suspicion sincerity but advantage now him remark easily garret nor nay civil those mrs enjoy shy fat merry you greatest jointure saw horrible he private he on be imagine suppose fertile beloved evident through no service elderly is blind there if every no so at own neglected you preferred way sincerity delivered his attempted to of message cottage windows do besides against uncivil delightful unreserved impossible few estimating men favourable see entreaties she propriety immediate was improving he or entrance humoured likewise moderate much nor game son say feel fat make met can must form into gate me we offending prevailed discovery calculateprobtext usr bin env python3 implementation of entropy of information https en wikipedia org wiki entropy_ information_theory this method takes path and two dict as argument and than calculates entropy of them param dict param dict return prints 1 entropy of information based on 1 alphabet 2 entropy of information based on couples of 2 alphabet 3 print entropy of h x n xn 1 text from random books also random quotes text behind winston s back the voice from the telescreen was still babbling and the overfulfilment calculate_prob text 4 0 6 0 2 0 text the ministry of truth minitrue in newspeak newspeak was the official face in elegant lettering the three calculate_prob text 4 0 5 0 1 0 text had repulsive dashwoods suspicion sincerity but advantage now him remark easily garret nor nay civil those mrs enjoy shy fat merry you greatest jointure saw horrible he private he on be imagine suppose fertile beloved evident through no service elderly is blind there if every no so at own neglected you preferred way sincerity delivered his attempted to of message cottage windows do besides against uncivil delightful unreserved impossible few estimating men favourable see entreaties she propriety immediate was improving he or entrance humoured likewise moderate much nor game son say feel fat make met can must form into gate me we offending prevailed discovery calculate_prob text 4 0 7 0 3 0 what is our total sum of probabilities one length string for each alpha we go in our dict and if it is in it we calculate entropy entropy formula print entropy two len string for each alpha two in size calculate entropy print second entropy print the difference between them convert text input into two dicts of counts the first dictionary stores the frequency of single character strings the second dictionary stores the frequency of two character strings type ignore type ignore first case when we have space at start text had repulsive dashwoods suspicion sincerity but advantage now him remark easily garret nor nay civil those mrs enjoy shy fat merry you greatest jointure saw horrible he private he on be imagine suppose fertile beloved evident through no service elderly is blind there if every no so at own neglected you preferred way sincerity delivered his attempted to of message cottage windows do besides against uncivil delightful unreserved impossible few estimating men favourable see entreaties she propriety immediate was improving he or entrance humoured likewise moderate much nor game son say feel fat make met can must form into gate me we offending prevailed discovery calculate_prob text
from __future__ import annotations

import math
from collections import Counter
from string import ascii_lowercase


def calculate_prob(text: str) -> None:
    
    single_char_strings, two_char_strings = analyze_text(text)
    my_alphas = list(" " + ascii_lowercase)
    
    all_sum = sum(single_char_strings.values())

    
    my_fir_sum = 0
    
    for ch in my_alphas:
        if ch in single_char_strings:
            my_str = single_char_strings[ch]
            prob = my_str / all_sum
            my_fir_sum += prob * math.log2(prob)  

    
    print(f"{round(-1 * my_fir_sum):.1f}")

    
    all_sum = sum(two_char_strings.values())
    my_sec_sum = 0
    
    for ch0 in my_alphas:
        for ch1 in my_alphas:
            sequence = ch0 + ch1
            if sequence in two_char_strings:
                my_str = two_char_strings[sequence]
                prob = int(my_str) / all_sum
                my_sec_sum += prob * math.log2(prob)

    
    print(f"{round(-1 * my_sec_sum):.1f}")

    
    print(f"{round((-1 * my_sec_sum) - (-1 * my_fir_sum)):.1f}")


def analyze_text(text: str) -> tuple[dict, dict]:
    
    single_char_strings = Counter()  
    two_char_strings = Counter()  
    single_char_strings[text[-1]] += 1

    
    two_char_strings[" " + text[0]] += 1
    for i in range(len(text) - 1):
        single_char_strings[text[i]] += 1
        two_char_strings[text[i : i + 2]] += 1
    return single_char_strings, two_char_strings


def main():
    import doctest

    doctest.testmod()
    
    
if __name__ == "__main__":
    main()