PNG  IHDR!@ PLTE>O`jqv xtEXtPage
Finish the round 1 - metalympiada
git clone git://metalympiada.org/
Log | Files | README | LICENSE

commit 70547a43d57539ef691b20c928733244d8a2d850
parent 4f13c7c5f3018c9a2e923eded8e2027ee1863d4b
Author: Metalympiáda <metalympiada@matfyz.cz>
Date:   Wed, 26 Jun 2024 01:51:20 +0200

Finish the round 1

Diffstat:
Aarchive/1/problems | 23+++++++++++++++++++++++
Aarchive/1/solutions | 8++++++++
Mmetatron13.scm | 136++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Mroutes.scm | 21+++++++++++----------
4 files changed, 170 insertions(+), 18 deletions(-)

diff --git a/archive/1/problems b/archive/1/problems @@ -0,0 +1,23 @@ +Ivana ovládol prúd nekontrolovateľnej zúrivosti na autorov Metalympiády, pretože sa oneskorilo zverejnenie zadania ďalšieho kola. Autori už zažili aj príjemnejšiu situáciu ako túto. Vzhľadom na obavy z jej ďalšej eskalácie a z Ivanovej kolekcie raketometov mu radšej obratom zvestovali radu:`V ďalšom kole budú opäť existovať správne odpovede na úlohy Metalympiády. Uff... a číselné odpovede na úlohy s prvočíselným poradovým čilsom budú prvočísla...' +Na to Ivan odvetil:`To mi je na milú Jarmilu, vy oplanci sopľaví!' +Nuž teda autori boli nútení ďalej napovedať. `Riešením prvej úlohy bude počet riešiteľových číselných odpovedí na toto kolo Metalympiády s párnou hodnotou.' +`Nateraz vám odpúšťam. Trúby...' +~Boris cestoval vlakom, kde sa mu zjavil boh. Poprosil boha o zdelenie tajomstva vesmíru, v ktorom sa nachádza a boh naňho prehovoril. +`Toto je (2, 3, 1).' +Borisovi bolo ihneď jasné, že pre túto úlohu mu zdelené poznanie nebude relevantné a poslal boha k čertom. Povzdychol si. `Ach, keby mi bol radšej povedal súčet číselných odpovedí na úlohy tohto kola Metalympiády!' +Aké je hodnota čísla, ktoré by sa Boris radšej dozvedel od boha? +~Vladislav sa dozvedel správne odpovede na úlohy predošlého kola Metalypiády. Nadšene, s vidinou výhry v očiach sa ich chystal odoslať ako odpovede pre toto kolo Metalympiády. Na jeho šťastie ho zahriakol Ivan. `Zadrž, ty kikimor! Veď tieto zadania sú iné textové reťazce ako minule a budú mať iné rozlúštenie. Ako máš zaručené, že množiny správnych odpovedí na ne majú čo i len prienik s minulými správnymi odpoveďami?' +Poraďte Vladislavovi poradové číslo úlohy, kde je tento prienik neprázdny. +~Vladislav chce udržiavať krok s digitálnou transformáciou spoločnosti a preto sa rozhodol, že sa naučí programovať. V praxi používané programovacie jazyky mu ale pripadali príliš zložité, tak si vzal kus kremeňa a vypálil doň vlastný procesor VLAD 2000. +Má len 2 registre, A a B, ktoré vedia uchovať ľubovoľný počet znakov a vypísať ich na výstup. +Tiež preň fungujú len 2 inštrukcie: malé písmeno zapíše nasledovný reťazec ohraničený z oboch strán znakom ' alebo zo začiatku *" a z konca "* do príslušného registra a veľké písmeno vypíše obsah tohto registra. Teda napr. program a'meta'b*"vl'ad"*AB vypíše metavl'ad. +Napíšte program pre VLAD 2000 dlhý aspoň 1 znak, ktorý vypíše svoj zdrojový kód. +~Jolana si prečítala zadania zvyšných úloh a rozhodla sa, že sa tiež zapojí do ich tvorby. Vymyslela nasledovnú:"Uveďte poradové číslo úlohy, zo zadania ktorej vyplýva riešenie tejto úlohy." +Vyriešte Jolaninu úlohu. +~(4, 6, 1)(3, 2, 13)(2, 4, 8)(4, 1, 5)(8, 2, 8)(6, 1, 6)(2, 6, 12)(3, 1, 9)(3, 2, 16)(3, 5, 14)(1, 3, 5)(3, 5, 3) +~Boris vyvinul revolučnú umelú inteligenciu MetatronGPT postavenú na blockchaine, ktorá vie rozhodovať o pravdivosti slovenských viet. Nie vždy rozozná pravdivú vetu, ale vždy, keď nejakú vetu rozozná ako pravdivú, je takou naozaj. +Napíšte pravdivú vetu, ktorú MetatronGPT nerozozná ako pravdivú. +~Vladislav si kúpil lístok na prehliadku trikov slávneho kúzelníka Metapokustóna. Vystúpenie sa Metapokustón rozhodol začať svojim slávnym číslom s hypnotizovaním leva. +Metapokustón doviezol klietku s levom a otvoril ju. Lev vyskočil vonku a zakúsol sa kúzelníkovi do ľavej ruky. Kúzelník začal kričať a dav začal tlieskať. +Lev začal Metapokustóna hádzať po zemi, zatiaľ čo kričal:`Pomóc! Toto nie je show! Som vážne zranený! Je to hrozná bolesť! Prosím, pomôžte mi niekto!' Nakoniec kúzelníka lev celého zožral. +Vladislav bol trikom veľmi ohromený, ale stále nemohol prísť na to, v čom trik spočíval. Vie však, že kúzelníci svoje tajomstvá nikdy neprezrádzajú. diff --git a/archive/1/solutions b/archive/1/solutions @@ -0,0 +1,8 @@ +Počet vašich odpovedí s párnou hodnotou (vrátane tejto odpovede). +~Pre riešenie x musí platiť Σ + x = x, kde Σ je súčet číselných odpovedí na zvyšné úlohy Metalympiády. Špeciálne musí byť Σ rovné 0 a odpoveď konzistentná s úlohou 1 (teda napr. x prvočíslo). +~Môže ísť o úlohy 1, 3 alebo 8. Keďže podľa zadania 1 musí ísť o prvočíslo, ostáva možnosť 3. +~Takýto program je napr. a*"*b'a*"'BAb'"'BA"*b'a*"'BAb'"'BA +~Riešenie tejto úlohy vyplýva z jej zadania. Odpoveďou je 5. +~Trojice predstavujú poradové čísla úlohy tohto kola Metalymiády, vety v ňom a slova v nej. Po rozlúštení dostávame "Napíšte pre úlohu s číslom 6 tohto kola Metalympiády rozlúštenie jej zadania", čo je jej riešením. (Slovo (6, 1, 6) odkazuje samo na seba a musí byť doplnené tak, aby zadanie dávalo zmysel, teda ako 6.) +~Napr. "Túto vetu MetatronGPT nerozozná ako pravdivú". +~Správna odpoveď je ľubovoľná. Aby ale existovalo riešenie úlohy dva, musí ísť o mínus súčet všetkých číselných odpovedí, až na odpovede na úlohy 2 a 8. diff --git a/metatron13.scm b/metatron13.scm @@ -1,4 +1,5 @@ -(use-modules (db)) +(use-modules (db) + (srfi srfi-1)) (define (preprocess answer) (string-delete #\. (string-downcase answer))) @@ -41,14 +42,16 @@ (equal? s "desat") (equal? s "deset")) 10) - (else 0))) + ((equal? s "nula") + 0) + (else #f))) (define (str->number s) (let ((decimal (string->number s))) (if decimal decimal (slovakoczech->number s)))) (define (count-decimal-digits n) - (if (eq? n 0) + (if (or (not n) (eq? n 0)) 0 (+ 1 (count-decimal-digits (quotient n 10))))) @@ -56,7 +59,7 @@ (let* ((results (map (lambda (i) 0.0) (iota (length a)))) (answers (map preprocess a)) (numerical (map str->number answers)) - (sum (apply + numerical))) + (sum (apply + (map (lambda (n) (if n n 0)) numerical)))) (begin (if (eq? (modulo (count-decimal-digits (list-ref numerical 0)) 2) 1) (list-set! results 0 1.0)) @@ -73,10 +76,10 @@ (if (eq? (list-ref numerical 4) 1) (list-set! results 4 1.0)) (if (or (eq? (list-ref numerical 5) 1) - (equal? (list-ref answers 2) "jednociferné") - (equal? (list-ref answers 2) "jednociferne")) + (equal? (list-ref answers 5) "jednociferné") + (equal? (list-ref answers 5) "jednociferne")) (list-set! results 5 1.0)) - (if (eq? (list-ref numerical 6) (* 2 (apply + numerical))) + (if (eq? (list-ref numerical 6) (* 2 sum)) (list-set! results 6 1.0)) (if (eq? (list-ref numerical 7) 10) (list-set! results 7 1.0)) @@ -86,6 +89,122 @@ (list-set! results 9 1.0)) results))) +(define (string-get str i) + (if (< i (string-length str)) + (string-ref str i) + #f)) + +(define (substr str i) + (if (< i (string-length str)) + (substring/read-only str i) + "")) + +(define (string-find-iter s t i) + (if (< i (string-length s)) + (if (string-prefix? t (substring/read-only s i)) + i + (string-find-iter s t (+ i 1))) + #f)) + +(define (string-find s t) + (string-find-iter s t 0)) + +(define (vlad2000-iter input i a b output) + (let ((c (string-get input i)) + (str-lit (lambda (input i) + (let ((end (cond ((eq? (string-get input i) #\') + (list (string-index (substr input (+ i 1)) + #\') + 1)) + ((and (eq? (string-get input i) #\*) + (eq? (string-get input (+ i 1)) #\")) + (list (string-find (substr input (+ i 2)) + "\"*") + 2)) + ((list #f 0))))) + (if (car end) + (list (+ i (car end) (* 2 (cadr end))) + (substring input + (+ i (cadr end)) + (+ i (cadr end) (car end)))) + #f))))) + (if (< i (string-length input)) + (cond ((eq? c #\a) + (let ((lit (str-lit input (+ i 1)))) + (if lit + (vlad2000-iter input (car lit) (cadr lit) b output) + #f))) + ((eq? c #\b) + (let ((lit (str-lit input (+ i 1)))) + (if lit + (vlad2000-iter input (car lit) a (cadr lit) output) + #f))) + ((eq? c #\A) + (vlad2000-iter input (+ i 1) a b (string-append output a))) + ((eq? c #\B) + (vlad2000-iter input (+ i 1) a b (string-append output b))) + (#f)) + output))) + +(define (vlad2000 input) + (vlad2000-iter input 0 "" "" "")) + +(define (in-list? answer l) + (fold (lambda (a v) (or v (equal? a answer))) #f l)) + +(define answers-1-6 + (list "napíšte pre úlohu s číslom šesť tohto kola metalympiády rozlúštenie jej zadania" + "napíšte pre úlohu s číslom 6 tohto kola metalympiády rozlúštenie jej zadania" + "napíšte pre úlohu s číslom 6 tohoto kola metalympiády rozluštěnie jej zadania")) + +(define answer-1-6-half "napište pre úlohu s číslom (6, 1, 6) tohto kola metalympiády rozlúštenie jej zadania") + +(define answers-1-7 + (list "metatrongpt neoznačí túto vetu za pravdivú" + "metatrongpt nerozozná túto vetu ako pravdivú" + "metatrongpt nerozozná tuto vetu ako pravdivú" + "metatrongpt túto vetu nerozozná ako pravdivú" + "túto vetu metatrongpt nerozozná ako pravdivú" + "tuto vetu metatrongpt nerozozná ako pravdivú" + "tuto pravdivú vetu metatrongpt nerozozná ako pravdivú" + "tato veta bude vyhodnocena podle umelé iteligencie metatrongpt jako veta nepravdiva")) + +(define (eval-round1 a) + (let* ((results (map (lambda (i) 0.0) (iota (length a)))) + (answers (map preprocess a)) + (numerical (map str->number answers)) + (even-count (apply + (map (lambda (n) (if n (modulo (+ n 1) 2) 0)) + numerical))) + (sum (apply + (map (lambda (n) (if n n 0)) numerical)))) + (begin + (if (eq? (list-ref numerical 0) even-count) + (list-set! results 0 1.0)) + (if (eq? (list-ref numerical 1) sum) + ; primality test + (if (or (eq? (list-ref numerical 1) 2) + (eq? (list-ref numerical 1) 3) + (eq? (list-ref numerical 1) 5)) + (list-set! results 1 1.0) + (list-set! results 1 0.5))) + (if (eq? (list-ref numerical 2) 3) + (list-set! results 2 1.0) + (if (or (eq? (list-ref numerical 2) 1) + (eq? (list-ref numerical 2) 8)) + (list-set! results 2 0.5))) + (if (and (< 0 (string-length (list-ref a 3))) + (equal? (list-ref a 3) (vlad2000 (list-ref a 3)))) + (list-set! results 3 3.0)) + (if (eq? (list-ref numerical 4) 5) + (list-set! results 4 1.0)) + (if (in-list? (list-ref answers 5) answers-1-6) + (list-set! results 5 1.0) + (if (equal? (list-ref answers 5) answer-1-6-half) + (list-set! results 5 0.5))) + (if (in-list? (list-ref answers 6) answers-1-7) + (list-set! results 6 1.0)) + (list-set! results 7 1.0) + results))) + (define (eval-user-round user rnd evaluator) (let ((answers (select-answers-content user rnd))) (if answers @@ -95,5 +214,6 @@ (define users (select-all-users)) (for-each (lambda (u) (begin - (eval-user-round u 0 eval-round0))) + (eval-user-round u 0 eval-round0) + (eval-user-round u 1 eval-round1))) users) diff --git a/routes.scm b/routes.scm @@ -20,12 +20,12 @@ (define site-name "Metalympiáda") (define round-name "Domáce kolo 2023/24") (define deadline "letného slnovratu 2024") -(define after-deadline #f) +(define after-deadline #t) (define announcement (if after-deadline "Čoskoro pribudnú nové zadania. Deadline bol do " "Riešenia je možné posielať do ")) -(define current-round 1) +(define current-round 2) (define footer `(footer "Stránka Metalympiády je slobodný softvér pod licenciou AGPL: " @@ -127,13 +127,14 @@ (strong (@ (class "start")) "Správna odpoveď:") ,solution) ,(if answers - `(p (@ (class "text")) - (strong (@ (class "start")) - "Vaša odpoveď:") - ,(let* ((a (list-ref answers index)) - (v (vector-ref a 1))) - `(,(vector-ref a 0) - (strong (@ (class "start " + (let* ((a (list-ref answers index)) + (v (vector-ref a 1))) + `((p (@ (class "text")) + (strong (@ (class "start")) + "Vaša odpoveď:") + ,(vector-ref a 0)) + (p (@ (class "text")) + (strong (@ (class "start " ,(if (> v 0.5) "good" "bad"))) @@ -224,7 +225,7 @@ (if (and so-far a) (append so-far (list a)) #f))) '() (iota (length problems)))) - (submitted (if answers + (submitted (if (and answers (not after-deadline)) (insert-answers answers user round) `(#f "Neplatné odpovede")))) (render (lambda () (problem-page (if (car submitted) #f (cadr submitted)) user)))))
^>xIDATx]lWvgFh@ )f%C\:f>Xjʭ@CFF9lEDm@!FXIu] ZMb"Q=ΐJď>̇$?ܹR_xG^F0" aDF }D+hw6mh#lw#ER²7 % +*bâa1(1 >`I1<ڏ ) Z! n0Jȇi{jh!i>3b١xʹa(?Lqhňv0$ lGGakK0D4lBՖPl`]y*ʏ[>0~ŐP'06BwTЏ;)6@,1P~AߙQjخ2 m(hcЄ֊≰r6^%>axwךֶ9g&{솞s"7tp2w)0%Vݲݿ]A↩[Xf~kBdLNR 'դ靾Grjק\Ɵ8vLLPbQMx._d˅[5FVxenvlirE-Vɵվ!&(N^'8}q_QkA,o1 A>l^u5'|A?bFG+ PƤZd[ba&^]xX P^ YhfMѨoRfMfr}@+]% ~`5{qv, qZ`g WŹ5n5?PNWfwQ @@dvLOP^sBo2ڙբ'0z6}Kbkh0A- O8׆Xܷ,l#c8tlZ@-:սϫ)2-%Q4]k›{y%h^9Vg-ĬTFӖ}NΉ$L(--త{j[l?M?G" /V>8^Wgas\^v]1םs qg#x{xP?q2lb7W}aptfB7GS8`tP_g7S&dd,JhVηa{lh~ `\:߆gD{+2۶ԟB\'(~\P* @L +8gTN6 F@38n]YKWŭ;zLnگDhć|j8ؓRz6NpnѳfzLȜ PGnOO뺝-0pJYnM;)>J6@Ȼ'4haaCEIq]̆[YR 7t`{$s2DzW.s ?Dg(ԺM vN$C# +`3ݵGMܧGv[ /~c]{x3\ٷ)e&U"V8&[: )ZIϝN({Kq!s*ݴ_>>1DN DG^B3NѲX'@Lb%wV$Z9tK#muq[c]54Y~d =KJ!o?eY3w`UC㊱`NG.6 3{SMJ8 /2]ݧN %if7/AVa/dS݆ɺ jgi0<]`޹r''C*!~6\, +a(cw7rFd0RB9Z`h-Sj&ȆLM,[2pw5Z9F[2eӎ3(ZmrT>5B|I/+Imc]yC#O_NMMX+c[I'ȪG b[/6~r7uq Vp3Q*cSEрdyZ?*E5f߳8@A*ǡEwӰ_hQ?&#|{DO ?wuzJ  :<)iی ^*^2dT[J(d?xzK?X x '0U#tn/"JxEP8- z|6f-kɝ-'WIF>'YJETkv|g P]̶ };Y_y<ƛuTiR} ob-,gw< djЌKJ62nFkuq8&T>WuE _Jޱ/'Fn j4"(V}u!gd8枎xr2fwz(GqD]`48{ȄGPm1~"ŀQՄ^yaJ?6o[kOw&b˪$^y^^J w~ȷA lɦbRҟ>ofD]T;<m@ɇ[z,㦹Մ#Q.νv  [y_dS =9Ec(Coƍ wqΝW#KQ}^[G@;Zu-p @hq~CP$`7rkEeP[L2iG'& ߓxz!N h-%]߿Dʮ:/1Uۏe]HIG@vXHt]y#(Y\HҵaBC%)su?'?*.-N!r>Ydh'jsÒvZ.9@eɧ-0MWOdT=oՓ3LN#m"nX6tl y[4*^6kqƆ|v8)k?w" ~1B5܇6N@5oڊ~4HKARO9oӰg,tnF}UB`Z[(<`g׸b^AA1j+m 4aSh1n,WPU *8(Fѩ5!6:~S,PsՋgr+*ηE"sWax0cg s #жWq+g7w^XT?_ůaia-}  tp &Yf!qmVOUGUmC:O<_ `oz:zѐ91QT>Y_tsI%)eFb.֒ akv` su2?l]+@'RV"fwrc@ʈrH3y Gu7 ۩La'-2R0{rY@8OhȄW][;jz jzڒ'i^Pq@wEMmzl%Z7x~쨁y }ud%<]O.pLeҒDw*=Ki UO_M!o~]8h.$ns5LTo[t MTmTw3$jvL5ns*RX퇓eXZч۲gV_\npT?5~PqkHNDfImn}5lmylUL|Gxiz6`6}^XO& /tn]:^Pg{2);pJ0%BcSZ1tk.-) (.ӉXؿQ=W9T&nG(׾?y(b砻堽`ޝ 0JU6+dY[_.iKVį 2mgXpqԖcE{XGqw6w*I[8W8`5d{4lV!1r,IBZd-8|z(^T{0#30 ?jKE+?rW]Quq 2L :Ҽ wm, }[-Ʊ!HM5*137:~ Tp?+>MP;DA4Gc Z\1!\3`"V-mCe5h O/ ej;G< ?q/mIENDB`