import random

PROVES = ["Uvedťe a dokažte vztah mezi elementárními řádkovými operacemi a soustavami rovnic.",
          "Vyslovte a dokažte větu o jednoznačnosti volných a bazických proměnných.",
          "Vyslovte a dokažte Frobeniovu větu.", "Vyslovte a dokažte větu o vztahu mezi řešeními Ax = b a Ax = 0.",
          "Uvedťe a dokažte větu popisující všechna řešení Ax = b.",
          "Vyslovte a dokažte větu o ekvivalentních definicích regulárních matic.",
          "Vyslovte a dokažte větu o znaménku složené permutace.",
          "Uvedťe a dokažte větu charakterizující, kdy Zn je těleso.", "Vyslovte a dokažte malou Fermatovu větu.",
          "Vyslovte a dokažte větu o průniku vektorových prostorů.",
          "Vyslovte a dokažte větu o ekvivalentních definicích lineárního obalu.",
          "Vyslovte a dokažte tvrzení o mohutnostech lineárně nezávislé množiny a generující množiny.",
          "Uvedťe a dokažte Steinitzovu větu o výměně (včetně lemmatu a jeho důkazu, pokud jej potřebujete).",
          "Vyslovte a dokažte větu o dimenzi průniku vektorových prostorů.",
          "Vyslovte a dokažte větu o vektorových prostorech souvisejících s maticí A (včetně lemmatu, které se týká",
          "součinu matic a jeho důkazu, pokud jej potřebujete).", "Vyslovte a dokažte větu o dimenzi jádra matice.",
          "Vyslovte a dokažte větu o jedinečnosti lineárního zobrazení.",
          "Vyslovte a dokažte větu o řešení rovnice s lineárním zobrazením.",
          "Vyslovte a dokažte pozorování o matici složeného lineárního zobrazení.",
          "Vyslovte a dokažte větu o charakterizaci isomorfismu mezi vektorovými prostory.",
          "Zformulujte problém o počtu sudých podgrafů a vyřešte jej.",
          "Zformulujte problém o množinových systémech s omezeními na mohutnosti a vyřešte jej.",
          "Zformulujte problém o dělení obdélníku na čtverce a vyřešte jej."]
DEFINITIONS = ["Definujte rozšířenou matici soustavy.", "Definujte elementární řádkové operace.",
               "Definujte odstupňovaný tvar matice.", "Napište pseudokód pro Gaussovu eliminaci.",
               "Definujte pivot a to slovně i formálně.", "Definujte volné a bazické proměnné.",
               "Definujte hodnost matice.", "Definujte jednotkovou matici.", "Definujte transponovanou matici.",
               "Definujte symetrickou matici.", "Definujte maticový součin.", "Definujte inverzní matici.",
               "Definujte regulární matici.", "Definujte singulární matici.", "Definujte binární operaci.",
               "Definujte komutativní a asociativní binární operace.", "Definujte neutrální prvek.",
               "Definujte inverzní prvek.", "Definujte grupu.", "Definujte permutaci.", "Definujte permutační matici.",
               "Definujte transpozici.", "Definujte inverzi v permutaci.", "Definujte znaménko permutace.",
               "Definujte permutační matici.", "Definujte těleso.", "Definujte charakteristiku tělesa.",
               "Definujte vektorový prostor.", "Definujte podprostor vektorového prostoru.",
               "Definujte lineární kombinaci.", "Definujte lineární obal (podprostor generovaný množinou).",
               "Definujte řádkový prostor matice a to slovně i formálně pomocí maticového součinu.",
               "Definujte sloupcový prostor matice a to slovně i formálně pomocí maticového součinu.",
               "Definujte jádro matice.", "Definujte lineárně nezávislé vektory.",
               "Definujte bázi vektorového prostoru.", "Definujte dimenzi vektorového prostoru.",
               "Definujte vektor souřadnic.", "Definujte lineární zobrazení.",
               "Definujte afinní prostor a jeho dimenzi.", "Definujte jádro lineárního zobrazení.",
               "Definujte matici lineárního zobrazení.", "Definujte matici přechodu.",
               "Definujte isomorfismus vektorových prostorů"]
OVERVIEWS = ["Přehledově sepište, co víte o elementárních řádkových operacích a Gaussově eliminaci.",
             "Přehledově sepište, co víte o řešení homogenních a nehomogenních soustav lineárních rovnic.",
             "Přehledově sepište, co víte o maticových operacích.",
             "Přehledově sepište, co víte o regulárních a singulárních maticích.",
             "Přehledově sepište, co víte o binárních operacích a jejich vlastnostech.",
             "Přehledově sepište, co víte o (obecných) grupách.", "Přehledově sepište, co víte o permutačních grupách.",
             "Přehledově sepište, co víte o tělesech.",
             "Přehledově sepište, co víte o vektorových prostorech a jejich podprostorech.",
             "Přehledově sepište, co víte o vektorových prostorech určených maticí A.",
             "Přehledově sepište, co víte o lineární závislosti.",
             "Přehledově sepište, co víte o bázích vektorových prostorů.",
             "Přehledově sepište, co víte o lineárních zobrazeních a jejich maticích."]

NUMBER_OF_DEFINITIONS = 3

NUMBER_OF_OVERVIEWS = NUMBER_OF_PROVES = 1


def select_random(options, number_of_questions, question_number):
    for i in range(number_of_questions):
        rand = random.randint(0, len(options) - 1)
        definition = options[rand]
        options.pop(rand)
        print(f"{question_number}. " + definition)
        question_number += 1
    return question_number


def generate():
    question_number = select_random(DEFINITIONS, NUMBER_OF_DEFINITIONS, 1)
    question_number = select_random(PROVES, NUMBER_OF_PROVES, question_number)
    select_random(OVERVIEWS, NUMBER_OF_OVERVIEWS, question_number)


if __name__ == "__main__":
    generate()