|
@ -176,10 +176,9 @@ def gen_organizatori(rnd, osoby, last_rocnik, users): |
|
|
organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga)) |
|
|
organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga)) |
|
|
return organizatori |
|
|
return organizatori |
|
|
|
|
|
|
|
|
def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size): |
|
|
def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi_problemu): |
|
|
logger.info('Generuji úlohy do čísla (size={})...'.format(size)) |
|
|
|
|
|
|
|
|
|
|
|
# ulohy resene v cisle |
|
|
# Proměnné pro náhodné generování názvů a zadání. |
|
|
jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", |
|
|
jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", |
|
|
"Zákeřná", "Fyzikální"] |
|
|
"Zákeřná", "Fyzikální"] |
|
|
co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč", |
|
|
co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč", |
|
@ -189,43 +188,20 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) |
|
|
ceho = ["všech", "správných", "konstatních", "zelených"] |
|
|
ceho = ["všech", "správných", "konstatních", "zelených"] |
|
|
jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] |
|
|
jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] |
|
|
kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] |
|
|
kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] |
|
|
obor = ["M", "F", "I", "O", "B"] |
|
|
obory = ["M", "F", "I", "O", "B"] |
|
|
reseni = ["to je přece jasné", "triviální", "omlouváme se," |
|
|
|
|
|
"otevřený problém", "neřešitelné", "triviálně triviální", |
|
|
|
|
|
"použitím věty z prvního semestru na matfyzu", |
|
|
|
|
|
"jednoduše pomocí látky z druhého semestru na matfyzu", |
|
|
|
|
|
"netriviální aplikace diferenciálních rovnic", "zadání je vnitřně" |
|
|
|
|
|
"sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli," |
|
|
|
|
|
"tak jste fakt hloupí"] |
|
|
|
|
|
k = 0 |
|
|
|
|
|
for rocnik in rocniky: |
|
|
|
|
|
k+=1 |
|
|
|
|
|
print("Generuji {}. číslo.".format(k)) |
|
|
|
|
|
cisla = rocnik_cisla[k-1] |
|
|
|
|
|
for ci in range(3, len(cisla)+1): # pro všechna čísla |
|
|
|
|
|
resitele_size = round(7/8 * 30 * size) # očekáváný celkový počet řešitelů |
|
|
|
|
|
poc_res = rnd.randint(round(resitele_size/8), round(resitele_size/4)) |
|
|
|
|
|
# dané číslo řeší něco mezi osminou a čtvrtinou všech řešitelů |
|
|
|
|
|
# (náhodná hausnumera, možno změnit) |
|
|
|
|
|
# účelem je, aby se řešení generovala z menší množiny řešitelů a tedy |
|
|
|
|
|
# bylo více řešení od jednoho řešitele daného čísla |
|
|
|
|
|
resitele_cisla = rnd.sample(resitele, poc_res) |
|
|
|
|
|
for pi in range(1, ((size + 1) // 2) + 1): |
|
|
|
|
|
|
|
|
|
|
|
poc_op = rnd.randint(1, 4) # počet opravovatelů |
|
|
|
|
|
poc_oboru = rnd.randint(1, 2) |
|
|
|
|
|
p = Uloha.objects.create( |
|
|
p = Uloha.objects.create( |
|
|
# atributy třídy Problem |
|
|
# atributy třídy Problem |
|
|
nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]), |
|
|
nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]), |
|
|
stav=Problem.STAV_ZADANY, |
|
|
stav=Problem.STAV_ZADANY, |
|
|
zamereni=rnd.sample(["M", "F", "I", "O", "B"], poc_oboru), |
|
|
zamereni=rnd.sample(obory, pocet_oboru), |
|
|
autor=rnd.choice(organizatori), |
|
|
autor=rnd.choice(organizatori), |
|
|
garant=rnd.choice(organizatori), |
|
|
garant=rnd.choice(organizatori), |
|
|
kod=str(pi), |
|
|
kod=str(poradi_problemu), |
|
|
# atributy třídy Uloha |
|
|
# atributy třídy Uloha |
|
|
cislo_zadani=cisla[ci-2-1], |
|
|
cislo_zadani=cisla[poradi_cisla-2-1], |
|
|
cislo_reseni=cisla[ci-1], |
|
|
cislo_reseni=cisla[poradi_cisla-1], |
|
|
cislo_deadline=cisla[ci-1], |
|
|
cislo_deadline=cisla[poradi_cisla-1], |
|
|
max_body = rnd.randint(1, 8) |
|
|
max_body = rnd.randint(1, 8) |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
@ -248,45 +224,93 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) |
|
|
zad = TextNode.objects.create(text = text_zadani) |
|
|
zad = TextNode.objects.create(text = text_zadani) |
|
|
uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad) |
|
|
uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad) |
|
|
p.ulohazadaninode = uloha_zadani |
|
|
p.ulohazadaninode = uloha_zadani |
|
|
otec_syn(cisla[ci-2-1].cislonode, uloha_zadani) |
|
|
otec_syn(cisla[poradi_cisla-2-1].cislonode, uloha_zadani) |
|
|
|
|
|
|
|
|
|
|
|
return p |
|
|
|
|
|
|
|
|
|
|
|
def gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, uloha, pocet_opravovatelu, poradi_cisla): |
|
|
|
|
|
reseni = ["to je přece jasné", "triviální", "omlouváme se," |
|
|
|
|
|
"otevřený problém", "neřešitelné", "triviálně triviální", |
|
|
|
|
|
"použitím věty z prvního semestru na matfyzu", |
|
|
|
|
|
"jednoduše pomocí látky z druhého semestru na matfyzu", |
|
|
|
|
|
"netriviální aplikace diferenciálních rovnic", "zadání je vnitřně" |
|
|
|
|
|
"sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli," |
|
|
|
|
|
"tak jste fakt hloupí"] |
|
|
|
|
|
|
|
|
# generování vzorového textu |
|
|
# Generování vzorového řešení. |
|
|
text_vzoraku = Text.objects.create( |
|
|
text_vzoraku = Text.objects.create( |
|
|
na_web = rnd.choice(reseni), |
|
|
na_web = rnd.choice(reseni), |
|
|
do_cisla = rnd.choice(reseni) |
|
|
do_cisla = rnd.choice(reseni) |
|
|
) |
|
|
) |
|
|
vzorak = TextNode.objects.create(text = text_vzoraku) |
|
|
vzorak = TextNode.objects.create(text = text_vzoraku) |
|
|
uloha_vzorak = UlohaVzorakNode.objects.create(uloha=p, first_child = vzorak) |
|
|
uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak) |
|
|
p.ulohavzoraknode = uloha_vzorak |
|
|
uloha.ulohavzoraknode = uloha_vzorak |
|
|
otec_syn(cisla[ci-1].cislonode, uloha_vzorak) |
|
|
otec_syn(cisla[poradi_cisla-1].cislonode, uloha_vzorak) |
|
|
|
|
|
|
|
|
|
|
|
uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu)) |
|
|
|
|
|
uloha.save() |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
p.opravovatele.set(rnd.sample(organizatori,poc_op)) |
|
|
def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_cisla, resitele): |
|
|
p.save() |
|
|
|
|
|
|
|
|
|
|
|
# generování řešení |
|
|
pocet_reseni = rnd.randint(pocet_resitelu//4, pocet_resitelu * 4) |
|
|
poc_reseni = rnd.randint(poc_res, poc_res * 4) |
|
|
|
|
|
# generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla |
|
|
# generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla |
|
|
for ri in range(poc_reseni): |
|
|
for _ in range(pocet_reseni): |
|
|
#print("Generuji {}-té řešení".format(ri)) |
|
|
#print("Generuji {}-té řešení".format(reseni)) |
|
|
if rnd.randint(1, 10) == 6: |
|
|
if rnd.randint(1, 10) == 1: |
|
|
# cca desetina řešení od více řešitelů |
|
|
# cca desetina řešení od více řešitelů |
|
|
res_vyber = rnd.sample(resitele_cisla, |
|
|
res_vyber = rnd.sample(resitele_cisla, |
|
|
rnd.randint(2, 5)) |
|
|
rnd.randint(2, 5)) |
|
|
else: |
|
|
else: |
|
|
res_vyber = rnd.sample(resitele_cisla, 1) |
|
|
res_vyber = rnd.sample(resitele_cisla, 1) |
|
|
if resitele[0] in res_vyber: |
|
|
if resitele[0] in res_vyber: # speciální řešitel, který nemá žádné body |
|
|
res_vyber.remove(resitele[0]) |
|
|
res_vyber.remove(resitele[0]) |
|
|
|
|
|
|
|
|
|
|
|
# Vytvoření řešení. |
|
|
res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0]) |
|
|
res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0]) |
|
|
# problem a resitele přiřadíme později, ManyToManyField |
|
|
# Problím a řešitele přiřadíme později, ManyToManyField |
|
|
# se nedá vyplnit v create() |
|
|
# se nedá vyplnit v create(). |
|
|
res.resitele.set(res_vyber) |
|
|
res.resitele.set(res_vyber) |
|
|
res.save() |
|
|
res.save() |
|
|
|
|
|
|
|
|
|
|
|
# Vytvoření hodnocení. |
|
|
hod = Hodnoceni.objects.create( |
|
|
hod = Hodnoceni.objects.create( |
|
|
body=rnd.randint(0, p.max_body), |
|
|
body=rnd.randint(0, uloha.max_body), |
|
|
cislo_body=cisla[ci-1], |
|
|
cislo_body=cisla[poradi_cisla - 1], |
|
|
reseni=res, |
|
|
reseni=res, |
|
|
problem=p |
|
|
problem=uloha |
|
|
) |
|
|
) |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size): |
|
|
|
|
|
logger.info('Generuji úlohy do čísla (size={})...'.format(size)) |
|
|
|
|
|
|
|
|
|
|
|
k = 0 |
|
|
|
|
|
for rocnik in rocniky: |
|
|
|
|
|
k += 1 |
|
|
|
|
|
print("Generuji {}. číslo.".format(k)) |
|
|
|
|
|
cisla = rocnik_cisla[k - 1] |
|
|
|
|
|
for ci in range(3, len(cisla) + 1): # pro všechna čísla |
|
|
|
|
|
resitele_size = round(7/8 * 30 * size) # očekáváný celkový počet řešitelů |
|
|
|
|
|
poc_res = rnd.randint(resitele_size//8, resitele_size//4) |
|
|
|
|
|
# dané číslo řeší něco mezi osminou a čtvrtinou všech řešitelů |
|
|
|
|
|
# (náhodná hausnumera, možno změnit) |
|
|
|
|
|
# účelem je, aby se řešení generovala z menší množiny řešitelů a tedy |
|
|
|
|
|
# bylo více řešení od jednoho řešitele daného čísla |
|
|
|
|
|
resitele_cisla = rnd.sample(resitele, poc_res) |
|
|
|
|
|
for pi in range(1, ((size + 1) // 2) + 1): # počet problémů |
|
|
|
|
|
|
|
|
|
|
|
poc_op = rnd.randint(1, 4) # počet opravovatelů |
|
|
|
|
|
poc_oboru = rnd.randint(1, 2) |
|
|
|
|
|
|
|
|
|
|
|
# Generování zadání úlohy a UlohaZadaniNode, |
|
|
|
|
|
# přivěšení pod dané číslo |
|
|
|
|
|
p = gen_zadani_ulohy(rnd, cisla, organizatori, poc_oboru, ci, pi) |
|
|
|
|
|
# Generování vzorového řešení |
|
|
|
|
|
gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, p, poc_op, ci) |
|
|
|
|
|
# Generování řešení a hodnocení k úloze |
|
|
|
|
|
gen_reseni_ulohy(rnd, cisla, p, poc_res, ci, |
|
|
|
|
|
resitele_cisla, resitele) |
|
|
|
|
|
|
|
|
return |
|
|
return |
|
|
|
|
|
|
|
@ -482,8 +506,10 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) |
|
|
rocnik=rocnik, |
|
|
rocnik=rocnik, |
|
|
poradi=str(int(cislo.poradi) + 2), |
|
|
poradi=str(int(cislo.poradi) + 2), |
|
|
) |
|
|
) |
|
|
# Pokud není číslo pro vzorák, tak se dá do posledního čísla (i kdyby tam mělo být zadání i řešení...) |
|
|
# Pokud není číslo pro vzorák, tak se dá do posledního čísla |
|
|
# Tohle sice umožňuje vygenerovat vzorák do čísla dávno po konci témátka, ale to nám pro jednoduchost nevadí. |
|
|
# (i kdyby tam mělo být zadání i řešení...) |
|
|
|
|
|
# Tohle sice umožňuje vygenerovat vzorák do čísla dávno po konci témátka, |
|
|
|
|
|
# ale to nám pro jednoduchost nevadí. |
|
|
if len(cislo_se_vzorakem) == 0: |
|
|
if len(cislo_se_vzorakem) == 0: |
|
|
cislo_se_vzorakem = cisla[-1] |
|
|
cislo_se_vzorakem = cisla[-1] |
|
|
else: |
|
|
else: |
|
@ -505,7 +531,8 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) |
|
|
tema = tema_node.tema |
|
|
tema = tema_node.tema |
|
|
|
|
|
|
|
|
# Pokud už témátko skončilo, žádné úložky negenerujeme |
|
|
# Pokud už témátko skončilo, žádné úložky negenerujeme |
|
|
# FIXME: Bylo by hezčí, kdyby se čísla předávala jako Cislo a ne jako int v té trojici (start, konec, tema) |
|
|
# FIXME: Bylo by hezčí, kdyby se čísla předávala jako Cislo a ne |
|
|
|
|
|
# jako int v té trojici (start, konec, tema) |
|
|
if not temata[int(tema.kod)-1][1] >= int(cislo_se_vzorakem.poradi): |
|
|
if not temata[int(tema.kod)-1][1] >= int(cislo_se_vzorakem.poradi): |
|
|
continue |
|
|
continue |
|
|
|
|
|
|
|
@ -581,8 +608,10 @@ def gen_novinky(rnd, organizatori): |
|
|
kdy = ["Zítra bude", "10. 10. 2020 bude", "V prosinci bude", "V létě bude"] |
|
|
kdy = ["Zítra bude", "10. 10. 2020 bude", "V prosinci bude", "V létě bude"] |
|
|
|
|
|
|
|
|
for i in range(5): |
|
|
for i in range(5): |
|
|
text_novinky = " ".join([rnd.choice(kdy),rnd.choice(kde),rnd.choice(jake),rnd.choice(co)]) |
|
|
text_novinky = " ".join([rnd.choice(kdy), rnd.choice(kde), rnd.choice(jake), |
|
|
novinka = Novinky.objects.create(id=i,autor=rnd.choice(organizatori),text=(text_novinky+", těšíme se na vás!"),zverejneno=rnd.choice([True,False])) |
|
|
rnd.choice(co)]) |
|
|
|
|
|
novinka = Novinky.objects.create(id=i,autor=rnd.choice(organizatori), |
|
|
|
|
|
text=(text_novinky+", těšíme se na vás!"),zverejneno=rnd.choice([True,False])) |
|
|
novinka.save() |
|
|
novinka.save() |
|
|
return |
|
|
return |
|
|
|
|
|
|
|
|